x = ( x [ 0 ] , x [ 1 ] , … , x [ N − 1 ] ) x = (x[0], x[1], \ldots, x[N-1]) x=(x[0],x[1],…,x[N−1]) 为长度为 N N N 的离散时间信号,可以将其在 N 个正交基上展开, x = ∑ i = 0 N − 1 a i ϵ i \displaystyle{x = \sum_{i=0}^{N-1} a_i \epsilon_i } x=i=0∑N−1aiϵi,其中 { ϵ i , i = 0 , … , N − 1 } \{\epsilon_i, i=0,\ldots,N-1\} { ϵi,i=0,…,N−1} 就是一组正交信号.
所谓正交,就是它们之间的内积满足:
⟨ ϵ i , ϵ j ⟩ = δ i j = { 1 , i = j 0 , i ≠ j \langle \epsilon_i, \epsilon_j \rangle = \delta_{ij} = \left\{ \begin{array}{ll} 1, &i=j\\ 0, &i \neq j \end{array}\right. ⟨ϵi,ϵj⟩=δij={
1,0,i=ji=j
那么信号之间的内积是如何定义的呢?考虑
⟨ a , b ⟩ = 1 N ∑ n = 0 N − 1 a [ n ] b [ n ] ‾ \langle a, b \rangle = \frac{1}{N}\sum_{n=0}^{N-1} a[n] \overline{b[n]} ⟨a,b⟩=N1n=0∑N−1a[n]b[n]
但是这样的正交基怎么找呢?当然不用我们自己去找,因为先辈们早就找到了!
考虑:
ϵ k [ n ] = e i ω 0 k n , k = 0 , 1 , … , N − 1. \epsilon_k[n] = e^{i\omega_0kn} ,\quad k=0,1,\ldots,N-1. ϵk[n]=eiω0kn,k=0,1,…,N−1.
其中 i = − 1 i = \sqrt{-1} i=−1 为虚数单位, ω 0 = 2 π N \displaystyle{\omega_0 = \frac{2 \pi}{N}} ω0=N2π
这相当于把长度为 N N N 的序列均匀分布在复平面的单位圆上!
下面我们来验证这组基的正交性:
-
当 k = l k = l k=l
⟨ ϵ k , ϵ l ⟩ = 1 N ∑ n = 0 N − 1 e i ω 0 k n e − i ω 0 l n = 1 N ∑ n = 0 N − 1 e i ω 0 ( k − l ) n = 1 N ∑ n = 0 N − 1 1 = 1 \begin{aligned} \langle \epsilon_k, \epsilon_l\rangle &= \frac{1}{N} \sum_{n=0}^{N-1} e^{i\omega_0 kn}e^{-i\omega_0 ln} \\\\ &= \frac{1}{N} \sum_{n=0}^{N-1} e^{i\omega_0 (k-l)n} \\\\ &= \frac{1}{N} \sum_{n=0}^{N-1} 1\\\\ &= 1 \end{aligned} ⟨ϵk,ϵl⟩=N1n=0∑N−1eiω0kne−iω0ln=N1n=0∑N−1eiω0(k−l)n=N1n=0∑N−11=1 -
当 k ≠ l k \neq l k=l
⟨ ϵ k , ϵ l ⟩ = 1 N ∑ n = 0 N − 1 e i ω 0 k n e − i ω 0 l n = 1 N ∑ n = 0 N − 1 e i ω 0 ( k − l ) n = 1 N ∑ n = 0 N − 1 ϕ n ( 令 ϕ ≡ e i ω 0 ( k − l ) ) = 1 N 1 − ϕ N 1 − ϕ = 0 \begin{aligned} \langle \epsilon_k, \epsilon_l\rangle &= \frac{1}{N} \sum_{n=0}^{N-1} e^{i\omega_0 kn}e^{-i\omega_0 ln} \\\\ &= \frac{1}{N} \sum_{n=0}^{N-1} e^{i\omega_0 (k-l)n} \\\\ &= \frac{1}{N} \sum_{n=0}^{N-1} \phi^{n} \quad(\text{令} \phi \equiv e^{i\omega_0 (k-l)})\\\\ &= \frac{1}{N} \frac{1-\phi^N}{1-\phi} \\\\ &=0 \end{aligned} ⟨ϵk,ϵl⟩=N1n=0∑N−1eiω0kne−iω0ln=N1n=0∑N−1eiω0(k−l)n=N1n=0∑N−1ϕn(令ϕ≡eiω0(k−l))=N11−ϕ1−ϕN=0
将信号 x x x投影到这组正交基上,就得到了它的傅里叶系数:
a k = ⟨ x , ϵ k ⟩ = 1 N ∑ n = 0 N − 1 x [ n ] e − i ω 0 k n a_k = \langle x, \epsilon_k\rangle = \frac{1}{N} \sum_{n=0}^{N-1} x[n]e^{-i\omega_0 kn} ak=⟨x,ϵk⟩=N1n=0∑N−1x[n]e−iω0kn
反之,将投影在各个基上的分量相加就恢复了原信号:
x [ n ] = ∑ k = 0 N − 1 a k ϵ k = ∑ k = 0 N − 1 a k e i ω 0 k n x[n] = \sum_{k=0}^{N-1} a_k \epsilon_k = \sum_{k=0}^{N-1} a_k e^{i\omega_0 kn} x[n]=k=0∑N−1akϵk=k=0∑N−1akeiω0kn
python 实现
import numpy as np
import matplotlib.pyplot as plt
def dft(x):
x = np.squeeze(x)
N = len(x)
E = np.array([[np.exp(-1j*2*np.pi*n*j/N) for j in range(N)] for n in range(N)])
return x.dot(E)/np.sqrt(N)
def idft(x):
x = np.squeeze(x)
N = len(x)
E = np.array([[np.exp(1j*2*np.pi*n*j/N) for j in range(N)] for n in range(N)])
return x.dot(E)/np.sqrt(N)
上述函数实现了:
- 正变换
X k = 1 N ∑ n = 0 N − 1 x [ n ] e − i ω 0 k n X_k = \frac{1}{\sqrt{N}} \sum_{n=0}^{N-1} x[n]e^{-i\omega_0 kn} Xk=N1n=0∑N−1x[n]e−iω0kn - 逆变换:
x [ n ] = 1 N ∑ k = 0 N − 1 X k e i ω 0 k n x[n] = \frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} X_k e^{i\omega_0 kn} x[n]=N1k=0∑N−1Xkeiω0kn
正逆变换都除以 N \sqrt{N} N 可以保证能量守恒,即帕塞瓦尔定理:
∑ n = 0 N − 1 ∣ x [ n ] ∣ 2 = ∑ k = 0 N − 1 ∣ X k ∣ 2 \sum_{n=0}^{N-1} |x[n]|^2 = \sum_{k=0}^{N-1} |X_k|^2 n=0∑N−1∣x[n]∣2=k=0∑N−1∣Xk∣2
t = np.arange(0, 1, 1/fs)
f0 = 100
f1 = 200
x = np.cos(2*np.pi*f0*t)*1 + np.cos(2*np.pi*f1*t)*3 + np.random.randn(t.size)*0.1
y = dft(x)
y = np.abs(y)
plt.plot(y)
np.allclose(idft(dft(x)), x, atol=1e-15)
"""
True
"""
np.sum(x**2) - np.sum(y**2)
"""
-5.4569682106375694e-12
"""