快速傅立叶变换(时域抽取基二 fft)
1. 编程思想
根据快速傅立叶变换的信号流图可知,可将整个过程中所有的数据组成一个二维
数组 data(N,M+1),数组共有 N 行,M+1 列(傅立叶变换分为 M=log2(N)级,再加上第
一级倒序数组输入,则共有 M+1 列)。除第一列单独赋值外,其余列则按照共同的规
律来赋值。这里则详细说明其的规律性。
(1)对于第 k 列(k>1):
可分为 2^(M+1-k)个计算单元,各计算单元间相互独立进行离散傅里叶变换。
(2)对于第 k 列的第 Mblock 个计算单元
该单元总共含有 2^(k-1)个数,数据的起始项是:data( (1+(Mblock-1)*2^(k-1)),k ),结
束项是 data( ( (Mblock)*2^(k-1)),k )
(3)每个计算单元又可分为 2^(k-2)个计算组,即蝶形单元
对于每个组可以运用蝶形运算
则第 k 列的第 Mblock 个计算单元的第 grop 个计算组的两个元素的下表分别为:
(Mblock-1)*2^(k-1)+grop 与
(Mblock-1)*2^(k-1)+grop+2^(k-2)
碟形单元所出现的系数为:
然后根据蝶形运算便可进行程序的编写。
通过上述方法在 MATLAB 下编程,大概在 35 行左右,还包括倒序的程序在里面。
MATLAB 程序清单:
%DIT(时间抽取的基二 FFT 算法程序)
%程序输入为 x(n),输出为 y(n),要求 n 是 2 的整数次幂
function y=b2fft(x)
N=length(x);
L=log2(N);
rev_x=zeros(1,N);
for m=0:N-1
bit_str=dec2bin(m); %将 i 变成 2 进制数,为倒序操作做准备 dec2bin()将十进制数变成二进制数,结
果为一字符串
if length(bit_str)<L
Z=zeros(1,(L-length(bit_str))); %保证倒序操作的成功,要求二进制位数始终是 N
Z_str=num2str(Z); %将数字变为字符串
bit_str=[Z_str,bit_str];
end
it_str=fliplr(bit_str); %fliplr 其作用是将一个数组的行倒置,而列的顺序则不变,倒置的意思是倒序显示