Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1267265
  • 博文数量: 788
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 7005
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 15:52
文章存档

2017年(81)

2011年(1)

2009年(369)

2008年(337)

分类:

2009-02-11 16:54:28



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算法,把这个信号图,分解成为频率图和幅度图?  
  请教各位高手,谢谢!

网上有很多快速傅立叶变换的例子.   有DELPHI实现的算法库

有源码库的

噢   来凑个热闹

现在的问题是不知道怎么初始化参数,也就是TD和FD,有没有这方面的实例?谢谢!  
  我的Email是:chenamo5776@126.com

阅读(637) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~