matlab fft输出顺序,C语言Matlab实现FFT几种编程实例

《C语言Matlab实现FFT几种编程实例》由会员分享,可在线阅读,更多相关《C语言Matlab实现FFT几种编程实例(13页珍藏版)》请在人人文库网上搜索。

1、C语言、MATLAB实现FFT几种方法总结前人经验,仅供参考/一、/c语言程序/#include #include #include#define PI 3. /定义圆周率值#define FFT_N 128 /定义福利叶变换的点数struct compx float real,imag; /定义一个复数结构struct compx sFFT_N; /FFT输入和输出:从S1开始存放,根据大小自己定义/*函数原型:struct compx EE(struct compx b1,struct compx b2) 函数功能:对两个复数进行乘法运算输入参数:两个以联合体定义的复数a,b输出参数:a和。

2、b的乘积,以联合体的形式输出*/struct compx EE(struct compx a,struct compx b) struct compx c;c.real=a.real*b.real-a.imag*b.imag;c.imag=a.real*b.imag+a.imag*b.real;return(c);/*函数原型:void FFT(struct compx *xin,int N)函数功能:对输入的复数组进行快速傅里叶变换(FFT)输入参数:*xin复数结构体组的首地址指针,struct型*/void FFT(struct compx *xin)int f,m,nv2,nm1,i,。

3、k,l,j=0;struct compx u,w,t;nv2=FFT_N/2; /变址运算,即把自然顺序变成倒位序,采用雷德算法nm1=FFT_N-1; for(i=0;iN)break; %判断是否超出范围elsep=X(i1)*W;X(i1)=X(i)-p;X(i)=X(i)+p; %蝶形运算 endendW=W*dw; %蝶形运算系数的变化endendsubplot(2,2,1);t=0:0.:N*T;plot(t,sin(2*pi*f*t); %画原曲线subplot(2,2,2);stem(k,x); %画采样后的离散信号subplot(2,2,3);stem(k,abs(X)/ma。

4、x(abs(X); %画自己的fft的运算结果subplot(2,2,4);stem(k,abs(fft(x)/max(abs(fft(x); %调用系统的函数绘制结果,与自己的结果进行比较/三、/FFT的C语言算法实现/程序如下:/*FFT*/#include #include #include #define N 1000typedef structdouble real;double img;complex;void fft(); /*快速傅里叶变换*/ void ifft(); /*快速傅里叶逆变换*/ void initW();void change();void add(compl。

5、ex ,complex ,complex *); /*复数加法*/ void mul(complex ,complex ,complex *); /*复数乘法*/ void sub(complex ,complex ,complex *); /*复数减法*/ void divi(complex ,complex ,complex *);/*复数除法*/ void output(); /*输出结果*/complex xN, *W;/*输出序列的值*/int size_x=0;/*输入序列的长度,只限2的N次方*/double PI;int main()int i,method;system(cl。

6、s);PI=atan(1)*4;printf(Please input the size of x:n);/*输入序列的长度*/scanf(%d,&size_x);printf(Please input the data in xN:(such as:5 6)n);/*输入序列对应的值*/for(i=0;i0 ) j=j1; 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(+%.4fjn,xi.im。

7、g); else 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。

8、-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); /四、/%/选带傅里叶变换(zoom-fft) MATLAB%移频 (将选带的中心频率移动到零频)%数字低通滤波器 (防止频率混叠)%重新采样 (将采样的数据再次间隔采样,间隔的数据取决于分析的带宽,就是放大倍数)%复FFT (由于经过了移频,所以数据不是实数了)%频率调整 (将负半轴的频率成分移到正半轴)functionf,y=zfft。

9、(x,fi,fa,fs)%x为采集的数据%fi为分析的起始频率%fa为分析的截止频率%fs为采集数据的采样频率%f为输出的频率序列%y为输出的幅值序列(实数)f0=(fi+fa)/2;%中心频率N=length(x);%数据长度r=0:N-1;b=2*pi*f0.*r./fs;x1=x.*exp(-1j.*b);%移频bw=fa-fi;B=fir1(32,bw/fs);%滤波截止频率为0.5bwx2=filter(B,1,x1);c=x2(1:floor(fs/bw):N);%重新采样N1=length(c);f=linspace(fi,fa,N1);y=abs(fft(c)./N1*2;y=circshift(y,0,floor(N1/2);%将负半轴的幅值移过来end/%上边 四程序 测试应用实例:fs=2048;T=100;t=0:1/fs:T;x=30*cos(2*pi*110.*t)+30*cos(2*pi*111.45.*t)+25*cos(2*pi*112.3*t)+48*cos(2*pi*113.8.*t)+50*cos(2*pi*114.5.*t);f,y=zfft(x,109,115,fs);plot(f,y);/图片效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值