![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 Вопрос: я сделал что-то не так или процедуры неверные? |