T=xn(I+1);xn(I+1)=xn(J+1);xn(J+1)=T; end%算下一个倒序数 K=N/2; while J>=K; J=J-K;K=K/2; end J=J+K; end
disp('倒序后各存储单元的数据:'), disp(xn);
% 分级按序依次进行蝶形运算 for L=1:M;%分级计算
disp('运算级次:'),disp(L); B=2^(L-1);
for R=0:B-1;%各级按序蝶算 P=2^(M-L)*R;
for K=R:2^L:N-2;%每序依次计算
T=xn(K+1)+xn(K+B+1)*WN(P+1); xn(K+B+1)=xn(K+1)-xn(K+B+1)*WN(P+1); xn(K+1)=T; end end
disp('本级运算后各存储单元的数据:'),disp(xn); end
在主函数中调用myDitFFT(xn)函数实现DIT-FFT并和直接DFT运算结果做对比:
xn=[0,1,2,3,4,5,6,7]; myDitFFT(xn);
调用fft函数运算的结果: 1 至 7 列
28.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 + 1.6569i
-4.0000 + 0.0000i -4.0000 - 1.6569i -4.0000 - 4.0000i 8 列
-4.0000 - 9.6569i
调用myDitFFT(xn)函数运行的结果:输入到各存储单元的数据:
0 1 2 3 4 5 6 7
倒序后各存储单元的数据:
0 4 2 6 1 5 3 7 运算级次: 1
本级运算后各存储单元的数据:
4 -4 8 -4 10 -4
6 -4
运算级次: 2
本级运算后各存储单元的数据: 1 至 7 列
12.0000 + 0.0000i -4.0000 -4.0000 + 0.0000i -4.0000 16.0000 + 0.0000i -4.0000 -4.0000 + 0.0000i 8 列
-4.0000 - 4.0000i 运算级次: 3
本级运算后各存储单元的数据: 1 至 7 列
28.0000 + 0.0000i -4.0000 -4.0000 + 4.0000i -4.0000 -4.0000 + 0.0000i -4.0000 -4.0000 - 4.0000i
+ 4.0000i - 4.0000i + 4.0000i + 9.6569i + 1.6569i - 1.6569i
8 列
-4.0000 - 9.6569i
经对比可知DIT-FFT与直接DFT的运行结果完全相同。
四、总结
经过验证可发现DIT-FFT较直接DFT运算有着明显的优势,我们可以将这个函数运用在多个领域以简化运算,例如计算离散时间序列的卷积或计算IDFT时都可以应用到DIT-FFT算法,我感受到数字信号处理中科学思想的魅力。由于对设计思路的缺乏,我在设计程序时,在网络上查找了很多有关DIT-FFT的资料,经过学习他人的解决思路最后才整理出DIT-FFT的程序,在有些地方我自己理解的还不是很透彻,比如在实现数据倒序的程序我认为比较困难;当然即使自己想不到能学习一下别人的思路也是很好的,这个程序的代码量并不大,我自身的能力还很低,要在以后的学习中不断进步才能完成更加复杂的任务。这次课程设计让我对快速傅里叶变换有了更多的了解,也认识到了科学计算方法的重要性,我感
到很充实。
参考文献—— 百度百科;
按时间抽取的基2FFT算法分析及MATLAB实现[J].电子技术,2011(2)
数字信号处理 (第四版)西安电子科技大学出版社 高希全 丁玉美 编