Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2014, 11:31   #1
Clockgen
Пользователь
 
Регистрация: 20.11.2008
Сообщений: 66
Сообщение Восстановление интерфейса

Здравствуйте,помогите пожалуйста восстановить интерфейс этой программы- программа выполняет моделирование работы цифрового фильтра низких частот 8 порядка с частотой дискретизации Fd=132 кГц и максимальной частотой входного непрерывного сигнала Fmax. По результатам обработки выводятся графики входного аналогового сигнала и выходного цифрового сигнала, полученного в соответствии с заданием на проектирование цифрового фильтра,и частота ослабления,я просто плохо разбираюсь в данном коде,код мне выдал преподаватель,он предложил восстановить этот код для моей работы.
Если не трудно, подскажите пожалуйста еще как можно переделать эту программу для расчета полосового фильтра? Буду очень благодарен,можно обсудить в личке.

Код:
unit uFilter;
interface
uses Generics.Collections;
type
  TMyFilter = class
  private
    faCof, fbCof, fX, fY: TList<Extended>;
  public
    constructor Init(aaCof, abCof: TList<Extended>);
    function GetValue(ax: Extended): Extended;
  end;
implementation
 
function TMyFilter.GetValue(ax: Extended): Extended;
var
  i, n: integer;
  tmps1, tmps2: Extended;
begin
  n := fX.Count;
  for i := 0 to n - 2 do
  begin
    fX.Items[i] := fX.Items[i + 1];
  end;
  fX.Items[n - 1] := ax;
 
  n := fY.Count;
  for i := 0 to n - 2 do
  begin
    fY.Items[i] := fY.Items[i + 1];
  end;
 
  tmps1 := 0;
  n := faCof.Count;
  for i := 0 to n - 1 do
  begin
    tmps1 := tmps1 + faCof.Items[i] * fX.Items[n - 1 - i];
  end;
 
  tmps2 := 0;
  n := fbCof.Count;
  for i := 0 to n - 1 do
  begin
    tmps2 := tmps2 + fbCof.Items[i] * fY.Items[n - 1 - i];
  end;
  fY.Items[n] := tmps1 - tmps2;
 
  result := fY.Items[n - 1];
end;
 
constructor TMyFilter.Init(aaCof, abCof: TList<Extended>);
var
  i, n: integer;
begin
  faCof := TList<Extended>.Create();
  fbCof := TList<Extended>.Create();
  fX := TList<Extended>.Create();
  fY := TList<Extended>.Create();
  n := aaCof.Count;
  for i := 0 to n - 1 do
  begin
    faCof.Add(aaCof.Items[i]);
    fX.Add(0);
  end;
  n := abCof.Count;
  for i := 0 to n - 1 do
  begin
    fbCof.Add(abCof.Items[i]);
    fY.Add(0);
  end;
  fY.Add(0);
end;
 
end.
 
 
unit ugenerator;
 
interface
uses classes;
type
  TGenerator = class
  private
    fFreq, fFreqDiscrete, fAmpl: Extended;
  public
    constructor Init(aF, aA, aFd: Extended);
    function GetValue(aX: Extended): Extended;
    function GetTime(aX: Extended): Extended;
  end;
 
implementation
 
function TGenerator.GetTime(aX: Extended): Extended;
begin
  Result := aX / fFreqDiscrete;
end;
 
function TGenerator.GetValue(aX: Extended): Extended;
begin
  Result := fAmpl * cos(2 * Pi * fFreq * GetTime(aX));
end;
 
constructor TGenerator.Init(aF, aA, aFd: Extended);
begin
  fFreq := aF;
  fFreqDiscrete := aFd;
  fAmpl := aA;
end;
 
end.
 
/////////////////////////////////////////
Примерно картинка должна выглядеть как в приложении.
Изображения
Тип файла: jpg Безымянный.jpg (31.6 Кб, 109 просмотров)
Clockgen вне форума Ответить с цитированием
Старый 02.12.2014, 11:32   #2
Clockgen
Пользователь
 
Регистрация: 20.11.2008
Сообщений: 66
По умолчанию

Код:
/////////////////////////////Продолжение

unit Unit1;
 
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uFilter, TeEngine, ExtCtrls, TeeProcs, Chart, StdCtrls, Series,
  ugenerator, Generics.Collections, Math;
 
type
  TForm1 = class(TForm)
    Chart: TChart;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Series1: TLineSeries;
    Series2: TLineSeries;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  s1: TChartSeries;
  F, Fd, x, y1, y2, ymax, Ampl: Extended;
  i, n, n1: integer;
  Generator: TGenerator;
  F1, F2, F3, F4: TMyFilter;
  aCof, bCof: TList<Extended>;
  YWST: TChartSeries;
