📄 main.pas
字号:
{
The IIR filter demo
Author: Eugen Tarasov
Last modified - January, 2004
Please send all suggestions to author
e-mail: dsplab@teworks.com
http://www.teworks.com
}
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, ComCtrls, Buttons, TeEngine, Series, TeeProcs, Chart,
Menus, Math, dspIIRFilters, dspTypes;
type
TSignalForm = (sfSine, sfSquare, sfTriangle);
TfmMain = class(TForm)
Panel2: TPanel;
StatusBar1: TStatusBar;
Bevel2: TBevel;
MainMenu1: TMainMenu;
Help1: TMenuItem;
Program1: TMenuItem;
Exit1: TMenuItem;
Whatisthis1: TMenuItem;
N1: TMenuItem;
About1: TMenuItem;
Timer1: TTimer;
ScrollBox1: TScrollBox;
GeneratorBox: TGroupBox;
lFreq1: TLabel;
lAmp1: TLabel;
tbSourceFreq: TTrackBar;
rbSin: TRadioButton;
rbSquare: TRadioButton;
rbTriangle: TRadioButton;
edtSourceFreq: TEdit;
tbSourceAmp: TTrackBar;
edtSourceAmp: TEdit;
FilterResponse: TGroupBox;
rbLowpassFilter: TRadioButton;
rbHighpassFilter: TRadioButton;
rbBandpassFilter: TRadioButton;
rbBandstopFilter: TRadioButton;
FilterPropertiesBox: TGroupBox;
lFilterFreq11: TLabel;
lFilterFreq21: TLabel;
Label1: TLabel;
tbFilterFreq1: TTrackBar;
edtFilterFreq1: TEdit;
tbFilterFreq2: TTrackBar;
edtFilterFreq2: TEdit;
tbFilterOrder: TTrackBar;
edtFilterOrder: TEdit;
ChebyshevPropertiesBox6: TGroupBox;
Label4: TLabel;
tbFilterRipple: TTrackBar;
edtFilterRipple: TEdit;
Panel1: TPanel;
Chart1: TChart;
Series1: TFastLineSeries;
Chart2: TChart;
Series2: TFastLineSeries;
GroupBox1: TGroupBox;
rbButterworth: TRadioButton;
rbChebyshev: TRadioButton;
rbBessel: TRadioButton;
dspIIRFilter1: TdspIIRFilter;
procedure rbSourceClick(Sender: TObject);
procedure tbSourceFreqChange(Sender: TObject);
procedure tbSourceAmpChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure tbFilterFreq1Change(Sender: TObject);
procedure tbFilterFreq2Change(Sender: TObject);
procedure rbFilterResponseClick(Sender: TObject);
procedure tbFilterOrderChange(Sender: TObject);
procedure tbFilterRippleChange(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure Panel1Resize(Sender: TObject);
procedure rbFilterKindClick(Sender: TObject);
private
SignalForm: TSignalForm;
SignalAmp, SignalFreq: Integer;
public
{ Public declarations }
end;
var
fmMain: TfmMain;
implementation
uses About;
{$R *.DFM}
const
cFrequency = 1000; // 1000 Hz
procedure TfmMain.FormCreate(Sender: TObject);
begin
Application.Title:= 'DSPLab - ' + Caption;
// Setup parameters
rbSourceClick(nil);
tbSourceAmpChange(nil);
tbSourceFreqChange(nil);
tbFilterFreq1Change(nil);
tbFilterFreq2Change(nil);
rbFilterKindClick(nil);
rbFilterResponseClick(nil);
tbFilterOrderChange(nil);
tbFilterRippleChange(nil);
Chart1.BottomAxis.Maximum:= 0;
Chart2.BottomAxis.Maximum:= 0;
Timer1.Enabled:= true;
end;
procedure TfmMain.rbSourceClick(Sender: TObject);
begin
if rbSin.Checked then SignalForm:= sfSine else
if rbSquare.Checked then SignalForm:= sfSquare else
if rbTriangle.Checked then SignalForm:= sfTriangle;
end;
procedure TfmMain.tbSourceFreqChange(Sender: TObject);
begin
SignalFreq:= tbSourceFreq.Position;
edtSourceFreq.Text:= IntToStr(SignalFreq);
end;
procedure TfmMain.tbSourceAmpChange(Sender: TObject);
begin
SignalAmp:= tbSourceAmp.Position;
edtSourceAmp.Text:= IntToStr(SignalAmp);
end;
procedure TfmMain.tbFilterFreq1Change(Sender: TObject);
begin
dspIIRFilter1.Frequency1:= tbFilterFreq1.Position;
edtFilterFreq1.Text:= IntToStr(tbFilterFreq1.Position);
end;
procedure TfmMain.tbFilterFreq2Change(Sender: TObject);
begin
dspIIRFilter1.Frequency2:= tbFilterFreq2.Position;
edtFilterFreq2.Text:= IntToStr(tbFilterFreq2.Position);
end;
procedure TfmMain.rbFilterKindClick(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 TfmMain.rbFilterResponseClick(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 TfmMain.tbFilterOrderChange(Sender: TObject);
begin
dspIIRFilter1.Order:= tbFilterOrder.Position;
edtFilterOrder.Text:= IntToStr(dspIIRFilter1.Order);
end;
procedure TfmMain.tbFilterRippleChange(Sender: TObject);
var S: String;
begin
dspIIRFilter1.Ripple:= tbFilterRipple.Position / 10;
Str(dspIIRFilter1.Ripple:4:1, S);
edtFilterRipple.Text:= S + ' dB';
end;
procedure TfmMain.Timer1Timer(Sender: TObject);
const
cMsInDay = 24 * 3600000;
cScaleRange = 1 / cMsInDay;
var
I: Integer;
T: Double;
V: TdspFloat;
function Sine: TdspFloat;
begin
Result:= SignalAmp * Sin(2 * PI * SignalFreq * T);
end;
function Triangle: TdspFloat;
begin
Result:= Frac(SignalFreq * T) * 4;
if Result <= 2 then Result:= -SignalAmp * (1 - Result)
else Result:= SignalAmp * (3 - Result);
end;
function Rectangle: TdspFloat;
begin
Result:= Frac(SignalFreq * T) - 0.5;
if Result < 0.0 then Result:= -SignalAmp else Result:= SignalAmp;
end;
begin
for I:= 1 to 5 do
begin
T:= Timer1.Tag / cFrequency;
case SignalForm of
sfSine: V:= Sine;
sfSquare: V:= Rectangle;
sfTriangle: V:= Triangle;
else V:= 0;
end;
T:= T / cMsInDay;
if T >= Chart1.BottomAxis.Maximum then
begin
Chart1.BottomAxis.SetMinMax(
Chart1.BottomAxis.Maximum, Chart1.BottomAxis.Maximum + cScaleRange);
Chart2.BottomAxis.SetMinMax(Chart1.BottomAxis.Minimum, Chart1.BottomAxis.Maximum);
end;
Series1.AddXY(T, V, '', clRed);
Series2.AddXY(T, dspIIRFilter1.Filter(V), '', clRed);
Timer1.Tag:= Timer1.Tag + 1;
end;
end;
procedure TfmMain.About1Click(Sender: TObject);
begin
fmAbout.ShowModal;
end;
procedure TfmMain.Panel1Resize(Sender: TObject);
begin
Chart1.Height:= Panel1.Height div 2;
end;
procedure TfmMain.Exit1Click(Sender: TObject);
begin
Close;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -