⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit2.pas

📁 噪声对通信系统的影响试验程序 模仿各种噪声对不同通信系统的影响 具有很强的学习价值
💻 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 + -