之前已经详细介绍了连续时间信号的傅里叶变换的推导过程,是由连续时间信号的傅里叶级数推导出来的。在前面 那个系列 的文章中,尽管没有太过于强调“连续时间”这几个字,但通篇的叙述都是默认把信号当做是连续时间信号来处理的。但现实是,计算机不能无线密集地存储一段连续时间信号,也不能处理连续时间信号,因此必须将信号进行离散化,把连续时间信号离散化的手段是对其进行取样。而如何得到离散时间信号(简称离散信号)的傅里叶变换是工程应用上非常关注的,那么是不是可以对离散信号求傅里叶级数,然后类比推导出离散时间的傅里叶变换呢?
对于一个离散信号 x [ n ] x[n] x[n] , 若有:
x [ n ] = x [ n + N ] x[n] = x[n+N] x[n]=x[n+N]
则表明 x [ n ] x[n] x[n] 是一个周期为 N N N 的信号,而信号的基波周期就是使上式成立的最小正整数 N N N , ω 0 = 2 π / N \omega_0=2\pi/N ω0=2π/N 就是基波角频率。例如,复指数信号 e j ( 2 π / N ) n e^{\:j(2\pi/N)n} ej(2π/N)n 是周期的,周期为 N N N 。而且,由下式
ϕ k [ n ] = e j k ω 0 n = e j k ( 2 π / N ) n , k = 0 , ± 1 , ± 2 , . . . \phi_k[n]=e^{jk\omega_0n}=e^{jk(2\pi/N)n}, \qquad k=0,\pm1,\pm2,... ϕk[n]=ejkω0n=ejk(2π/N)n,k=0,±1,±2,...
给出的所有离散时间复指数信号的集合都是周期的,且 N N N 是集合中的任一元素的周期(但不一定是某些元素的最小正周期)。 ϕ k [ n ] \phi_k[n] ϕk[n] 中的全部信号,其基波频率都是 2 π / N 2\pi/N 2π/N 的整数倍,因此他们之间是成谐波关系的。且我们可以发现,在 ϕ k [ n ] \phi_k[n] ϕk[n] 这个信号集中,只有 N N N 个信号是不同的。这是由于在频率上相差 2 π 2\pi 2π 的整数倍的离散时间复指数信号都是一样的。具体而言, ϕ 0 [ n ] = ϕ N [ n ] , ϕ 1 [ n ] = ϕ N + 1 [ n ] \phi_0[n]=\phi_N[n],\: \phi_1[n]=\phi_{N+1}[n] ϕ0[n]=ϕN[n],ϕ1[n]=ϕN+1[n] ,以及一般关系为:
ϕ k [ n ] = ϕ k + r N [ n ] \phi_k[n]=\phi_{k+rN}[n] ϕk[n]=ϕk+rN[n]
如果把这个信号集与连续信号的傅里叶级数中的正交函数集,特别是虚指数函数集 { e j n Ω t , n ∈ Z } \{e^{jn\Omega t}, n\in Z\} {ejnΩt,n∈Z} 类比的话,最大的不同便是连续信号的傅里叶级数中的正交函数集中的每一个元素都是不一样的。
在连续时间信号中,我们可以用虚指数函数集 { e j n Ω t , n ∈ Z } \{e^{jn\Omega t}, n\in Z\} {ejnΩt,n∈Z} 中的元素的线性组合表示任意(不严格的说,但大多数我们常见的都可以表示)周期信号。同样,我们希望 ϕ k [ n ] \phi_k[n] ϕk[n] 中各元素的线性组合可以用来表示更为一般的周期为 N N N 的序列 x [ n ] x[n] x[n] ,其形式如下:
x [ n ] = ∑ k a k ϕ k [ n ] = ∑ k a k e j k ω 0 n = ∑ k a k e j k ( 2 π / N ) n x[n]=\sum_{k}a_k\:\phi_k[n]=\sum_{k}a_k\:e^{jk\omega_0n}=\sum_{k}a_k\:e^{jk(2\pi/N)n} x[n]=k∑akϕk[n]=k∑akejkω0n=k∑akejk(2π/N)n
因为序列 ϕ k [ n ] \phi_k[n] ϕk[n] 只在 k k k 的 N N N 个相邻值的区间上是不同的,因此上式的求和仅仅需要包括 N N N 项,即 k k k 的变化范围可以是 k : 0 → N − 1 k:0 \rightarrow N-1 k:0→N−1 , 也可以是 k : 1 → N k:1 \rightarrow N k:1→N 等,为了强调这一点,可以将求和限表示为 $k=\left \langle N \right \rangle $ ,因此将上式表示为:
x [ n ] = ∑ k = ⟨ N ⟩ a k ϕ k [ n ] = ∑ k = ⟨ N ⟩ a k e j k ω 0 n = ∑ k = ⟨ N ⟩ a k e j k ( 2 π / N ) n x[n]=\sum_{k=\left \langle N \right \rangle }a_k\:\phi_k[n]=\sum_{k=\left \langle N \right \rangle }a_k\:e^{jk\omega_0n}=\sum_{k=\left \langle N \right \rangle }a_k\:e^{jk(2\pi/N)n} x[n]=k=⟨N⟩∑akϕk[n]=k=⟨N⟩∑akejkω0n=k=⟨N⟩∑akejk(2π/N)n
如果对于一般的周期序列 x [ n ] x[n] x[n] ,其周期为 N N N , 真的能表达成上式,那么我们就称上式为离散时间傅里叶级数,而系数 a k a_k ak 就是傅里叶级数系数。
那么到底能不能表达成上式呢,如果能的话,系数 a k a_k ak 又应该怎么求呢?
那么该问题的实质就转换为求一组线性方程组的解,如果对序列 x [ n ] x[n] x[n] 在一个周期内的 N N N 个连续的值进行求值,即可得到方程组中的各方程如下:
x [ 0 ] = ∑ k = ⟨ N ⟩ a k x [ 1 ] = ∑ k = ⟨ N ⟩ a k e j 2 π k / N ⋯ x [ N − 1 ] = ∑ k = ⟨ N ⟩ a k e j 2 π k ( N − 1 ) / N \begin{aligned} x[0]&=\sum_{k=\left \langle N \right \rangle }a_k\\ x[1]&=\sum_{k=\left \langle N \right \rangle }a_k \: e^{j2\pi k/N}\\ &\cdots\\ x[N-1]&=\sum_{k=\left \langle N \right \rangle }a_k \: e^{j2\pi k(N-1)/N}\\ \end{aligned} x[0]x[1]x[N−1]=k=⟨N⟩∑ak=k=⟨N⟩∑akej2πk/N⋯=k=⟨N⟩∑akej2πk(N−1)/N
上述 N N N 个方程中,共有 N N N 个未知数 a k a_k ak, 前辈们已经证明这 N N N 个方程是线性无关的。因此,一定能够用已知的 x [ n ] x[n] x[n] 在一个周期内的 N N N 个连续的值求得系数 a k a_k ak 。
科学最诱人的地方就是有时候会给人一种美感,因此用最粗暴的方式解上述方程组是莽夫干的事情。最优雅的办法是类似连续时间情况下的傅里叶级数系数求解方法,得到 a k a_k ak 的一个闭式表达式。
在推导出 a k a_k ak 的闭式表达式之前,还需要介绍一个先验知识,即一个周期复指数序列的值在整个一个周期内求和,除非该复指数是某一常数,否则其和为0。该先验知识可以用公式表达为:
∑ n = ⟨ N ⟩ x [ n ] e j k ( 2 π / N ) n = { N , k = 0 , ± N , ± 2 N , ⋯ 0 , 其他 \sum_{n=\left \langle N \right \rangle }x[n]e^{\:jk(2\pi/N)n} = \begin{cases} N, \quad k=0, \pm N,\pm2N, \cdots\\ 0, \:\: \quad 其他 \end{cases} n=⟨N⟩∑x[n]ejk(2π/N)n={N,k=0,±N,±2N,⋯0,其他
将上面离散时间傅里叶级数的表达式在等号两边各乘以 e − j r ( 2 π / N ) n e^{\:-jr(2\pi/N)n} e−jr(2π/N)n ,然后在 N N N 项上求和,可以得到:
∑ n = ⟨ N ⟩ x [ n ] e − j r ( 2 π / N ) n = ∑ n = ⟨ N ⟩ ∑ k = ⟨ N ⟩ a k e j ( k − r ) ( 2 π / N ) n \sum_{n=\left \langle N \right \rangle }x[n]e^{\:-jr(2\pi/N)n}=\sum_{n=\left \langle N \right \rangle }\sum_{k=\left \langle N \right \rangle }a_k\:e^{\:j(k-r)(2\pi/N)n} n=⟨N⟩∑x[n]e−jr(2π/N)n=n=⟨N⟩∑k=⟨N⟩∑akej(k−r)(2π/N)n
交换求和次序,即得到:
∑ n = ⟨ N ⟩ x [ n ] e − j r ( 2 π / N ) n = ∑ k = ⟨ N ⟩ a k ∑ n = ⟨ N ⟩ e j ( k − r ) ( 2 π / N ) n \sum_{n=\left \langle N \right \rangle }x[n]e^{\:-jr(2\pi/N)n}=\sum_{k=\left \langle N \right \rangle }a_k\sum_{n=\left \langle N \right \rangle }\:e^{\:j(k-r)(2\pi/N)n} n=⟨N⟩∑x[n]e−jr(2π/N)n=k=⟨N⟩∑akn=⟨N⟩∑ej(k−r)(2π/N)n
根据刚刚提到的先验知识,对上式右边内层对 n n n 求和时,除非 ( k − r ) (k-r) (k−r) 为 0 0 0 或者是 N N N 的整数倍,否则得到的和为 0 0 0 ,因此,如果把 r r r 值的变换范围选择成与外层求和 k k k 值的变化范围一样,那么上式最右边最内层的求和,在 k = r k=r k=r 时就等于 N N N ,在 k ≠ r k\neq r k=r 时就等于 0 0 0 。因此,上式右边就演变成了 N a r Na_r Nar ,于是有:
a r = 1 N ∑ n = ⟨ N ⟩ x [ n ] e − j r ( 2 π / N ) n a_r= \frac{1}{N}\sum_{n=\left \langle N \right \rangle }x[n]e^{\:-jr(2\pi/N)n} ar=N1n=⟨N⟩∑x[n]e−jr(2π/N)n
真优雅!傅里叶级数系数的闭式表达式推导完成。
这样,离散时间傅里叶级数表达式就是一个 N N N 项的有限级数:
x [ n ] = ∑ k = ⟨ N ⟩ a k e j k ω 0 n = ∑ k = ⟨ N ⟩ a k e j k ( 2 π / N ) n x[n] = \sum_{k=\left \langle N \right \rangle }a_ke^{\:jk\omega_0n}=\sum_{k=\left \langle N \right \rangle }a_ke^{\:jk(2\pi/N)n} x[n]=k=⟨N⟩∑akejkω0n=k=⟨N⟩∑akejk(2π/N)n
式中的傅里叶级数系数为:
a k = 1 N ∑ n = ⟨ N ⟩ x [ n ] e − j k ω 0 n = 1 N ∑ n = ⟨ N ⟩ x [ n ] e − j k ( 2 π / N ) n a_k=\frac{1}{N}\sum_{n=\left \langle N \right \rangle }x[n]e^{\:-jk\omega_0n}= \frac{1}{N}\sum_{n=\left \langle N \right \rangle }x[n]e^{\:-jk(2\pi/N)n} ak=N1n=⟨N⟩∑x[n]e−jkω0n=N1n=⟨N⟩∑x[n]e−jk(2π/N)n
在 傅里叶变换那点事 这篇文章中,我们为了得到连续时间信号的傅里叶变换,做法是将其对应的连续时间信号的傅里叶级数系数乘以信号的周期。同样,为了得到离散时间信号的傅里叶变换,我们将离散时间信号的傅里叶级数系数乘以其周期 N N N:
X [ k ] = a k ⋅ N = ∑ n = ⟨ N ⟩ x [ n ] e − j k ω 0 n = ∑ n = ⟨ N ⟩ x [ n ] e − j k ( 2 π / N ) n X[k]=a_k\cdot N=\sum_{n=\left \langle N \right \rangle }x[n]e^{\:-jk\omega_0n}= \sum_{n=\left \langle N \right \rangle }x[n]e^{\:-jk(2\pi/N)n} X[k]=ak⋅N=n=⟨N⟩∑x[n]e−jkω0n=n=⟨N⟩∑x[n]e−jk(2π/N)n
为了进一步简化公示,将 n n n 和 k k k 的变化范围均取值为 0 → N − 1 0 \rightarrow N-1 0→N−1 , 同时定义:
W N = e − j 2 π N W_N=e^{\:-j\frac{2\pi}{N}} WN=e−jN2π
这样, X [ k ] X[k] X[k] 就可以表示为:
X [ k ] = ∑ n = 0 N − 1 x [ n ] W N n k , k = 0 , 1 ⋯ , N − 1 X[k]=\sum_{n=0}^{N-1}x[n]W_N^{\:nk}\quad,\:k=0,1\cdots,N-1 X[k]=n=0∑N−1x[n]WNnk,k=0,1⋯,N−1
上式便为周期信号 x [ n ] x[n] x[n] 在一个周期内的截断信号(该截断信号长度为 N N N, 取 n = 0 , 1 , ⋯ N − 1 n=0,1,\cdots N-1 n=0,1,⋯N−1)的离散傅里叶变换的定义式。
由离散傅里叶变换的公式可知,一个长度为 N N N 的信号在经过变换后变换系数长度仍然为 N N N, 且由于 W N W_N WN 是复数,所以通常变换系数 X [ k ] X[k] X[k] 也是复数,因此离散傅里叶变换同样可以从幅度和相位两个方面来分析变换系数的特性。
既然一切的推导都和连续时间信号的傅里叶变换那么相似,那么离散时间信号的傅里叶反变换也是一样存在的,只需要将 X [ k ] X[k] X[k] 带入到离散时间傅里叶级数表达式即可:
x [ n ] = ∑ k = 0 N − 1 a k e j k ( 2 π / N ) n = ∑ k = 0 N − 1 X [ k ] N W N − n k = 1 N ∑ k = 0 N − 1 X [ k ] W N − n k \begin{aligned} x[n] &= \sum_{k=0}^{N-1}a_ke^{\:jk(2\pi/N)n}\\ &= \sum_{k=0}^{N-1} \frac{X[k]}{N} W_N^{\:-nk}\\ &= \frac{1}{N}\sum_{k=0}^{N-1} X[k] W_N^{\:-nk}\\ \end{aligned} x[n]=k=0∑N−1akejk(2π/N)n=k=0∑N−1NX[k]WN−nk=N1k=0∑N−1X[k]WN−nk
本文首发于微信公众号振动信号研究所,如果有读者发现本文的表述存在问题,欢迎私信指出!