Fourier Series, Fourier Transform, DFT, FFT

Table of Contents

1. 傅里叶级数和变换简介

法国数字家傅里叶(Jean-Baptiste Joseph Fourier)被世人铭记的最大贡献记载在他于 1807 年发表的传记中和 1822 年出版“Théorie analytique de la chaleur(热分析理论)”的一书中。傅里叶在这个领域的贡献是, 他指出任何“周期函数”都可以表示为不同频率的正弦和(或)余弦之和的形式,每个正弦项和(或)余弦项乘以不同的系数。现在,该和称为傅里叶级数(Fourier series)。 这个概念出现后,在当时遭到了怀疑,因为它不直观。

甚至,非周期函数(但该曲线下的面积是有限的)也可以用“正弦和(或)余弦乘以加权函数”的积分来表示。这种情况下的公式就是傅里叶变换(Fourier transform),其作用在多数理论和应用学科中甚至远大于傅里叶级数。

参考:信号与系统(第二版,郑君里)

1.1. 数学基础知识回顾——复数

后文会用到复数,这里回顾一下关于复数的基本知识。

复数 C 的定义如下: C=R+jI 其中, RI 是实数, R 表示复数的实部, I 表示复数的虚部。 j 是虚数单位,即 j=1 (注:数字上常用 i 表示虚数单位,这里用 j 是按照电工学中通常的习惯)。

一个复数 C 的共轭(Complex conjugate)表示为 C ,其定义为:C=RjI 复数从几何的角度可以被看成是平面(称为复平面)上的一个点,其横坐标是实轴( R 的值),其纵坐标是虚轴( I 的值)。也就是说,复数 R+jI 是复平面直角坐标系统中的点 (R,I)

有时,在极坐标下表示复数很有用: C=|C|(cosθ+jsinθ) 其中, |C|=R2+I2 是复平面的原点到点 (R,I) 的向量的长度, θ 是该向量与实轴的夹角。

利用欧拉公式(Euler’s formula): ejθ=cosθ+jsinθ 极坐标下复数又可以表示(称为指数形式的表示)为: C=|C|ejθ

例如,复数 1+j2 的极坐标表示是 5ejθ ,其中 θ=64.4

前面的公式还可以用于复函数。例如,变量 u 的复函数 F(u) 可表示为 F(u)=R(u)+jI(u) ,其中 R(u)I(u) 分别是实分量函数和虚分量函数。复共轭函数是 F(u)=R(u)jI(u)

2. 傅里叶级数

2.1. 傅里叶级数基本定义

法国数字家傅里叶发现, 具有周期 T 的连续变量 t 的周期函数 f(t) 可以被描述为乘以适当系数的正弦和余弦和。 这个和就是傅里叶级数,它具有如下形式:

f(t)=a0+a1cos(2πTt)+b1sin(2πTt)+a2cos(22πTt)+b2sin(22πTt)++ancos(n2πTt)+bnsin(n2πTt)(傅里叶级数的三角形式)=a0+n=1[ancos(n2πTt)+bnsin(n2πTt)],(n=1,2,)

其中,各个系数可按以下各式计算。
直流分量:
a0=1Tt0t0+Tf(t)dt
余弦分量的幅度:
an=2Tt0t0+Tf(t)cos(n2πTt)dt,(n=1,2,)
正弦分量的幅度:
bn=2Tt0t0+Tf(t)sin(n2πTt)dt,(n=1,2,)
为方便起见,通常积分区间 t0t0+T 取为 0T 或者 T2T2

说明:并非任意周期信号都能进行傅里叶级数展开,需要满足一定的条件才能进行傅里叶级数展开。不过,在实践中,这些条件一般都会满足,这点不介绍这些条件。

2.1.1. 实例:求周期锯齿脉冲信号的傅里叶级数展开

求周期函数 s(x) (如图 1 所示,它是周期锯齿脉冲信号)的傅里叶级数表示。

fourier_sawtooth_wave.png

Figure 1: Sawtooth wave, s(x)=x/π on the interval (π,π]

函数 s(x) 的周期为 T=2π ,傅里叶级数中直流分量,余弦分量的幅度,正弦分量的幅度分别计算如下。
a0=12πππs(x)dx=0an=22πππs(x)cos(nx)dx=0,(n=1,2,)bn=22πππs(x)sin(nx)dx=2(1)n+1πn,(n=1,2,)
把上面系数代入到傅里叶级数展开式中,可得:
s(x)=a0+n=1[ancos(n2πTx)+bnsin(n2πTx)]=2πn=1(1)n+1nsin(nx)=2π[sin(x)12sin(2x)+13sin(3x)14sin(x)+]

由上式知,傅里叶级数展开后,要无限多项才能完全逼近原函数。实际应用中,经常采用有限项级数来代替无限项级数。如,取前 1 到 5 个正弦项,如图 2 所示。

fourier_sawtooth_wave_partial_fourier_series.gif

Figure 2: 取前 1 到 5 个正弦项来近似 Sawtooth wave

2.1.1.1. 函数对称性与傅里叶系数的关系

通过前面例子,可知周期锯齿脉冲信号(如图 1 所示,它是奇函数)仅含正弦分量。这不是巧合,利用“正弦函数为奇函数,余弦函数为偶函数”以及奇偶函数的性质,我们容易推导出更一般的结论:
奇函数的傅里叶级数展开后,直流分量和余弦分量为零,只含正弦分量。
偶函数的傅里叶级数展开后,正弦分量为零,只含直流分量和余弦分量。

2.2. 傅里叶级数的另一种常见三角形式(幅度谱,相位谱)

如果将前面介绍的傅里叶级数中“同频率项合并”,傅里叶级数还可以写为另一种形式:

(傅里叶级数的另一种常见三角形式)f(t)=c0+n=1cncos(n2πTt+φn)

或者写为:
f(t)=d0+n=1dnsin(n2πTt+θn)
各个系数为( a0,an,bn,n=1,2, 的计算公式前面已经介绍过):
c0=d0=a0cn=dn=an2+bn2,(n=1,2,)tanφn=bnantanθn=anbn

通常把频率为 1/T (此时角频率为 2πTn=1 )的分量称为“基波”,把频率为 2/T (角频率为 4πT )、 3/T (角频率为 6πT )等的分量称为“二次谐波”,“三次谐波”等。

显然,各分量幅度( cndn )及相位( φnθn )确定下来后,周期函数的傅里叶级数展开就确定了。

我们把幅度 cn 和角频率 2πnT 之间的关系图称为幅度频谱(简称幅度谱),把相位 φn 和角频率 2πnT 之间的关系图称为相位频谱(简称相位谱)。

fourier_magnitude_and_phase.jpg

Figure 3: 某周期函数的傅里叶“幅度谱”和“相位谱”

不过,很多时候,相位谱不是很重要,常常直接忽略它。

2.3. 傅里叶级数的指数形式

设周期函数 f(t) 的周期为 T ,记其角频率 ω1=2π/T ,下面将从傅里叶级数的基本定义推导出傅里叶级数的指数形式。
由欧拉公式可知 cos(nω1t)=12(ejnω1t+ejnω1t),sin(nω1t)=12j(ejnω1tejnω1t) ,把这两个式子代入到前面介绍的傅里叶级数基本定义中,有:
f(t)=a0+n=1[ancos(nω1t)+bnsin(nω1t)]=a0+n=1(anejnω1t+ejnω1t2+bnejnω1tejnω1t2j)=a0+n=1(12(anjbn)ejnω1t+12(an+jbn)ejnω1t)

F(nω1)=12(anjbn) ,由于 ann 的偶函数, bnn 的奇函数,可知 F(nω1)=12(an+jbn) ,从而上式可接着变形为:
f(t)=a0+n=1(F(nω1)ejnω1t+F(nω1)ejnω1t)
F(0)=a0 ,考虑到: n=1F(nω1)ejnω1t=n=1F(nω1)ejnω1t ,从而上式可接着变形为:
f(t)=n=F(nω1)ejω1t
一般我们把 F(nω1) 简写为 Fn ,上式即为 周期函数 f(t) (设周期为 T )的傅里叶级数的指数形式 :

(傅里叶级数的指数形式)f(t)=n=Fnejω1t

其中,
ω1=2πTFn=1Tt0t0+Tf(t)ejnω1tdt,(n=0,±1,±2,)
通常积分区间 t0t0+T 取为 0T 或者 T2T2

显然,如果给出 Fn ,则 f(t) 唯一确定。在傅里叶级数的指数形式中傅里叶系数 Fn 不再是实数,而是复数,有模有辐角。

注: Fn 的推导过程如下: Fn=12(anjbn)=1Tt0t0+Tf(t)cos(nω1t)dtj1Tt0t0+Tf(t)sin(nω1t)dt=1Tt0t0+Tf(t)ejnω1tdt,(n=0,±1,±2,)

傅里叶级数的指数形式中系数 Fn 和傅里叶级数的三角形式中的幅度 cn 和相位 φn 的关系如下:
F0=c0Fn=|Fn|ejφn,(n=1,2,)Fn=|Fn|ejφn,(n=1,2,)|Fn|=|Fn|=12cn,(n=1,2,)

2.3.1. 复数频谱(复数幅度谱,复数相位谱)

我们可以画出傅里叶级数指数形式表示的信号频谱。因为 Fn 一般是复函数,所有称这种频谱为复数频谱。根据 Fn=|Fn|ejφn ,可以画出“复数幅度谱”为“复数相位谱”,如图 4 所示。

fourier_complex_spectrum.jpg

Figure 4: 周期函数的复数频谱示例

由于, |Fn|=|Fn|=12cn ,所以复数幅度谱是相对纵轴左右对称的。在三角函数的频谱(如图 3 )中每条谱线代表一个分量的幅度;在指数形式的频谱(如图 4 )中每个分量的幅度一分为二,在正、负频率相对应的位置上各为一半,所以,只有把正、负频率上对应的这两条谱线加起来才代表一个分量的幅度。

需要说明的是, 在复数频谱中出现的负频率是由于将 sin(nω1t)cos(nω1t) 写成指数形式时,从数字的观点自然分成 ejnω1t 以及 ejnω1t 两项,因而引入了 jnω1t 项,所以,负频率的出现完全是数学运算的结果,并没有任何物理意义。

Fn 为实数的特殊情况下,显然相位不是 0 就是 π ,可以用 Fn 的正负分别表示相位 φn 为 0 和 π ,这时经常把幅度谱和相位谱画在同一张图上(而不是两张图)。后文将介绍这样的例子。

2.4. 实例:求周期矩形脉冲信号的傅里叶频谱

设周期矩形脉冲信号(又称为方波信号) f(t) 的脉冲宽度为 τ ,脉冲幅度为 E ,重复周期为 T (显然角频率 ω1=2π/T ),如图 5 所示。求其傅里叶频谱。

fourier_ones.jpg

Figure 5: 周期矩形脉冲信号

直流分量 a0 ,余弦分量的幅度 an ,正弦分量的幅度 bn 分别计算如下。
a0=1TT/2T/2f(t)dt=1TT/2T/2Edt=EτTan=2TT/2T/2f(t)cos(nω1x)dt=2Enπsin(nπτT),(n=1,2,)bn=2TT/2T/2f(t)sin(nω1x)dt=0,(n=1,2,)
从而可求得 c0,cn,φn(n=1,2,) 以及 Fn,(n=0,±1,±2,)

其指数形式傅里叶级数幅度和相位如图 6 所示。

fourier_ones_spectrum.jpg

Figure 6: 方波信号指数形式傅里叶级数幅度谱和相位谱

由于, Fn 在这个例子中恰为实数(一般情况 Fn 为复数),此时相位不是 0 就是 π ,可以用 Fn 的正负分别表示相位 φn 为 0 和 π ,这时我们可以把幅度谱和相位谱画在同一张图上,如图 7 所示。

fourier_ones_spectrum_merge.jpg

Figure 7: 方波信号指数形式傅里叶级数幅度谱和相位谱(合画图)

3. 傅里叶变换

前面介绍了连续“周期信号”的傅里叶级数,并得到了它的离散频谱。对于连续“非周期信号”,没有傅里叶级数,但可以推导出“傅里叶变换”。

由傅里叶级数的定义可知,对于周期为 T 的周期信号,离散频谱各个分量出现在 ω1,2ω1,3ω1,,(ω1=2π/T) 处。显然, 当周期 T 越大,离散频谱的各个分量会越靠近(因为 ω1 会越小);当周期 T 时(这时就是非周期信号),频谱会变为连续的。 以方波信号为例,其变化趋势如图 8 所示。

fourier_various_T.gif

Figure 8: 当周期信号的周期 T 越大时,离散频谱的各个分量会越靠近

3.1. 傅里叶变换定义

由前面的分析知,通过极限的方法,我们可以从周期信号的傅里叶级数导出非周期信号频谱的表示式,这称为傅里叶变换(Fourier transform)。在这里,不严格推导,直接给出非周期信号傅里叶变换的公式。

非周期信号 f(t) 的傅里叶变换为:

(傅里叶变换)F(ω)=F[f(t)]=f(t)ejωtdt

对应的傅里叶逆变换为:

(傅里叶逆变换)f(t)=F1[F(ω)]=12πF(ω)ejωtdt

式中, F(ω)f(t) 的频谱函数,它一般是复函数,可以写作:
F(ω)=|F(ω)|ejφ(ω)
其中 |F(ω)|F(ω) 的模,它代表信号中各频率分量的相对大小, φ(ω)F(ω) 的相位函数,它表示信号中各频率分量之间的相位关系。类似地, |F(ω)|ωφ(ω)ω 曲线分别称为非周期信号的幅度频谱与相位频谱。

3.2. 实例:求单边指数信号的傅里叶变换

已知,单边指数信号的表示式为:
f(t)={eat(t0)0(t<0)
其中 a 为正实数。

单边指数信号的傅里叶变换推导如下:
F(ω)=f(t)ejωtdt=0eatejωtdt=0e(a+jω)tdt=1a+jω
从而:
|F(ω)|=1a2+ω2φ(ω)=arctan(ωa)
单边指数信号的波形及频谱如图 9 所示。

fourier_transform_example.jpg

Figure 9: 单边指数信号的波形及频谱

3.3. 卷积定理(Convolution theorem)

对于任意两个信号 f1(t)f2(t) ,两者做卷积运算定义为:
f1(t)f2(t)=f1(τ)f2(tτ)dτ

时域卷积定理:
设函数 f1(t)f2(t) 的傅里叶变换为 F1(ω)F2(ω) ,则:

(时域卷积定理)F[f1(t)f2(t)]=F1(ω)F2(ω)

证明如下:
F[f1(t)f2(t)]=[f1(τ)f2(tτ)dτ]ejωtdt=f1(τ)[f2(tτ)ejωtdt]dτ=f1(τ)F2(ω)ejωtdτ=F2(ω)f1(τ)ejωtdτ=F2(ω)F1(ω)
它说明: 时域中两信号的卷积等效于在频域中频谱相乘。

频域卷积定理:

(频域卷积定理)F[f1(t)f2(t)]=12πF1(ω)F2(ω)

频域卷积定理的证明过程和时域卷积定理的证明过程类似,这里不再重复。

4. 离散傅里叶变换

设有限长序列 x(n) 长度为 N (在 0nN1 范围内),它的离散傅里叶变换(Discrete Fourier Transform, DFT) X(k) 仍然是一个长度为 N (在 0nN1 范围内)的频域有限长序列。
离散傅里叶变换为:

(离散傅里叶变换, DFT)X(k)=DFT[x(n)]=n=0N1x(n)Wnk(0kN1)

离散傅里叶逆变换为:

(离散傅里叶逆变换, IDFT)x(n)=IDFT[X(k)]=1Nk=0N1X(k)Wnk(0nN1)

其中, WN=ej(2π/N) ,如果所讨论的问题中不涉及 N 的变动,可省略下标,简写为 W=ej(2π/N)

4.1. 矩阵形式的离散傅里叶变换

前面介绍的离散傅里叶变换及逆变换的公式可以写为矩阵形式。
离散傅里叶变换的矩阵形式:
[X(0)X(1)X(N1)]=[W0W0W0W0W0W1×1W2×1W(N1)×1W0W1×(N1)W2×(N1)W(N1)×(N1)][x(0)x(1)x(N1)]

离散傅里叶逆变换的矩阵形式:
[x(0)x(1)x(n1)]=1N[W0W0W0W0W0W1×1W1×2W1×(N1)W0W(N1)×1W(N1)×2W(N1)×(N1)][X(0)X(1)X(N1)]

上面两个公式简写为:

(离散傅里叶变换的矩阵形式)X(k)=Wnkx(n)


(离散傅里叶逆变换的矩阵形式)x(n)=1NWnkX(k)

此处, X(k)x(n) 分别为 N 列的列矩阵,而 WnkWnk 分别为 N×N 方阵(这两个方阵都是对称矩阵)。

4.2. 实例:求有限序列的离散傅里叶变换


例:求 x(n)={1,1,1,1} (如图 10 (a)所示)的离散傅里叶变换,再由离散傅里叶逆变换求得 x(n) ,验证结果的正确性。
N=4 得到 W1=ej(2π/4)=j ,直接应用离散傅里叶变换公式,有:
[X(0)X(1)X(2)X(3)]=[W0W0W0W0W0W1W2W3W0W2W4W6W0W3W6W9][x(0)x(1)x(2)x(3)]=[11111j1j11111j1j][1111]=[4000]

离散傅里叶逆变换为:
[x(0)x(1)x(2)x(3)]=14[W0W0W0W0W0W1W2W3W0W2W4W6W0W3W6W9][4000]=[1111]
显然,通过离散傅里叶逆变换可求得原始信号。

fourier_DFT_example.jpg

Figure 10: 离散傅里叶变换实例

说明:在这个例子中,离散傅里叶变换得到的序列恰好都为实数。不过,离散傅里叶变换得到的序列一般为复数,比如 x(n)={1,2,3,4} 的离散傅里叶变换是一个复数序列,计算如下:
[X(0)X(1)X(2)X(3)]=[W0W0W0W0W0W1W2W3W0W2W4W6W0W3W6W9][x(0)x(1)x(2)x(3)]=[11111j1j11111j1j][1234]=[102+j222j2]

4.3. 快速傅里叶变换(FFT)

快速傅里叶变换(Fast Fourier transform, FFT)是一种计算离散傅里叶变换的快速算法。

4.3.1. DFT 的计算量

我们先来了解一下 DFT 的计算量。
由 DFT 定义知,将 x(n)Wnk 两两相乘再取和即可得到 X(k) ,即每计算一个 X(k) 值需要进行 N 次复数相乘(一个复数乘法包括 4 个实数乘法和 2 个实数加法),和 N1 次复数相加。对于 NX(k) 点,应重复 N 次上述运算。因此, 要完成全部 DFT 运算共需 N2 次复数乘法和 N(N1) 次复数加法。
例如,当 N=4 时,DFT 的矩阵表示式为:
[X(0)X(1)X(2)X(3)]=[W0W0W0W0W0W1W2W3W0W2W4W6W0W3W6W9][x(0)x(1)x(2)x(3)]
显然,求每个 X(k) 值,需要 N=4 次复数乘法和 N1=3 次复数加法,要完成全部 DFT 运算共需 N2=16 次复数乘法和 N(N1) 次复数加法。
随着 N 值增大,运算工作量将迅速增长,例如 N=10 时需要 100 次复数乘法,而当 N=1024 时,就需要 1048576(一百多万次)次复数乘法运算。所以,当 N 较大时,DFT 的计算量太大,无法对信号进行实时处理。因此,我们需要一种更快的算法来计算 DFT。

4.3.2. Cooley–Tukey FFT algorithm

从 FFT 算法诞生至今,有很多改进和派生的离散傅里叶变换快速算法。最基本的 FFT 是库利-图基 FFT 算法(Cooley–Tukey FFT algorithm)。

库利-图基 FFT 算法描述(这里不证明它的正确性,直接给出结论)如下:
设序列 x(n) 的点数 N 为 2 的整数次幕(即 N=2LL 为整数,如果不满足这个条件,可以人为地加上若干 0 值点,使之达到这一要求)。将 x(n),(n=0,1,,N1) 先按 n 的偶数子序列和奇数子序列分成以下两组:
x1(r)=x(2r),(r=0,1,,N21)x2(r)=x(2r+1),(r=0,1,,N21)
X1(k)X2(k) 分别是 x1(r)x2(r)N/2 点 DFT, WNk=ej(2π/N)k ,则 x(n) 的离散傅里叶变换的前 N/2 个值和后 N/2 个值可分别由下面式子(FFT 核心公式)求得:
X(k)=X1(k)+WNkX2(k),(k=0,1,,N21)X(k+N2)=X1(k)WNkX2(k),(k=0,1,,N21)
这样,只要求得 0 到 N21 区间的 X1(k)X2(k) 值,就可以求出 0 到 N1 区间内的所有 X(k) 值,显然,这是一种分治策略。对于子序列 X1(k)X2(k) 的求解可以使用同样的思路。图 11 表示了 FFT 算法中利用两个子序列的 DFT 求得整个序列的 DFT 的过程。

fourier_FFT.jpg

Figure 11: FFT 算法,蝶形信号流图(支路上没有系数时表示该支路传输系数为 1)

参考:
《信号与系统(郑君里,第二版,下册)》9.6 节 快速傅里叶变换
《数字信号处理教程(第三版,程佩青)》第四章 快速傅里叶变换

4.3.3. 实例:用 FFT 算法计算 DFT

用 FFT 算法求解 x(n)={1,2,3,4} 的 DFT。

这个例子中 N=4 ,设其偶数子序列 x1(n)={1,3} 的 DFT 为 X1(k) ,奇数子序列 x2(n)={2,4} 的 DFT 为 X2(k) ,直接利用 FFT 算法公式有:
X(0)=X1(0)+W40X2(0)X(1)=X1(1)+W41X2(1)X(2)=X1(0)W40X2(0)X(3)=X1(1)W41X2(1)

X1(k)X2(k) 如何求解呢?也可以用 FFT 算法,但序列已经很短了,直接用 DFT 原始定义公式即可:
X1(0)=x(0)+W20x(2)=1+3=4X1(1)=x(0)W20x(2)=13=2X2(0)=x(1)+W20x(3)=2+4=6X2(1)=x(1)W20x(3)=24=2

从而, N=4 时 FFT 算法如图 12 所示。

fourier_FFT_example.jpg

Figure 12: N=4 时 FFT 算法

容易算得 W40=1,W41=ej(2π/4)=j ,从而:
X(0)=X1(0)+W40X2(0)=4+6=10X(1)=X1(1)+W41X2(1)=2+(j)(2)=2+2jX(2)=X1(0)W40X2(0)=46=2X(3)=X1(1)W41X2(1)=2(j)(2)=22j

这个结果和不使用 FFT 算法,直接使用 DFT 定义公式得到的结果一样(参见 4.2 )。

4.3.4. FFT 的计算量

FFT 把一个 N 点的 DFT 分解为两个 N/2 点 DFT,如果直接计算 N/2 点 DFT,则由前面分析知一个 N/2 点 DFT 需要 (N2)2=N24 次复数乘法, N2(N21) 次复数加法,两个 N/2 点 DFT,则共需要 2×(N2)2=N22 将复数乘法和 N(N21) 次复数加法。此外把两个 N/2 点 DFT 合成 N 点 DFT 时,还需要 N2 次复数乘法和 N 次复数加法。所以总共需要 N22+N2=N(N+1)2N22 次复数乘法和 N(N21)+N=N22 次复数加法。因些,通过把一个 N 点的 DFT 分解为两个 N/2 点 DFT 后,运算的计算量差不多减少到一半。

显然,对于分解的两个 N/2 点 DFT,我们不用直接计算,可以再次利用 FFT。从而 N 点 FFT 的运算量会进一步减少。通过更细致的分析可以 FFT 的复数乘法次数是 N2log2N ,从而直接计算 DFT 与 FFT 算法的计算量(只考虑了复数乘法)之比为:
N2N2log2N=2Nlog2N
直接计算 DFT 与 FFT 算法的计算量(只考虑了复数乘法)与序列点数 N 的关系曲线如图 13 所示。

fourier_FFT_vs_DFT.jpg

Figure 13: 直接计算 DFT 与 FFT 算法的计算量(只考虑了复数乘法)的比较

4.3.5. FFT 逆变换(快速计算离散傅里叶逆变换)

如何快速地求解离散傅里叶逆变换(IDFT)呢?

我们观察一下离散傅里叶逆变换(IDFT)的公式:
x(n)=IDFT[X(k)]=1Nk=0N1X(k)Wnk(0nN1)
与离散傅里叶变换(DFT)公式:
X(k)=DFT[x(n)]=n=0N1x(n)Wnk(0kN1)
比较两个公式可知,只要把 DFT 运算中的每一个系数 Wnk 换成 Wnk ,最后再乘以常数 1/N ,则 FFT 算法就可以用来运算 IDFT 了。但这需要稍微调整 FFT 程序代码。

下面讨论一种完全不用改变 FFT 的程序就可以快速计算 IDFT 的方法。对 IDFT 公式取共轭:
x(n)=1Nk=0N1X(k)Wnk
从而:
x(n)=1N[k=0N1X(k)Wnk]=1N[DFT[X(k)]]

这说明, 只要先将 X(k) 取共轭,就可以直接利用 FFT 程序,最后再将运算结果取一次共轭,并乘以 1/N ,即得 x(n) 值。 因此,FFT 运算和 IFFT(Inverse Fast Fourier Transform)运算就可以共用一个子程序模块了,这样就很方便了。

Author: cig01

Created: <2016-07-02 Sat>

Last updated: <2018-01-02 Tue>

Creator: Emacs 27.1 (Org mode 9.4)