📄 main.pas
字号:
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, dspIIRFilters, ExtCtrls, ComCtrls, TeeProcs, TeEngine, Chart,
Series, Math, dspTypes;
type
TForm1 = class(TForm)
Chart1: TChart;
Panel1: TPanel;
GroupBox1: TGroupBox;
rbButterworth: TRadioButton;
rbChebyshev: TRadioButton;
rbBessel: TRadioButton;
FilterResponse: TGroupBox;
rbLowpassFilter: TRadioButton;
rbHighpassFilter: TRadioButton;
rbBandpassFilter: TRadioButton;
rbBandstopFilter: TRadioButton;
FilterPropertiesBox: TGroupBox;
lFilterFreq11: TLabel;
lFilterFreq21: TLabel;
edtFilterFreq1: TEdit;
edtFilterFreq2: TEdit;
Label1: TLabel;
edtFilterSampleRate: TEdit;
GroupBox2: TGroupBox;
Label4: TLabel;
tbFilterOrder: TTrackBar;
edtFilterOrder: TEdit;
Label2: TLabel;
edtFilterRipple: TEdit;
Label3: TLabel;
Label5: TLabel;
Bevel1: TBevel;
Bevel2: TBevel;
dspIIRFilter1: TdspIIRFilter;
GroupBox3: TGroupBox;
Label6: TLabel;
edtStartFreq: TEdit;
edtStopFreq: TEdit;
Label7: TLabel;
Label8: TLabel;
edtResolution: TEdit;
Button1: TButton;
Bevel3: TBevel;
Series1: TFastLineSeries;
tbFilterRipple: TTrackBar;
procedure rbButterworthClick(Sender: TObject);
procedure rbLowpassFilterClick(Sender: TObject);
procedure tbFilterOrderChange(Sender: TObject);
procedure tbFilterRippleChange(Sender: TObject);
procedure edtFilterFreq1KeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.Title:= Caption;
tbFilterOrderChange(nil);
tbFilterRippleChange(nil);
Button1Click(nil);
end;
procedure TForm1.rbButterworthClick(Sender: TObject);
begin
if rbButterworth.Checked then dspIIRFilter1.Kind:= fkButterworth else
if rbChebyshev.Checked then dspIIRFilter1.Kind:= fkChebyshev else
if rbBessel.Checked then dspIIRFilter1.Kind:= fkBessel;
end;
procedure TForm1.rbLowpassFilterClick(Sender: TObject);
begin
if rbLowpassFilter.Checked then dspIIRFilter1.Response:= ftLowpass else
if rbHighpassFilter.Checked then dspIIRFilter1.Response:= ftHighpass else
if rbBandpassFilter.Checked then dspIIRFilter1.Response:= ftBandpass else
if rbBandstopFilter.Checked then dspIIRFilter1.Response:= ftBandstop;
end;
procedure TForm1.tbFilterOrderChange(Sender: TObject);
begin
dspIIRFilter1.Order:= tbFilterOrder.Position;
edtFilterOrder.Text:= IntToStr(dspIIRFilter1.Order);
end;
procedure TForm1.tbFilterRippleChange(Sender: TObject);
var S: String;
begin
dspIIRFilter1.Ripple:= tbFilterRipple.Position / 10;
Str(dspIIRFilter1.Ripple:4:1, S);
edtFilterRipple.Text:= S + ' dB';
end;
procedure TForm1.edtFilterFreq1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in [#8, '0'..'9']) then Key:= #0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Start, Stop, NumSteps: Integer;
Amp, Delta, Frequency: TdspFloat;
begin
dspIIRFilter1.Frequency1:= StrToIntDef(edtFilterFreq1.Text, 100);
dspIIRFilter1.Frequency2:= StrToIntDef(edtFilterFreq2.Text, 300);
dspIIRFilter1.SampleRate:= StrToIntDef(edtFilterSampleRate.Text, 44100);
Start:= StrToIntDef(edtStartFreq.Text, 0);
Stop:= Min(StrToIntDef(edtStopFreq.Text, Round(dspIIRFilter1.SampleRate / 2)),
Round(dspIIRFilter1.SampleRate / 2));
NumSteps:= StrToIntDef(edtResolution.Text, 10);
if NumSteps <= 0 then
begin
ShowMessage('Please specify non zero resolution');
Exit;
end;
Delta:= (Stop - Start) / numSteps;
Series1.Clear;
for I:= 0 to NumSteps - 1 do
begin
Frequency:= Start + Delta * I;
Amp:= dspIIRFilter1. GetFrequencyResponse(Frequency);
if Amp < 1e-10 then Amp:= 1e-10;
Series1.AddXY(Frequency, log10(Amp)*20);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -