为何用Numpy和Python绘制的cos(2x)傅里叶变换图与预期不符?
问题分析与修复
你的代码存在几个关键问题,导致傅里叶变换结果不符合预期:
错误点梳理
- 采样间隔T设置错误:你将T设为
-1.0 / 1.0,生成了递减的时域采样点,违背正常采样逻辑,FFT输入需要按时间递增的序列。 - 频率轴计算错误:基于错误的T算出的xf是无效负数区间,且未将FFT循环频率转换为实际角频率(ω=2πf),而你预期的峰值在角频率±2处。
- 时域变量冗余混乱:同时使用
t和x两个时域变量,导致信号生成与采样逻辑不一致。
修正后的代码
import numpy as np import matplotlib.pyplot as plt import scipy.fftpack # 采样点数 N = 600 # 采样间隔(设置为合适正值,保证足够采样率) T = 0.01 # 生成递增的时域采样点 t = np.linspace(0.0, N*T, N) # 生成目标信号 cos(2t) y = np.cos(2.0 * t) # 执行FFT并计算幅度 yf = scipy.fftpack.fft(y) # 计算FFT循环频率轴 f = scipy.fftpack.fftfreq(N, d=T) # 转换为角频率 ω=2πf omega = 2 * np.pi * f # 归一化幅度谱 amplitude = 2.0 / N * np.abs(yf) # 绘图 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 7)) # 绘制傅里叶变换幅度谱,聚焦ω在-5到5区间 mask = np.abs(omega) <= 5 ax1.plot(omega[mask], amplitude[mask]) ax1.set_title("$FT\{f(t)\}$") ax1.set_xlabel("角频率 ω") ax1.axvline(x=2, color='r', linestyle='--', alpha=0.7) ax1.axvline(x=-2, color='r', linestyle='--', alpha=0.7) # 绘制时域信号 ax2.plot(t, y) ax2.set_title("$f(t) = cos(2t)$") ax2.set_xticks([0, np.pi, 2 * np.pi]) ax2.set_xlabel("时间 t") plt.tight_layout() plt.show()
修复说明
- 修正采样逻辑:将T设为正值
0.01,生成递增时域序列,保证信号采样符合正常时序。 - 正确计算角频率轴:用
scipy.fftpack.fftfreq生成循环频率后转换为角频率ω,直接对应预期的±2峰值位置。 - 归一化幅度谱:保留
2.0/N的归一化系数,确保幅度值符合理论预期。 - 添加辅助线:红色虚线标注ω=±2位置,方便验证峰值正确性。
内容的提问来源于stack exchange,提问作者Freya the Goddess
相关产品推荐
相关产品推荐

