You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用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()

修复说明

  1. 修正采样逻辑:将T设为正值0.01,生成递增时域序列,保证信号采样符合正常时序。
  2. 正确计算角频率轴:用scipy.fftpack.fftfreq生成循环频率后转换为角频率ω,直接对应预期的±2峰值位置。
  3. 归一化幅度谱:保留2.0/N的归一化系数,确保幅度值符合理论预期。
  4. 添加辅助线:红色虚线标注ω=±2位置,方便验证峰值正确性。

内容的提问来源于stack exchange,提问作者Freya the Goddess

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:42:29