📄 main.pas
字号:
{
The FFT 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, dspTypes, dspFFT, Tabs;
type
TfmMain = class(TForm)
MainMenu1: TMainMenu;
Help1: TMenuItem;
Program1: TMenuItem;
Exit1: TMenuItem;
Whatisthis1: TMenuItem;
N1: TMenuItem;
About1: TMenuItem;
dspFFT1: TdspFFT;
Panel3: TPanel;
TabSet1: TTabSet;
Notebook1: TNotebook;
Panel2: TPanel;
ScrollBox1: TScrollBox;
GeneratorBox: TGroupBox;
lFreq1: TLabel;
lAmp1: TLabel;
tbFreq1: TTrackBar;
edtFreq1: TEdit;
tbAmp1: TTrackBar;
edtAmp1: TEdit;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
tbFreq2: TTrackBar;
edtFreq2: TEdit;
tbAmp2: TTrackBar;
edtAmp2: TEdit;
GroupBox2: TGroupBox;
Label3: TLabel;
Label4: TLabel;
tbFreq3: TTrackBar;
edtFreq3: TEdit;
tbAmp3: TTrackBar;
edtAmp3: TEdit;
Bevel2: TBevel;
Panel1: TPanel;
Chart1: TChart;
Series1: TFastLineSeries;
Chart2: TChart;
Memo1: TMemo;
Series2: TBarSeries;
procedure tbChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure Panel1Resize(Sender: TObject);
procedure TabSet1Change(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean);
private
Amp1, Freq1: Integer;
Amp2, Freq2: Integer;
Amp3, Freq3: Integer;
procedure Generate;
procedure Transform;
procedure Visualize;
end;
var
fmMain: TfmMain;
implementation
uses About;
{$R *.DFM}
const
cSampleRate = 1024; // Hz
procedure TfmMain.FormCreate(Sender: TObject);
begin
Application.Title:= 'DSPLAB - ' + Caption;
{$IFNDEF VER120}
Series2.CustomBarWidth:= 1;
{$ENDIF}
tbChange(nil);
end;
procedure TfmMain.Generate;
var I: Integer;
function Sine(Amp, Freq, N: Integer): TdspSingle;
begin
Result:= Amp * Sin(2 * PI * Freq * N / cSampleRate);
end;
begin
for I:= 0 to dspFFT1.BufferSize - 1 do
begin
dspFFT1.RealIn[I]:=
Sine(Amp1, Freq1, I) +
Sine(Amp2, Freq2, I) +
Sine(Amp3, Freq3, I);
dspFFT1.ImagIn[I]:= 0;
end;
end;
procedure TfmMain.Transform;
begin
dspFFT1.FFT;
dspFFT1.CalculateMagnitudes;
end;
procedure TfmMain.Visualize;
var I: Integer;
begin
Series1.Clear;
for I:= 0 to dspFFT1.BufferSize - 1 do Series1.AddXY(I, dspFFT1.RealIn[I], '', clMaroon);
Series2.Clear;
for I:= 0 to dspFFT1.BufferSize2 - 1 do Series2.AddXY(I, dspFFT1.RealOut[I], '', clMaroon);
end;
procedure TfmMain.tbChange(Sender: TObject);
begin
Amp1:= tbAmp1.Position;
Freq1:= tbFreq1.Position;
edtAmp1.Text:= IntToStr(Amp1);
edtFreq1.Text:= IntToStr(Freq1);
Amp2:= tbAmp2.Position;
Freq2:= tbFreq2.Position;
edtAmp2.Text:= IntToStr(Amp2);
edtFreq2.Text:= IntToStr(Freq2);
Amp3:= tbAmp3.Position;
Freq3:= tbFreq3.Position;
edtAmp3.Text:= IntToStr(Amp3);
edtFreq3.Text:= IntToStr(Freq3);
Generate;
Transform;
Visualize;
end;
procedure TfmMain.Exit1Click(Sender: TObject);
begin
Close;
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.TabSet1Change(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean);
var FileName: String;
begin
Notebook1.PageIndex:= NewTab;
if NewTab = 1 then
begin
FileName:= ExtractFilePath(Application.ExeName) + 'Main.pas';
if FileExists(FileName) then Memo1.Lines.LoadFromFile(FileName)
else Memo1.Text:= 'File "' + FileName + '" - not exists';
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -