您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Matlab里的fft是如何计算的?补零fft是否必要?
Matlab里的fft是如何计算的?补零fft是否必要?Matlab里的fft事如何计算的?与Dft的结果是否相同?补零fft是否必要?下面通过实验分析,结果如下:在matlab中不论数据长度是否是2的整次幂,dft和fft的结果都是相同的。Dft的标准角频率是以2π为周期的,若以π为周期,其效果等同于原始信号补一半零,再做dft变换,不会提高频率分辨率.........。Matlab中的fft变换,对于数据长度2的整次幂当然是基2的fft。但是对于长度非2的整次幂数据,其过程是多种混合基的混合运算,其结果当然与dft相同。绝对不是补零到2的整次幂再进行傅里叶变换,那样会漏掉特征(如图中曲线7)。但是对于补零原始数据的整倍数后,再抽样不会繁盛畸变,与直接fft变换结果一样(如图中曲线2、3、4)将原始数据补零后再抽取需要点数的做法不可取,不仅不能增加频率分辨率,还会引起较大畸变,就算是补原始数据点的整数倍零,其结果也是只与不补零的效果相同。下图为matlab仿真图,原始数据400点曲线1:dft计算时旋转因子周期定为π(标准以2π为周期)曲线2:fft补一半零达到2倍原数据长度的fft变换,向上偏移10曲线3:2倍原数据长度的fft变换,向上偏移20。曲线4:dft补一半零达到2倍原数据长度的dft变换,向上偏移30曲线5:标准fft曲线;曲线6:标准dft曲线;曲线7:原始数据400点补零到512点,傅里叶变换后再抽取400点的曲线。functionxk=dft(xn)%dftN=length(xn);n=0:(N-1);WN=exp(-j*2*pi*n/N);%旋转因子fori=1:Ntemp=0;fork=1:Ntemp=temp+xn(k)*(WN(i)^(k-1));endxk(i)=temp;end上述Dft函数。Matlab中dft与fft结果完全相同(曲线5和6),matlab的fft不是基2的而是基于多混合基分解的。图中第一条曲线是基于函数:functionxk=m_dft_test(xn)%dftN=length(xn);n=0:(N-1);k=n;WN=(-j*pi*n/N);%旋转因子W=exp(WN'*n);fori=1:Nxk(i)=sum(xx.*W(i,:));end旋转因子以π为周期的,其效果相当于为原始信号补一半零,再做dft变换。如图中曲线1和曲线4(偏移30为方便观察,否则完全覆盖)。若不作偏移,曲线1、2、3、4完全相同,曲线5和6完全相同.曲线7进行整次幂变换之后再抽样,结果丢失了频谱的重要信息,致使频谱发生了较大的畸变,但是对于补零原始数据的整倍数后,再抽样不会繁盛畸变,与直接fft变换结果一样。补零fft函数如下:functionxk=fft_test(xn)%dftN=length(xn);pp=1;while(ppN)pp=pp*2;endcc=zeros(pp,1);fori=1:Ncc(i)=xn(i);endyy=fft(cc);step=pp/N;fori=1:Nxk(i)=yy(floor(1+step*(i-1)));end总测试程序源代码如下:clear;fs=100;Tp=4;f=1;N=1*Tp*fs;n=[0:N-1]/fs;x=3.4*cos(2*pi*f*n)+2.7*cos(4*pi*f*n)+2.5*sin(7*pi*f*n);sss=abs(m_dft_test(x));cc=zeros(2*length(n),1);fori=1:length(n)cc(i)=x(i);endsss1=abs(fft(cc));sss2=abs(fft(x,2*length(n)));sss3=abs(dft(cc));sss4=abs(fft(x));sss5=abs(dft(x));sss6=abs(fft_test(x));xx1=0:length(n)-1;xx2=0:2:799;plot(xx1,sss,xx1,sss1(1:length(n))+10,xx1,sss2(1:length(n))+20,xx1,sss3(1:length(n))+30,xx2,sss4,xx2,sss5+10,xx2,sss6),gridlegend('dftpi','fft补零一半','fft两倍长度','dft补零一半','fft原始','dft原始','fft补零到2的n次方再抽取');
本文标题:Matlab里的fft是如何计算的?补零fft是否必要?
链接地址:https://www.777doc.com/doc-5830682 .html