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

📄 main.pas

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