如何通过DFT频谱以正弦/余弦和形式重构信号?
从频谱以正弦/余弦和形式重构信号的代码实现
针对你的需求,结合实信号FFT的对称性,代码中倒数第二行的正确写法需要区分不同频率分量处理,完整修正后的代码如下:
import numpy as np sig = np.array([1, 5, -3, 0.7, 3.1, -5, -0.5, 3.2, -2.3, -1.1, 3, 0.3, -2.05, 2.1, 3.05, -2.3]) N = sig.size fft = np.fft.rfft(sig) mag = np.abs(fft) * 2 / N phase = np.angle(fft) x = np.arange(N) reconstructed = list() for x_i in x: val = 0.0 for i, (m, p) in enumerate(zip(mag, phase)): omega = 2 * np.pi * i * x_i / N # 直流分量和奈奎斯特分量(仅偶数长度信号存在)需特殊处理 if i == 0 or (N % 2 == 0 and i == N // 2): val += (m / 2) * np.cos(omega + p) else: val += m * np.cos(omega + p) reconstructed.append(val) # 验证重构结果与逆FFT一致性 reconstructed_irfft = np.fft.irfft(fft) print(np.allclose(reconstructed, reconstructed_irfft)) # 输出True表示重构正确
原理说明
- 实信号的
rfft输出中,**直流分量(索引0)和奈奎斯特频率分量(仅当信号长度为偶数时的最后一个索引)**没有对应的共轭分量,因此它们的幅度需要减半才能匹配原始信号的能量; - 其余频率分量的幅度已经通过
mag = np.abs(fft)*2/N完成了归一化(合并了共轭分量的幅度贡献),直接乘以带相位的余弦项cos(2π*i*x_i/N + p)即可还原该频率的信号分量; - 最终所有分量求和后得到的结果与
np.fft.irfft的输出完全一致,验证了重构的正确性。
内容的提问来源于stack exchange,提问作者Dominik Ficek
相关产品推荐
相关产品推荐

