|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
|  | 
| 
			 
			#1  
			
			
			
			
		 | |||
| 
 | |||
|  Амплитудная модуляция и демодуляция сигналов в системе связи Всем доброго времени суток. У меня проблема: преподаватель дал задание сделать модуляцию и демодуляцию исходного сигнала. Дал процедуры и скриншоты того что должно быть: 1. Генерация сигнала Код: procedure TfrMain.GenSignal(var arr: array of single); var i: integer; begin for i:=low(arr) to high(arr) do arr[i]:=a_sig*(sin(i*f_sig*tau*2*pi)); end; 2. Генерация шума Код: procedure TfrMain.GenNoise(var arr: array of single; apply: boolean = false); var i: integer; begin if apply then for i:=low(arr) to high(arr) do arr[i]:=arr[i] + a_noise * (2 * random - 1) else for i:=low(arr) to high(arr) do arr[i]:=a_noise * (2 * random - 1) end; 3. Модуляция сигнала Код: procedure TfrMain.ModulateIt; var i: integer; begin for i := 0 to BUFF_SIZE - 1 do begin modulated[i]:=(signal[i] + a_sig + a_sig) * (sin(i*f_mod*tau*2*pi)); end; end; 4. Демодуляция сигнала Код: procedure TfrMain.Demodulate; var i: integer; s: single; begin for i := 0 to BUFF_SIZE - 1 do begin demodulated[i]:=abs(spoiled[i]); end; s:=0; for i := 0 to BUFF_SIZE - 1 do begin if s < demodulated[i] then s:=demodulated[i]; demodulated[i]:=s - a_sig - a_sig; s:=s * 0.98; end; end; исходный.JPG модулированный.JPG Демодулированный.JPG Код с учетом этих процедур я написал, но увы и ах - результат даже близко не похож на то, что на скриншотах. Код: unit Main;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TeEngine, TeeProcs, Chart, ExtCtrls, Series, Mask,
  DBCtrlsEh;
type
  TF_Main = class(TForm)
    Panel1: TPanel;
    Chart1: TChart;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    CheckBox1: TCheckBox;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    DBNumberEditEh1: TDBNumberEditEh;
    DBNumberEditEh2: TDBNumberEditEh;
    DBNumberEditEh3: TDBNumberEditEh;
    DBNumberEditEh4: TDBNumberEditEh;
    DBNumberEditEh5: TDBNumberEditEh;
    Xmt: TFastLineSeries;
    Modul: TFastLineSeries;
    DeModul: TFastLineSeries;
    Label6: TLabel;
    Label7: TLabel;
    DBNumberEditEh6: TDBNumberEditEh;
    DBNumberEditEh7: TDBNumberEditEh;
    procedure FormShow(Sender: TObject);
    procedure GenSignal(var arr: array of single);
    procedure GenNoise(var arr: array of single; apply: boolean = false);
    procedure ModulateIt;
    procedure Demodulate;
    procedure RadioButton1Click(Sender: TObject);
    procedure ClearGraph;
    procedure RadioButton2Click(Sender: TObject);
    procedure RadioButton3Click(Sender: TObject);
  private
    { Private declarations }
    const razm=1000;//секннд= razm/sub_part
          sub_part=100;//для сотых
  public
    { Public declarations }
    modulated,demodulated,spoiled,signal:array [0..razm] of single;
    a_sig,a_noise,f_sig,tau,f_mod:Single;
    BUFF_SIZE:Integer;
  end;
var
  F_Main: TF_Main;
implementation
{$R *.dfm}
procedure TF_Main.ClearGraph;
begin
  Xmt.Clear;
  modul.Clear;
  DeModul.Clear;
  a_noise:=DBNumberEditEh5.Value;//сила шума ok
  a_sig:=DBNumberEditEh2.Value;  //амплитуда сигнала ok
  f_sig:=DBNumberEditEh5.Value;  //фаза сигнала
  tau:=DBNumberEditEh3.Value;    //частота дискретизации
  f_mod:=DBNumberEditEh4.Value;  //частота модуляции ok
  BUFF_SIZE:=DBNumberEditEh6.Value;
end;
procedure TF_Main.Demodulate;
var
i: integer;
s: single;
begin
  for i := 0 to BUFF_SIZE - 1 do
    begin
      demodulated[i]:=abs(spoiled[i]);
    end;
  s:=0;
  for i := 0 to BUFF_SIZE - 1 do
    begin
      if s < demodulated[i] then s:=demodulated[i];
      demodulated[i]:=s - a_sig - a_sig;
      s:=s * 0.98;
    end;
  //Принцип алгоритма в огибании модуля модулированного сигнала.
  //Значение пика заносится во временную переменную, которая уменьшается
  //с течением времени. Значения данной переменной заносятся в массив
  //для демодулированного сигнала.
end;
procedure TF_Main.FormShow(Sender: TObject);
begin
  ClearGraph;
end;
procedure TF_Main.GenNoise(var arr: array of single; apply: boolean);
var i: integer;
begin
  if apply then
    for i:=low(arr) to high(arr) do
      arr[i]:=arr[i] + a_noise * (2 * random - 1)
  else
    for i:=low(arr) to high(arr) do
      arr[i]:=a_noise * (2 * random - 1)
  //Используемые параметры a_noise – сила шума.
end;
procedure TF_Main.GenSignal(var arr: array of single);
var i: integer;
begin
  for i:=low(arr) to high(arr) do
    arr[i]:=a_sig*(sin( (i/sub_part)*f_sig*tau*2*pi));
  //Используемые параметры a_sig – амплитуда сигнала, f_sig – фаза сигнала, tau
end;
procedure TF_Main.ModulateIt;
var
i: integer;
begin
  for i := 0 to BUFF_SIZE - 1 do
    begin
      modulated[i]:=(signal[i] + a_sig + a_sig) * (sin((i/sub_part)*f_mod*tau*2*pi));
    end;
  //Накладываются исходный сигнал на сигнал молуляции
end;
procedure TF_Main.RadioButton1Click(Sender: TObject);
var i:integer;  //исходный сигнал
begin
  ClearGraph;
  GenSignal(signal);
  for I:=0 to razm do
    Xmt.AddXY(i/sub_part,Signal[i]);
end;
procedure TF_Main.RadioButton2Click(Sender: TObject);
var i:integer;  //модулированный сигнал
begin
  ClearGraph;
  GenSignal(signal);
  for I:=0 to razm do
    Xmt.AddXY(i/sub_part,Signal[i]);
  GenNoise(spoiled);
  ModulateIt;
  for I:=0 to razm do
    Modul.AddXY(i/sub_part,modulated[i]);
end;
procedure TF_Main.RadioButton3Click(Sender: TObject);
var i:integer;   //демодулированный сигнал
begin
  ClearGraph;
  GenSignal(signal);
  for I:=0 to razm do
    Xmt.AddXY(i/sub_part,Signal[i]);
  GenNoise(spoiled);
  ModulateIt;
  for I:=0 to razm do
    Modul.AddXY(i/sub_part,modulated[i]);
  Demodulate;
  for I:=0 to razm do
    DeModul.AddXY(i/sub_part,demodulated[i]);
end;
end.результат.png Вопрос: я сделал что-то не так или процедуры неверные? | 
| 
			 
			#2  
			
			
			
			
		 | ||||
| 
 | ||||
|   Cos(X*30)*(Cos(x)) | 
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
|  
positivesmile (14.09.2013)
 | ||