# C语言及Matlab实现fft

/*时间抽选基 2FFT 及 IFFT 算法 C 语言实现 时间抽选基 语言实现*/

scanf("%d",&method); if(method==0) fft(); else ifft(); output(); return 0; } /*快速傅里叶变换*/ void fft(){ int i=0,j=0,k=0,l=0; complex up,down; //蝶形输出端的上和下 change(); //调整输入的序列，即蝶形的输入端的相 应数据排列 for(i=0;i< (int)( log(size_x)/log(2) );i++) { l=( 1<<i ); for(j=0;j<size_x;j+= (1<<l) ){ /*一组蝶形运算*/ for(k=0;k<l;k++){ mul(x[j+k+l],W[size_x*k/2/l],&up); add(x[j+k],up,&up); mul(x[j+k+l],W[size_x*k/2/l],&down); sub(x[j+k],down,&down); x[j+k]=up; x[j+k+l]=down; } } } } /*快速傅里叶逆变换*/ void ifft() { int i=0,j=0,k=0,l=size_x; complex up,down; for(i=0;i< (int)( log(size_x)/log(2) );i++) { /*一级蝶形运算*/ l/=2; for(j=0;j<size_x;j+= (1<<l) ) { for(k=0;k<l;k++) { add(x[j+k],x[j+k+l],&up);

/*一组蝶形运算*/ /*一个蝶形运算*/

up.real/=2;up.img/=2; sub(x[j+k],x[j+k+l],&down); down.real/=2;down.img/=2; divi(down,W[size_x*k/2/l],&down); x[j+k]=up; x[j+k+l]=down; } } } change(); } /*初始化变换核*/ void initW() { int i; W=(complex *)malloc(sizeof(complex) * size_x); for(i=0;i<size_x;i++){ W[i].real=cos(2*PI/size_x*i); W[i].img=-1*sin(2*PI/size_x*i); } } /*变址计算，将 x(n)码位倒置*/ void change() { complex temp; int i=0,j=0,k=0,t; for(i=0;i<size_x;i++){ k=i;j=0; t=(unsigned) (log(size_x)/log(2)); while(t--){ j=j<<1; j|=(k & 1); k=k>>1; } if(j>i) { temp=x[i]; x[i]=x[j]; x[j]=temp; } }

} /*输出傅里叶变换的结果*/ void output() { int i; printf("The result are as follows\n"); for(i=0;i<size_x;i++) { printf("%.4f",x[i].real); if(x[i].img>=0.0001)printf("+(%.4fj)\n",x[i].img); else if(fabs(x[i].img)<0.0001)printf("\n"); else printf("(%.4fj)\n",x[i].img); } } void add(complex a,complex b,complex *c) { c->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.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=2^M; 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:2^M 数列序号的倒序 y=x(nxd); % 将 x 倒序排列作为 y 的初始值 WN=exp(-i*2*pi/N); for L=1:M B=2^L/2;%第 L 级中，每个蝶形的两个输入数据相距 B 个点，每级有 B 个不同的旋转 因子 for J=0:B-1 % J 代表了不同的旋转因子 p=J*2^(M-L); WNp=WN^p; for k=J+1:2^L:N % 本次蝶形运算的跨越间隔为 2^L 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 y1 = 4.0000 + 6.0000i -4.0000 4.0000 - 6.0000i 0 + 0.0000i

4.0000 - 6.0000i

0

Matlab编写fft_计算机软件及应用_IT/计算机_专业资料。使用Matlab编写fftFFT算法编写 1、程序 function [A] = myfft(A,M) N=2^M; LH=N/2; J=LH; N1...
matlab实现fft
matlab实现fft_信息与通信_工程科技_专业资料。FFT: Myfft: function X=myfft(x) %myfft 函数 用递归实现 N=length(x); %离散数组的长度 t=log2(N); %...

MATLAB编写的fft2程序更... 2页 1下载券 C语言实现FFT(快速傅里叶... 12页 1下载券按​时​间​抽​取​的​基​2​F​F​T​算​...
Matlab编程实现FFT变换及频谱分析的程序代码
Matlab编程实现FFT变换及频谱分析的程序代码_IT/计算机_专业资料。用matlab实现的fft变换和频谱分析,附代码 Matlab 编程实现 FFT 变换及频谱分析的程序代码 (喜欢进行...

Matlab实现DFT和FFT

FFT算法设计与实现
FFT算法设计与实现_信息与通信_工程科技_专业资料。c语言实现FFT算法 ...FFT(array, b, SIZE); } //随机生成 16 个输入数据 4、 与 MATLAB 自带...
FFT的C语言算法实现

Matlab中的FFT运算
Matlab中的FFT运算_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 Matlab中的FFT运算_IT/计算机_专业资料。今日推荐 157份文档 ...