|
|
Регистрация | << Правила форума >> | 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))
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
positivesmile (14.09.2013)
|