数字信号处理3: 快速傅里叶变换(FFT)(含代码)

Posted zuguorui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字信号处理3: 快速傅里叶变换(FFT)(含代码)相关的知识,希望对你有一定的参考价值。

文章目录


在之前的文章《傅里叶变换》中,我们已经推导了连续傅里叶变换和离散傅里叶变换。由于计算机的发展,离散傅里叶变换(DFT)可谓是信号处理的杀手锏。但是离散傅里叶变换计算量巨大,通常在实时信号处理时是无法使用的,直到快速傅里叶变换(FFT)算法被发现。

与DFT不同,FFT是一种算法而非理论,因此它无法只靠一两个公式就描述出来。接下来我们从DFT出发进行FFT的推导。

当然,大多数人可能来看这个博客就只是为了寻找可用的FFT代码,但是肯定还有一些同学对这个过程会感到好奇,因此我还是先讲推导过程,代码在最后一部分。

1. FFT推导

首先大家应该还记得DFT的公式

X [ k w 0 ] = ∑ n = < N > x [ n ] e − j k w 0 n X[kw_0]=\\sum_n=<N>x[n]e^-jkw_0n X[kw0]=n=<N>x[n]ejkw0n

x [ n ] = 1 N ∑ k = < N > X [ k w 0 ] e j k w 0 n x[n]=\\frac1N\\sum_k=<N>X[kw_0]e^jkw_0n x[n]=N1k=<N>X[kw0]ejkw0n

其中, N N N为DFT长度,也就是多少个数据点, w 0 = 2 π / N w_0=2\\pi/N w0=2π/N为基波频率。首先从第一个公式开始。

为了方便表示,用 X [ k ] X[k] X[k]来表示这是DFT的第几个点(毕竟是离散的),对于DFT可以写成更具体的形式:
X [ k ] = ∑ n = 0 N − 1 x [ n ] e − j k w 0 n X[k]=\\sum_n=0^N-1x[n]e^-jkw_0n X[k]=n=0N1x[n]ejkw0n
这种形式是更符合计算机表示的。
将上式按照 n n n的奇偶性分成两部分:
X [ k ] = ∑ n = 0 N / 2 − 1 x [ 2 n ] e − j k w 0 ( 2 n ) + ∑ n = 0 N / 2 − 1 x [ 2 n + 1 ] e − j k w 0 ( 2 n + 1 )   = ∑ n = 0 N / 2 − 1 x [ 2 n ] e − j k w 0 ( 2 n ) + e − j k w 0 ∑ n = 0 N / 2 − 1 x [ 2 n + 1 ] e − j k w 0 ( 2 n )   = ∑ n = 0 N / 2 − 1 x [ 2 n ] e − j k 2 π N / 2 n + e − j k w 0 ∑ n = 0 N / 2 − 1 x [ 2 n + 1 ] e − j k 2 π N / 2 n X[k]=\\sum_n=0^N/2-1 x[2n]e^-jkw_0(2n)+\\sum_n=0^N/2-1x[2n+1]e^-jkw_0(2n+1)\\\\ \\space\\\\ =\\sum_n=0^N/2-1 x[2n]e^-jkw_0(2n)+e^-jkw_0\\sum_n=0^N/2-1x[2n+1]e^-jkw_0(2n)\\\\ \\space\\\\ =\\sum_n=0^N/2-1 x[2n]e^-jk\\frac2\\piN/2n+e^-jkw_0\\sum_n=0^N/2-1x[2n+1]e^-jk\\frac2\\piN/2n X[k]=n=0N/21x[2n]ejkw0(2n)+n=0N/21x[2n+1]ejkw0(2n+1) =n=0N/21x[2n]ejkw0(2n)+ejkw0n=0N/21x[2n+1]ejkw0(2n) =n=0N/21x[2n]ejkN/22πn+ejkw0n=0N/21x[2n+1]ejkN/22πn
注意 k k k的取值范围仍然是 [ 0 , N − 1 ] [0, N-1] [0,N1],但是由于
e − j ( k + N ) 2 π N n = e − j k 2 π N n ⋅ e − j 2 n π = e − j k 2 π N n e^-j(k + N)\\frac2\\piNn=e^-jk\\frac2\\piNn\\cdot e^-j2n\\pi=e^-jk\\frac2\\piNn ej(k+N)N2πn=ejkN2πnej2nπ=ejkN2πn
同理
e − j ( k + N / 2 ) 2 π N / 2 n = e − j k 2 π N / 2 n ⋅ e − j 2 n π = e − j k 2 π N / 2 n e^-j(k + N/2)\\frac2\\piN/2n=e^-jk\\frac2\\piN/2n\\cdot e^-j2n\\pi=e^-jk\\frac2\\piN/2n e快速傅里叶变化(FFT)含模板

快速傅里叶变换(FFT)

快速傅里叶变换(FFT)算法详解

Java快速傅里叶变换FFT的程序实现(时间抽取的基-2FFT倒位计算蝶形运算)

Java快速傅里叶变换FFT的程序实现(时间抽取的基-2FFT倒位计算蝶形运算)

快速傅里叶变换fft