Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.09.2013, 12:09
positivesmile positivesmile вне форума
Прохожий
 
Регистрация: 16.11.2012
Сообщения: 13
Репутация: 10
Сообщение Амплитудная модуляция и демодуляция сигналов в системе связи

Всем доброго времени суток.

У меня проблема: преподаватель дал задание сделать модуляцию и демодуляцию исходного сигнала.

Дал процедуры и скриншоты того что должно быть:

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

Вопрос: я сделал что-то не так или процедуры неверные?
Ответить с цитированием
  #2  
Старый 14.09.2013, 12:59
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Cos(X*30)*(Cos(x))
Изображения
Тип файла: png Безымянный.png (119.0 Кбайт, 27 просмотров)
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
positivesmile (14.09.2013)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter