Полосовой фильтр пятого порядка

 
0
 
Delphi, Kylix and Pascal
ava
Beren | 21.01.2013, 19:02
Здравствуйте. Мне необходимо написать программу для моделирования фильтра пятого порядка. У меня есть программа для моделирования НЧ фильтра 8-го порядка. Можно как-нибудь её преобразовать ? Вот эта прграмма

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.


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.

Вот ссылка на полосовой фильтр  http://yadi.sk/d/6i-PvWdQ20dtC
Ответы (2)
ava
gesper | 21.01.2013, 19:00 #
Что такое фильтр 5-го порядка?
ava
northener | 22.01.2013, 01:33 #
Цитата (Beren @  21.1.2013,  18:02 findReferencedText)
 Мне необходимо написать программу для моделирования фильтра пятого порядка. У меня есть программа для моделирования НЧ фильтра 8-го порядка. Можно как-нибудь её преобразовать ?

Бесплатно, имхо нельзя. Да и платно лучше написать другую программу, а не преобразовывать что-то.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить