快速傅里叶变换 php,数字信号处理算法(2)-快速傅里叶变换(FFT)

1. 序列x(n)的离散傅立叶变换为:

12df4c8fca94c3df1c0d222a4a8771f9.png

2. 将序列x(n)按序号n的奇偶分成两组,即:

d5daedd0668c9ab1251d5b1742e4599a.png

e4d68c05b18a8d5e438cefca5b8719a3.png

18536d8bcd023d3a461cff16f78c6aed.png

3. 周期性

50092d4bc4039aa5b19f44c084b6fea5.png

5ac3b12eba5e8141c6cb305ba035b4ca.png

4. 计算公式

449421b21b22c98e80d6dd79175d06d1.png

8b755b2ffebf4f9d9657a9627ce0f078.png

c20428f60ba5332b5f764aa3f76f0bc7.png

5.序列X(k)的离散傅立叶反变换为:

30c923c423c4bbec716ddf598861817b.png

6.运算量对比

08adcf1d61206ccb7d28983998fad978.png

7.算法程序FFT.h#include 

void fft(double x[], double y[], int n, int sign);

void fft(double x[], double y[], int n, int sign)

{

int i,j,k,l,m,n1,n2;

double c,c1,e,s,s1,t,tr,ti;

for(j=1,i=1; i<16; i++)

{

m=i;

j=2*j;

if(j==n)break;

}

n1=n-1;

for(j=0,i=0; i

{

if(i

{

tr=x[j];

ti=y[j];

x[j]=x[i];

y[j]=y[i];

x[i]=tr;

y[i]=ti;

}

k=n/2;

while(k

{

j=j-k;

k=k/2;

}

j=j+k;

}

n1=1;

for(l=1; l<=m; l++)

{

n1=2*n1;

n2=n1/2;

e=3.14159265359/n2;

c=1.0;

s=0.0;

c1=cos(e);

s1=-sign*sin(e);

for(j=0; j

{

for(i=j; i

{

k=i+n2;

tr=c*x[k]-s*y[k];

ti=c*y[k]+s*x[k];

x[k]=x[i]-tr;

y[k]=y[i]-ti;

x[i]=x[i]+tr;

y[i]=y[i]+ti;

}

t=c;

c=c*c1-s*s1;

s=t*s1+s*c1;

}

}

if(sign==-1)

{

for(i=0; i

{

x[i]/=n;

y[i]/=n;

}

}

}

8. 部分运算结果

6618ba6ecc378a4c8f2aff7d837d104c.png

注:例程 (点击下载附件) 和《离散傅立叶变换》类似,只是头文件有所不同。

注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值