FFT算法的C语言实现

FFT算法的C语言实现

:数字信号处理


需要注意的几个点

整体实现
比特逆序
旋转因子
三大循环

算法原理

X ( k ) = ∑ n = 0 N − 1 x ( n ) × e − j 2 π N k n X(k) = \sum_{n=0}^{N-1} x(n)\times e^{-j\frac{2\pi}{N}kn} \\ X(k)=n=0N1x(n)×ejN2πkn
在将信号进行补零,变为偶数序列的时候
0 < = k < = N / 2 X ( k ) = X 1 ( k ) + W n k × X 2 ( k ) 0<=k<=N/2 \\ X(k) = X_1(k) + W_n^k\times X_2(k) 0<=k<=N/2X(k)=X1(k)+Wnk×X2(k)
再利用 W N k W_N^k WNk的可约性质,可以得到
0 < = k < = N / 2 X ( k + N 2 ) = X 1 ( k ) − W n k × X 2 ( k ) 0<=k<=N/2 \\ X(k+\frac{N}{2}) = X_1(k) - W_n^k\times X_2(k) 0<=k<=N/2X(k+2N)=X1(k)Wnk×X2(k)

一些重要的关系

关于蝶群和蝶形运算
FFT算法的C语言实现_第1张图片

对于图中表的红色方框的就是一个蝶群,可以看到一个蝶群中可能包含有多个蝶形,左边第一个蝶群中就是包含了一个蝶形,而右边包含了两个蝶形。
经过分析可以知道,如果以左边的输入序列为第0级,而最右边为第M级(假设序列的长度为2的M次幂),则可以知道第M级只有一个蝶群,这个蝶群中含有 2 ( m − 1 ) 2^(m-1) 2(m1)个蝶形和旋转因子。
经过分析可以看到第i级,有 2 M − i 2^{M-i} 2Mi个蝶群,比如以上图为例,第一级有 2 3 − 1 = 4 2^{3-1}=4 231=4个蝶群。

关于旋转因子的分析

我们知道对于每一级分解之后,关于$W_N^k$中的N的值是不断变化的,从最后一级来分析。

N = 2 M W N k = e − j 2 π 2 M n k N = 2^M \\ W_N^k = e^{-j\frac{2\pi}{2^M}nk} N=2MWNk=ej2M2πnk
对于倒数第二级
N = 2 ( M − 1 ) W N k = e − j 2 π 2 ( M − 1 ) n k N = 2^(M-1) \\ W_N^k = e^{-j\frac{2\pi}{2^(M-1)}nk} N=2(M1)WNk=ej2(M1)2πnk

对于第i级
N = 2 ( M − ( M − i ) ) W N k = e − j 2 π 2 ( M ( M − i ) ) n k = e − j 2 π 2 i N = 2^(M-(M-i)) \\ W_N^k = e^{-j\frac{2\pi}{2^(M(M-i))}nk} \\ = e^{-j\frac{2\pi}{2^i}} N=2(M(Mi))WNk=ej2(M(Mi))2πnk=ej2i2π

于是可以得到一个普遍的规律,对于第i级的旋转因子为
W N k = e − j 2 π 2 i W_N^k = e^{-j\frac{2\pi}{2^i}} WNk=ej2i2π

编程主要使用到了三大循环

最外层的循环:级数的循环
中间的循环:旋转因子的个数(也是每一个蝶群中,蝶形的个数)
最内层的循环:一个旋转因子需要给多少个蝶群使用。

void fft(complexNumber* sequence, int order, int length, complexNumber * result)
{
int i, j, k;
copyComplex(sequence, length, result);
//THE FIRST LOOP 
for(i=0; i

}

这里仍然有很多需要注意的细节,比如关于逆序的时候,我们需要首先判断需要使用多少位宽的空间来存放数据,然后才能进行逆序,如果直接使用一个固定的位宽来进行逆序,那么除非你将所有的输入的序列继续补零到固定的值,然后再对这个整体的数据进行逆序,否则就是错误的,但是如果补零到固定的个数,那么就对造成浪费,而且fft的点数也就确定了。
**还有一个需要注意的点是,相邻两个蝶群的距离是多少,为什么需要这个参数呢?因为只有得到这个参数之后,我们才能知道同一个旋转因子,下一次需要的位置, 2 i 2^i 2i,就是总共旋转因子个数(一个蝶群中蝶形的个数)的二倍。

结果展示

FFT算法的C语言实现_第2张图片

使用matlab的标准结果
FFT算法的C语言实现_第3张图片

源码,在上传的资源中。有任何问题欢迎交流。
源码地址

你可能感兴趣的:(dsp_matlab,算法,dsp,c)