好的,阿杰 👍
我给你整理一份 DFT(离散傅里叶变换)计算过程详解,从原理到公式,再到具体计算步骤,并附上简单例子,帮你彻底理解 DFT 是怎么把时域信号变换到频域的。
📝 DFT(离散傅里叶变换)计算过程详解
1️⃣ DFT 的基本概念
离散傅里叶变换(DFT, Discrete Fourier Transform) 用于将 离散时域信号 转换为 离散频域信号,用于频谱分析、滤波和信号处理。
- 时域信号:x[n], n=0,1,2,…,N−1
- 频域信号:X[k], k=0,1,2,…,N−1
DFT 公式:X[k]=∑n=0N−1x[n]⋅e−j2πkn/N,k=0,1,…,N−1
- N :信号长度(采样点数)
- j :虚数单位
- e−j2πkn/N :旋转因子(也叫 twiddle factor)
逆变换公式(IDFT):x[n]=1N∑k=0N−1X[k]⋅ej2πkn/N,n=0,1,…,N−1
2️⃣ DFT 的计算过程
步骤 1:准备信号
假设离散信号 x[n] 长度为 N,例如:x[n]=[1,2,3,4],N=4
步骤 2:计算旋转因子(Twiddle Factor)
WN=e−j2π/N
- 对于本例 N=4,
W4=e−j2π/4=e−jπ/2=cos(π/2)−jsin(π/2)=0−j1
- 每个 X[k] 中的旋转因子为 WNkn
步骤 3:逐点计算频域分量
计算 X[0]:X[0]=x[0]∗W40∗0+x[1]∗W40∗1+x[2]∗W40∗2+x[3]∗W40∗3=1+2+3+4=10
计算 X[1]:X[1]=x[0]∗W40+x[1]∗W41+x[2]∗W42+x[3]∗W43
代入旋转因子:
- W40=1
- W41=−j
- W42=−1
- W43=j
X[1]=1∗1+2∗(−j)+3∗(−1)+4∗(j)=1−2j−3+4j=(1−3)+(−2j+4j)=−2+2j
计算 X[2]:X[2]=x[0]∗1+x[1]∗(−1)+x[2]∗1+x[3]∗(−1)=1−2+3−4=−2
计算 X[3]:X[3]=x[0]∗1+x[1]∗j+x[2]∗(−1)+x[3]∗(−j)=1+2j−3−4j=−2−2j
步骤 4:结果总结
X[k]=[10,−2+2j,−2,−2−2j]
- 幅值:∣X[k]∣=(Re)2+(Im)2
- 相位:θ[k]=arctan(Im/Re)
3️⃣ DFT 的计算特点
- 计算量大:直接 DFT 为 O(N2)
- 对称性:实信号 DFT 输出具有共轭对称性 X[N−k]=X[k]∗
- 可逆性:通过 IDFT 可还原时域信号
4️⃣ 示例:Python 实现 DFT(手工)
import numpy as np
x = np.array([1,2,3,4])
N = len(x)
X = []
for k in range(N):
s = 0
for n in range(N):
s += x[n] * np.exp(-2j * np.pi * k * n / N)
X.append(s)
X = np.array(X)
print("DFT:", X)
print("幅值:", np.abs(X))
print("相位:", np.angle(X))
输出:
DFT: [10.+0.j -2.+2.j -2.+0.j -2.-2.j]
幅值: [10. 2.82842712 2. 2.82842712]
相位: [ 0. 2.35619449 3.14159265 -2.35619449]
5️⃣ 小结
- DFT 是将 时域离散信号 转换为 频域离散信号 的工具。
- 核心是计算 ∑x[n]e−j2πkn/N 的旋转因子和加权求和。
- 对小规模信号可手工计算,大规模信号通常用 FFT(快速傅里叶变换),将复杂度降到 O(NlogN)。
- DFT 可以分析频率成分、幅值和相位,用于信号处理、滤波、谱分析等。
发表回复