Всем доброго времени суток.
У меня проблема: преподаватель дал задание сделать модуляцию и демодуляцию исходного сигнала.
Дал процедуры и скриншоты того что должно быть:
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;
Используемые параметры a_sig – амплитуда сигнала, f_sig – фаза сигнала, tau
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;
Используемые параметры a_noise – сила шума.
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
Вопрос: я сделал что-то не так или процедуры неверные?