type TComplexData = record //自定义复数类型
vReal,vImaginary: Double;
end;
TComplexDataArray = array of TComplexData; //实数数组
TExtendedArray = array of Extended; //复数数组function ComplexAdd(c1,c2:TComplexData):TComplexData; //复数相加
function ComplexMinus(c1,c2:TComplexData):TComplexData; //复数相减
function ComplexMultiply(c1,c2:TComplexData):TComplexData; //复数相乘
procedure ComplexArrayWrap(var a1,a2:TComplexDataArray); //复数数组互换
procedure DoFFT(TD:TExtendedArray; var FD:TExtendedArray; r:Integer);procedure Tmainform.DoFFT(TD:TExtendedArray; var FD:TExtendedArray; r:Integer);
var
i,j,k : Integer; //循环变量
bfsize,p : Integer; //中间变量
angle : Double; //角度
begin
count:= 1 shl r; //傅立叶变换点数
// 分配运算所需存储器
SetLength(W, count div 2);
SetLength(X1,count);
SetLength(X2,count);
// 计算加权系数
for i:=0 to count div 2 -1 do
begin
angle := -i * PI * 2 / count;
W[i].vReal := cos(angle);
W[i].vImaginary := sin(angle);
end;
// 将时域点写入X1
for i:=0 to count-1 do
begin
X1[i].vReal:=TD[i];
X1[i].vImaginary:=0;
end;
// 采用蝶形算法进行快速傅立叶变换
for k:=0 to r-1 do
begin
for j:=0 to (1 shl k)-1 do
begin
bfsize:= 1 shl (r-k);
for i:=0 to bfsize div 2 -1 do
begin
p := j * bfsize;
X2[i+p]:=ComplexAdd(X1[i+p],X1[i+p+bfsize div 2]);
X2[i+p+bfsize div 2]:=ComplexMultiply(
ComplexMinus(X1[i+p],X1[i+p+ bfsize div 2]),
W[i*(1 shl k)]);
end;
end;
ComplexArrayWrap(X1,X2);
end;
// 重新排序
Setlength(Fd,count div 2);
for j:=0 to count div 2 - 1 do
begin
p := 0;
for i:=0 to r-1 do
begin
if (j and (1 shl i))>0 then
p:=p+(1 shl (r-i-1));
end;
FD[j]:=X1[p].vReal;
end;
// 释放内存
Setlength(W,0);
Setlength(X1,0);
Setlength(X2,0);
end;
上面是fft的算法实现代码,但是我在调用的时候,发现TD,FD输入参数有些问题,
我原始数据是一个桥梁检测的信号,一个分量是频率,一个分量是幅值,我要如何通过FFT算法,把这个信号图,分解成为频率图和幅度图?
请教各位高手,谢谢!
vReal,vImaginary: Double;
end;
TComplexDataArray = array of TComplexData; //实数数组
TExtendedArray = array of Extended; //复数数组function ComplexAdd(c1,c2:TComplexData):TComplexData; //复数相加
function ComplexMinus(c1,c2:TComplexData):TComplexData; //复数相减
function ComplexMultiply(c1,c2:TComplexData):TComplexData; //复数相乘
procedure ComplexArrayWrap(var a1,a2:TComplexDataArray); //复数数组互换
procedure DoFFT(TD:TExtendedArray; var FD:TExtendedArray; r:Integer);procedure Tmainform.DoFFT(TD:TExtendedArray; var FD:TExtendedArray; r:Integer);
var
i,j,k : Integer; //循环变量
bfsize,p : Integer; //中间变量
angle : Double; //角度
begin
count:= 1 shl r; //傅立叶变换点数
// 分配运算所需存储器
SetLength(W, count div 2);
SetLength(X1,count);
SetLength(X2,count);
// 计算加权系数
for i:=0 to count div 2 -1 do
begin
angle := -i * PI * 2 / count;
W[i].vReal := cos(angle);
W[i].vImaginary := sin(angle);
end;
// 将时域点写入X1
for i:=0 to count-1 do
begin
X1[i].vReal:=TD[i];
X1[i].vImaginary:=0;
end;
// 采用蝶形算法进行快速傅立叶变换
for k:=0 to r-1 do
begin
for j:=0 to (1 shl k)-1 do
begin
bfsize:= 1 shl (r-k);
for i:=0 to bfsize div 2 -1 do
begin
p := j * bfsize;
X2[i+p]:=ComplexAdd(X1[i+p],X1[i+p+bfsize div 2]);
X2[i+p+bfsize div 2]:=ComplexMultiply(
ComplexMinus(X1[i+p],X1[i+p+ bfsize div 2]),
W[i*(1 shl k)]);
end;
end;
ComplexArrayWrap(X1,X2);
end;
// 重新排序
Setlength(Fd,count div 2);
for j:=0 to count div 2 - 1 do
begin
p := 0;
for i:=0 to r-1 do
begin
if (j and (1 shl i))>0 then
p:=p+(1 shl (r-i-1));
end;
FD[j]:=X1[p].vReal;
end;
// 释放内存
Setlength(W,0);
Setlength(X1,0);
Setlength(X2,0);
end;
上面是fft的算法实现代码,但是我在调用的时候,发现TD,FD输入参数有些问题,
我原始数据是一个桥梁检测的信号,一个分量是频率,一个分量是幅值,我要如何通过FFT算法,把这个信号图,分解成为频率图和幅度图?
请教各位高手,谢谢!
解决方案 »
- exception class EInouterror with message 'I/O erro 103'这样的错误是什么原因啊?
- 不知道什麼時候變成“星星”了,散分吧!!!!
- 这种XP风格的界面在Delphi中怎么实现阿?
- 自己做了一个类似vb里面slipt函数,大家指教
- 哪位用过CreateBlobStream,请交流一下?
- 又是query的问题
- publish的含义是什么啊和public有什么区别啊
- ███ 请问禁止修改屏幕分辨率在注册表的哪一项中?███
- 求DHCP客户端的编程(WIN平台)
- 怎样在dephi中用ado调用视图
- 求 TWebBrowser 制作的案例,要那种通过此组件做的用于界面的
- 急啊,在delphi中如何用ADO彻底删除.dbf(VFP)表中的所有记录?
我的Email是:[email protected]