利用c语言实现fft及ifft算法,C语言及Matlab实现fft.doc

《C语言及Matlab实现fft.doc》由会员分享,可在线阅读,更多相关《C语言及Matlab实现fft.doc(6页珍藏版)》请在人人文库网上搜索。

1、*时间抽选基2FFT及IFFT算法C语言实现*/学号3070503041 电信0702 李春阳该程序有误输入1,2,3,4,5,6,7,8与MATLAB实现不一样,但可运行可以修改修改好请给我留言758677366qq.com 估计数据排列子程序有误#include #include #include #define N 1000/*定义复数类型*/typedef structdouble real;double img;complex;complex xN, *W; /*输入序列,变换核*/int size_x=0; /*输入序列的大小,在本程序中仅限2的次幂*/double PI; /*圆。

2、周率*/int main()int i,method;void fft(); /*快速傅里叶变换*/void ifft();void initW(); /*初始化变换核*/void change(); /*变址*/void add(complex a,complex b,complex *c); /*复数加法*/void mul(complex a,complex b,complex *c); /*复数乘法*/void sub(complex a,complex b,complex *c); /*复数减法*/void divi(complex a,complex b,complex *c);/。

3、*复数除法*/void output(); /*输出结果*/system(cls);PI=atan(1)*4;printf(Please input the size of x:n);scanf(%d,&size_x);printf(Please input the data in xN:n);for(i=0;i1;if(ji)temp=xi;xi=xj;xj=temp;/*输出傅里叶变换的结果*/void output()int i;printf(The result are as followsn);for(i=0;i=0.0001)printf(+(%.4fj)n,xi.img);els。

4、e if(fabs(xi.img)real=a.real+b.real;c-img=a.img+b.img;void mul(complex a,complex b,complex *c)c-real=a.real*b.real - a.img*b.img;c-img=a.real*b.img + a.img*b.real;void sub(complex a,complex b,complex *c)c-real=a.real-b.real;c-img=a.img-b.img;void divi(complex a,complex b,complex *c)c-real=( a.real*b。

5、.real+a.img*b.img )/( b.real*b.real+b.img*b.img);c-img=( a.img*b.real-a.real*b.img)/(b.real*b.real+b.img*b.img);FFT的MATLAB实现x=1,2j,3,4j ;M=nextpow2(x); % 求x的长度对应的2的最低幂次m N=2M;if length(x)N x=x,zeros(1,N-length(x); % 若x的长度不是2的幂,补零到2的整数幂 end nxd=bin2dec(fliplr(dec2bin(1:N-1,M)+1; % 求1:2M数列序号的倒序 y=x(nx。

6、d); % 将x倒序排列作为y的初始值 WN=exp(-i*2*pi/N); for L=1:MB=2L/2;%第L级中,每个蝶形的两个输入数据相距B个点,每级有B个不同的旋转因子for J=0:B-1 % J代表了不同的旋转因子p=J*2(M-L); WNp=WNp;for k=J+1:2L:N % 本次蝶形运算的跨越间隔为2L kp=k+B; % 蝶形运算的两个因子对应单元下标的关系 t=y(kp)*WNp; % 蝶形运算的乘积项 y(kp)=y(k)-t; % 蝶形运算, 注意必须先进行减法运算,然后进行加法运算,否则要使用中间变量来传递y(k)y(k)=y(k)+t; % 蝶形运算end end end y y1=fft(x) %自己编的FFT跟直接调用的函数运算以后的结果进行对比% 仿真结果:y =4.0000 + 6.0000i -4.0000 - 0.0000i 4.0000 - 6.0000i 0 + 0.0000iy1 =4.0000 + 6.0000i -4.0000 4.0000 - 6.0000i 0。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值