Шустрый

Профиль
Группа: Участник
Сообщений: 57
Регистрация: 28.3.2011
Репутация: нет Всего: нет
|
Здравствуйте. Мне необходимо написать программу для моделирования фильтра пятого порядка. У меня есть программа для моделирования НЧ фильтра 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Это сообщение отредактировал(а) Beren - 21.1.2013, 18:05
|