离散傅里叶变换(DFT)

x = ( x [ 0 ] , x [ 1 ] , … , x [ N − 1 ] ) x = (x[0], x[1], \ldots, x[N-1]) x=(x[0],x[1],,x[N1]) 为长度为 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=0N1aiϵi,其中 { ϵ i , i = 0 , … , N − 1 } \{\epsilon_i, i=0,\ldots,N-1\} { ϵi,i=0,,N1} 就是一组正交信号.

所谓正交,就是它们之间的内积满足:
⟨ ϵ 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=0N1a[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,,N1.
其中 i = − 1 i = \sqrt{-1} i=1 为虚数单位, ω 0 = 2 π N \displaystyle{\omega_0 = \frac{2 \pi}{N}} ω0=N2π

在这里插入图片描述
这相当于把长度为 N N N 的序列均匀分布在复平面的单位圆上!

下面我们来验证这组基的正交性:

  1. 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=0N1eiω0kneiω0ln=N1n=0N1eiω0(kl)n=N1n=0N11=1

  2. 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=0N1eiω0kneiω0ln=N1n=0N1eiω0(kl)n=N1n=0N1ϕn(ϕeiω0(kl))=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=0N1x[n]eiω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=0N1akϵk=k=0N1akeiω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=N 1n=0N1x[n]eiω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]=N 1k=0N1Xkeiω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=0N1x[n]2=k=0N1Xk2
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
"""

猜你喜欢

转载自blog.csdn.net/itnerd/article/details/108875191