好的,阿杰 👍
我给你整理一份 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(Nlog⁡N)。
  • DFT 可以分析频率成分、幅值和相位,用于信号处理、滤波、谱分析等。