当前位置:首页 >> 工学 >>

C语言及Matlab实现fft


/*时间抽选基 2FFT 及 IFFT 算法 C 语言实现 时间抽选基 语言实现*/
学号 3070503041 电信 0702 李春阳

该程序有误输入{1,2,3,4,5,6,7,8}与 MATLAB 实现不一样,但可运行可以修改修 改好请给我留言 758677366@qq.com 估计数据排列子程序有误 #include <stdio.h> #include <math.h> #include <stdlib.h> #define N 1000 /*定义复数类型*/ typedef struct{ double real; double img; }complex; complex x[N], *W; /*输入序列,变换核*/ int size_x=0; /*输入序列的大小,在本程序中仅限 2 的次幂*/ double PI; /*圆周率*/ 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);/*复数除法*/ 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 x[N]:\n"); for(i=0;i<size_x;i++) scanf("%lf,%lf",&x[i].real,&x[i].img); /*检验输入的数据*/ printf("我输入的数据\n"); for(i=0;i<size_x;i++) printf("%4lf,+(%4lf)j\n",x[i].real,x[i].img); initW(); printf("Use FFT(0) or IFFT(1)?\n");

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算法
matlab实现fft算法_信息与通信_工程科技_专业资料。非直接调用matlab本身的fft函数,而是自己编写该程序,并且在设计的GUI界面上实现该算法 ...
FFT详解及MATLAB仿真
FFT详解及MATLAB仿真_信息与通信_工程科技_专业资料。FFT详解及MATLAB仿真 FFT 是离散傅立叶变换的快速算法,可以将一个信号变换 到频域。有些信号在时域上是很难看...
基于matlab的fft算法程序设计
课题名称 姓学学专名号院业 基于 matlabFFT 算法程序设计 指导教师 一、设计任务及要求: 设计任务: 设计利用 FFT 的算法程序画出对正弦信号进行频谱分析。...
实序列FFT算法的C语言实现
实序列FFT算法的C语言实现 - 实序列 FFT 算法的 C 语言实现 学生:XX 指导教师:XX 内容摘要:DFT 和 IDFT 是数字信号分析与处理中的一种重要运算和变换,但直接...
利用MATLAB编写FFT快速傅里叶变换
利用MATLAB编写FFT快速傅里叶变换_计算机软件及应用_IT/计算机_专业资料。数字信号处理实验报告 1.利用MATLAB编写FFT快速傅里叶变换。 2.比较编写的myfft程序运算...
FFTmatlab实例
FFTmatlab实例_计算机软件及应用_IT/计算机_专业资料。FFTmatlab中的几个实例 close all; %先关闭所有图片 Adc=2; %直流分量幅度 A1=3; %频率 F1 信号的幅度...
FFT算法(用matlab实现)
FFT算法(用matlab实现) - 数字信号处理实验报告 实验二 FFT 算法的 MATLAB 实现 (一)实验目的:理解离散傅立叶变换时信号分析与处理的一种重要变换,特别 是 FFT...
MATLAB中FFT使用详解
MATLAB 中 FFT 使用详解一.调用方法 X=FFT(x); X=FFT(x,N); x=IFFT(X); x=IFFT(X,N) 用 MATLAB 进行谱分析时注意: (1)函数 FFT 返回值的数据...
用matlab实现DFT FFT_图文
matlab实现DFT FFT - 用 matlab 实现 DFT FFT 目录 实验目的...
实验二 FFT算法的MATLAB实现
实验二 FFT 算法的 MATLAB 实现一、实验目的理解信号频谱概念和谱分析的原理与方法,了解快速傅立叶变换(FFT)可以提高运算 量的特点,并运用 Matlab 软件分别对离散...
更多相关标签: