⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 VCL component dsplab , STFT and SPECTRUM viewer, real time
💻 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 + -