一组采集的数据(已知是周期性的)求正弦三角函数表达式 ( 积分: 100 )

  • 主题发起人 主题发起人 人生55555
  • 开始时间 开始时间

人生55555

Unregistered / Unconfirmed
GUEST, unregistred user!
用DELPHI怎样编程,对一组采集的数据(已知是周期性的)求正弦三角函数表达式
 
对程序最好有详细的注释
 
网上有 FFT 的代码
 
高手们可以说清楚点吗
 
想当年,俺毕业论文也是做的DFFT,用的是PC机,用BASIC编程,绘一张DFT的信息图要一天!呵呵
下面这个是从网上找到的,自己看

{$N+,R-}
unit fftunit;

interface

type real = extended;
type realArray = array [0..1024] of real;

var fr, fi : realarray;

procedure fft(var fr, fi : realarray; lnN : integer; sign : integer);
procedure Init(lnN : integer);

const lnN = 10;


var n : integer;
divN : real;

implementation

function power2(i : integer) : integer;
var n : integer;
begin
n := 1;
for i := 1 to i do n := n*2;
power2:= n;
end;

{From "Image Processing" by Jan Teuber}

procedure fft(var fr, fi : realarray; lnN : integer; sign : integer);
var t, nd2, nm1 : integer;
i,j,k,l, le, le1, ip : integer;
label 1,2,3;
var s, ur, ur1, ui, wr, wi, tr, ti, dv : real;
begin
n := power2(lnN);
nd2 := N div 2;
nm1 := n-1;
j := 1;
for i := 1 to N-1 do
begin
if i >= j then goto 1;
s := fr; fr := fr[j]; fr[j] := s;
s := fi; fi := fi[j]; fi[j] := s;
1: k := nd2;
2: if k>=j then goto 3;
j := j - k;
k := k div 2;
goto 2;
3: j := j + k;
end;

For l := 1 to lnN do
begin
le := Power2(l);
le1 := le div 2;
ur := 1;
ui := 0;
wr := cos(pi/le1);
wi := sign*sin(pi/le1);
for j:=1 to le1 do
begin
i := j;
while (i<=N) do
begin
ip := i + le1;
tr := fr[ip]*ur - fi[ip]*ui;
ti := fr[ip]*ui + fi[ip]*ur;
fr[ip] := fr - tr;
fi[ip] := fi - ti;
fr := fr + tr;
fi := fi + ti;
i := i + le;
end;
ur1 := ur*wr - ui*wi;
ui := ur*wi + ui*wr;
ur := ur1;
end;
end; {l - l沰ke}


for i := 1 to N do
begin
fr := fr*divN;
fi := fi*divN;
end;


end;



procedure Init(lnN : integer);
var i : integer;
begin
n := power2(lnN);
for i := 0 to n do
begin
fi := 0;
fr := sin(i/n*4*pi)+0.2*sin(i/n*40*pi) + 0.1*random;
{random*2 +1;}
end;
divN := 1/sqrt(n*1.0);
end;


end.
init(lnN);
grafik;

draw(fr,1);
wtg;
setcolor(0);
{erase: }
draw(fr,1);


fft(fr, fi, LnN, -1);

{remove high frequencies}
{Try different values of 'keep'}

{keep := 5;}
keep := 5;

for t := 1+ keep to N-keep do
begin
fr[t] := 0;
fi[t] := 0;
end;


fft(fr, fi, lnN, 1);

setcolor(green);

draw(fr, 1);

wtg;
end.
 
谢谢高手。好好读一下
 
可以參考delphi數值算法一書
 
后退
顶部