begin
  Ampl := 1;
  F := strToFloat(Edit1.Text);
  Fd := strToFloat(Edit2.Text);
  aCof := TList<Extended>.Create();
  bCof := TList<Extended>.Create();
  YWST := TChartSeries.Create(self);
 
  // filter 1
  aCof.Clear;
  aCof.Add(0.21484375);
  aCof.Add(0.42578125);
  aCof.Add(0.21484375);
 
  bCof.Clear;
  bCof.Add(-0.85546875);
  bCof.Add(0.71093750);
 
 
  F1 := TMyFilter.Init(aCof, bCof);
 
  // filter 2
  aCof.Clear;
  aCof.Add(0.16796875);
  aCof.Add(0.33593750);
  aCof.Add(0.16796875);
 
  bCof.Clear;
  bCof.Add(-0.67578125);
  bCof.Add(0.35156250);
  F2 := TMyFilter.Init(aCof, bCof);
 
  // filter 3
  aCof.Clear;
  aCof.Add(0.14453125);
  aCof.Add(0.28906250);
  aCof.Add(0.14453125);
 
  bCof.Clear;
  bCof.Add(-0.58203125);
  bCof.Add(0.16406250);
  F3 := TMyFilter.Init(aCof, bCof);
 
  // filter 4
  aCof.Clear;
  aCof.Add(0.13671875);
  aCof.Add(0.26953125);
  aCof.Add(0.13671875);
 
  bCof.Clear;
  bCof.Add(-0.54296875);
  bCof.Add(0.08203125);
  F4 := TMyFilter.Init(aCof, bCof);
 
 
  Generator := TGenerator.Init(F, Ampl, Fd);
  Chart.Series[0].Clear;
  Chart.Series[1].Clear;
  n := Round((Fd / F) * 10);
  n1 := Round((Fd / F) * 9);
  for i := 0 to n do
  begin
    x := Generator.GetTime(i) - 10 / F;
    y1 := Generator.GetValue(i);
    y2 := F4.GetValue(F3.GetValue(F2.GetValue(F1.GetValue(y1))));
    Chart.Series[0].AddXY(x, y1);
    Chart.Series[1].AddXY(x, y2);
    if i > n1 then
    begin
      YWST.AddXY(x, y2);
    end;
  end;
  ymax := (YWST.MaxYValue - YWST.MinYValue) / 2;
  Label2.Caption := 'Ослабление: ' + FloatToStr(20 * Log10(ymax / Ampl)) + 'dB';
end;
end.
Clockgen вне форума Ответить с цитированием
Старый 02.12.2014, 16:24   #3
Clockgen
Пользователь
 
Регистрация: 20.11.2008
Сообщений: 66
По умолчанию

Наверно это сложно сделать да?
Clockgen вне форума Ответить с цитированием
Старый 02.12.2014, 16:37   #4
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

--cut
Ошибочка...
Iron Monk вне форума Ответить с цитированием
Старый 02.12.2014, 16:49   #5
Clockgen
Пользователь
 
Регистрация: 20.11.2008
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Iron Monk Посмотреть сообщение
--cut
Ошибочка...
хм,а что это,это в тексте программы?
Clockgen вне форума Ответить с цитированием
Старый 02.12.2014, 16:50   #6
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от Clockgen Посмотреть сообщение
хм,а что это,это в тексте программы?
У Вас не хватает юнита - ugenerator.
Но он есть тут...

Последний раз редактировалось Iron Monk; 02.12.2014 в 16:53.
Iron Monk вне форума Ответить с цитированием
Старый 02.12.2014, 16:52   #7
Clockgen
Пользователь
 
Регистрация: 20.11.2008
Сообщений: 66
По умолчанию

У меня есть второй вариант он готовый но только для верхних частот,а необходимо сделать для нижних, 4-го порядка,если нужны еще какие либо данные,я могу скинуть.

Вот скину файлы проекта, там есть все теже 3 юнита. Помогите пожалуйста,кто чем сможет.

Цитата:
Сообщение от Iron Monk Посмотреть сообщение
У Вас не хватает юнита - ugenerator.
Но он есть тут...
а он же присутствует выше,почти в конце первого сообщения.

Цитата:
Сообщение от Iron Monk Посмотреть сообщение
У Вас не хватает юнита - ugenerator.
Но он есть тут...
да,он есть,просто не знаю как сделать для нижних частот на основе той программы,которая для верхних,у меня есть посчитанные мной коэффициенты,но куда их преминить в программе,я не знаю. По идее,график зеленый и красный график должны измениться.
Вложения
Тип файла: rar 268492.rar (246.5 Кб, 10 просмотров)

Последний раз редактировалось Clockgen; 02.12.2014 в 17:01.
Clockgen вне форума Ответить с цитированием
Старый 02.12.2014, 17:26   #8
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

С этими данными получилось такое:

Какие цифирки вводить я не знаю)))
Iron Monk вне форума Ответить с цитированием
Старый 02.12.2014, 18:47   #9
Clockgen
Пользователь
 
Регистрация: 20.11.2008
Сообщений: 66
По умолчанию

Цитата:
Сообщение от Iron Monk Посмотреть сообщение
С этими данными получилось такое:

Какие цифирки вводить я не знаю)))
А вы какие данные использовали? Из проекта с архивом который я скинул для верхних частот позже? Или из первого поста в моей этой теме вы собрали проект?? Если не сложно, скиньте мне пожалуйста файлы проекта. А как сделать только для 4-года порядка? Можете не отвечать) но если знаете, то это будет супер!
Clockgen вне форума Ответить с цитированием
Старый 02.12.2014, 18:51   #10
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от Clockgen Посмотреть сообщение
А вы какие данные использовали? Из проекта с архивом который я скинул для верхних частот позже? Или из первого поста в моей этой теме вы собрали проект?? Если не сложно, скиньте мне пожалуйста файлы проекта. А как сделать только для 4-года порядка? Можете не отвечать) но если знаете, то это будет супер!
Это собрано из исходников первого поста темы.
Вложения
Тип файла: rar Chart.rar (5.6 Кб, 11 просмотров)

Последний раз редактировалось Iron Monk; 02.12.2014 в 18:56.
Iron Monk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание интерфейса DanZ Общие вопросы C/C++ 2 06.04.2014 13:48
Объявеление интерфейса Peteren Visual C++ 0 25.01.2012 18:58
Создание интерфейса kirieshka Помощь студентам 0 09.04.2011 22:41
Создания интерфейса...си dampirik Помощь студентам 1 06.07.2009 14:40