📄 unit2.pas
字号:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Buttons;
var
FlagMode :boolean;
Fdc:integer;
ModSignal :array[0..131072] of double;
ModAddNoise: array[0..131072] of double;
ModNoise:array [0..131072] of double;
ModGs: ^byte;
type
TBpskFrm = class(TForm)
GroupBox3: TGroupBox;
GroupBox5: TGroupBox;
BitBtn8: TBitBtn;
BitBtn7: TBitBtn;
BitBtn9: TBitBtn;
BitBtn10: TBitBtn;
BitBtn11: TBitBtn;
BitBtn12: TBitBtn;
GroupBox8: TGroupBox;
Label1: TLabel;
MemoNoise: TMemo;
GroupBox6: TGroupBox;
MemoBase: TMemo;
GroupBox7: TGroupBox;
Memo2: TMemo;
Chart1: TChart;
Series1: TLineSeries;
SignalModulate: TRadioGroup;
GroupBox1: TGroupBox;
Chart2: TChart;
GroupBox2: TGroupBox;
Chart3: TChart;
Series2: TLineSeries;
Series3: TLineSeries;
Label2: TLabel;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure BitBtn8Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn7Click(Sender: TObject);
procedure BitBtn9Click(Sender: TObject);
procedure BitBtn10Click(Sender: TObject);
procedure BitBtn11Click(Sender: TObject);
procedure BitBtn12Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
BpskFrm: TBpskFrm;
implementation
uses Unit1,publicdata, Unit4;
function gaussdll(u:double;dalta:double):pointer;cdecl;external 'dll5.dll';
{$R *.dfm}
procedure TBpskFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
BpskFrm:=nil;
end;
procedure TBpskFrm.FormDestroy(Sender: TObject);
begin
BpskFrm:=nil;
end;
procedure TBpskFrm.BitBtn8Click(Sender: TObject);
var
i:integer;
begin
series1.Clear;
length:=10;
if (MemoBase.text = '') then
begin
Messagedlg('请输入基带信号的长度',mtconfirmation,[mbOK],0);
BaseFrm.ActiveControl:=MemoBase;
end;
if(MemoBase.text <> '') then
begin
Length := strtoint(MemoBase.Text);
for i:=1 to length do
begin
BaseSignal[i] := random(2);
series1.AddXY(i,BaseSignal[i],'',clred);
series1.AddXY(i+1,BaseSignal[i],'',clred);
end;
end;
end;
procedure TBpskFrm.FormCreate(Sender: TObject);
begin
MemoBase.Text :='';
MemoNoise.Text :='';
Fdc :=20;
FlagMode :=false;
end;
procedure TBpskFrm.BitBtn7Click(Sender: TObject);
var
i:integer;
j:integer;
begin
if SignalModulate.Items.Strings[SignalModulate.ItemIndex]='BPSK调制' then
series2.Clear;
begin
for i:=1 to length do
begin
for j:=1 to Fdc do
begin
ModSignal[(i-1)*Fdc + j] := sin(pi*BaseSignal[i]+2*pi*j/Fdc);
series2.AddXY((i-1)*Fdc + j,ModSignal[(i-1)*Fdc + j] ,'',clred);
end;
end;
end;
if SignalModulate.Items.Strings[SignalModulate.ItemIndex]='QPSK调制' then
begin
series2.Clear;
MemoBase.Text :='';
FlagMode :=true;
for i:=1 to length div 2 do
begin
for j:=1 to Fdc do
begin
ModSignal[(i-1)*Fdc + j] := sin(pi*BaseSignal[2*i-1]+2*pi*j/Fdc);
end;
end;
for i:=1 to length div 2 do
begin
for j:=1 to Fdc do
begin
ModSignal[(i-1)*Fdc + j] := ModSignal[(i-1)*Fdc + j]+cos(pi*BaseSignal[2*i]+2*pi*j/Fdc);
series2.AddXY((i-1)*Fdc + j,ModSignal[(i-1)*Fdc + j] ,'',clred);
end;
end;
end;
end;
procedure TBpskFrm.BitBtn9Click(Sender: TObject);
var
i:integer;
gaussnum:double;
sigma:double;
temp1:^byte;
begin
sigma := strtofloat(MemoNoise.Text);
ModGs:=gaussdll(0,sigma);
temp1:=ptr(integer(ModGs));
temp1:=ptr(integer(temp1)+10);
for i:=1 to 131072 do
begin
temp1:=ptr(integer(temp1)+1);
gaussnum :=(temp1^-127)/127;
gaussnum :=gaussnum * sigma*3 ;
ModNoise[i] := gaussnum;
end;
if SignalModulate.Items.Strings[SignalModulate.ItemIndex]='BPSK调制' then
begin
series3.Clear;
for i:=1 to length *Fdc do
begin
ModAddNoise[i] :=ModNoise[i] + ModSignal[i];
series3.AddXY(i,ModAddNoise[i],'',clred);
end;
end;
if SignalModulate.Items.Strings[SignalModulate.ItemIndex]='QPSK调制' then
begin
series3.Clear;
for i:=1 to (length div 2)*Fdc do
begin
ModAddNoise[i] :=ModNoise[i] + ModSignal[i];
series3.AddXY(i,ModAddNoise[i],'',clred);
end;
end;
end;
procedure TBpskFrm.BitBtn10Click(Sender: TObject);
var
i:integer;
j:integer;
ModCheck :double;
temp1: array[0..40]of double;
temp2: array[0..40]of double;
begin
for i:=1 to Fdc do
begin
temp1[i] :=sin(2*pi*i/Fdc);
end;
for i:=1 to Fdc do
begin
temp2[i] :=cos(2*pi*i/Fdc);
end;
if SignalModulate.Items.Strings[SignalModulate.ItemIndex]='BPSK调制' then
begin
for i:=1 to length do
begin
ModCheck :=0;
for j:=1 to 10 do //循环的值设长度长一些,则判决强度就强
begin
ModCheck :=ModCheck+ModAddNoise[(i-1)*Fdc+j]*temp1[j];
end;
if ModCheck>0 then
begin
ReceiveSignal[i] :=0;
end
else
begin
ReceiveSignal[i] :=1;
end;
end;
end;
if SignalModulate.Items.Strings[SignalModulate.ItemIndex]='QPSK调制' then
begin
for i:=1 to (length div 2) do
begin
ModCheck :=0;
for j:=1 to 10 do
begin
ModCheck :=ModCheck+ModAddNoise[(i-1)*Fdc+j]*temp1[j];
end;
if ModCheck > 0 then
ReceiveSignal[2*i-1] :=0
else
ReceiveSignal[2*i-1] :=1;
Modcheck :=0;
for j:=1 to 10 do
begin
ModCheck :=ModCheck+ModAddNoise[(i-1)*Fdc+j]*temp2[j];
if ModCheck > 0 then
ReceiveSignal[2*i] :=0
else
ReceiveSignal[2*i] :=1;
end;
end;
end;
end;
procedure TBpskFrm.BitBtn11Click(Sender: TObject);
begin
if (ErrorFrm = nil) then
ErrorFrm:=TErrorFrm.Create(nil);
ErrorFrm.Show;
end;
procedure TBpskFrm.BitBtn12Click(Sender: TObject);
begin
close;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -