如何修正代码以生成exp(-t)sin(t)的正确Fourier Transform图像?
修正exp(-t)sin(t)傅里叶变换图像生成代码
你需要生成的是因果信号$f(t) = e^{-t}\sin(t) \ (t \geq 0)$的傅里叶变换图像,原代码存在多处参数设置和逻辑错误,以下是问题排查和修正方案:
原代码核心问题
- 信号定义域错误:目标信号仅在$t \geq 0$时有意义,原代码中
x包含负数区间,导致生成的信号不符合预期,且会引入无效的指数增长部分。 - 时间轴与采样参数混乱:同时定义
t和x两个时间变量,采样间隔T设置无依据,时间轴生成逻辑错误。 - 频率轴计算错误:原
xf的生成完全不符合FFT频率轴的物理意义,未正确关联采样率与频率范围。 - 傅里叶变换结果处理错误:未使用
fftshift获取对称的频率分布,幅值缩放与频率轴映射不匹配。
修正后的代码
import numpy as np import matplotlib.pyplot as plt from scipy.fftpack import fft, fftshift, fftfreq # 参数设置 N = 4096 # 提高采样点数让图像更平滑 t_max = 20.0 # 信号时长,覆盖足够多的衰减部分 dt = t_max / N # 采样间隔,由总时长和点数计算得出 t = np.linspace(0, t_max, N, endpoint=False) # 生成t≥0的时间轴,符合因果信号定义 # 生成目标信号 f_t = np.exp(-t) * np.sin(t) # 计算傅里叶变换并处理 f_fft = fft(f_t) freq = fftfreq(N, dt) # 获取与采样参数匹配的频率轴 freq_shifted = fftshift(freq) # 将频率轴转为负到正的对称分布 f_fft_shifted = fftshift(f_fft) # 同步变换傅里叶结果,保证频率与幅值对应 # 计算幅值谱(除以N是为了将离散FFT结果近似为连续傅里叶变换的幅值) amplitude = np.abs(f_fft_shifted) / N # 绘图 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 7)) # 绘制傅里叶变换幅值谱 ax1.plot(freq_shifted, amplitude) ax1.set_title("$FT\{f(t)\}$") ax1.set_xlabel("频率 $\omega$") ax1.set_ylabel("幅值") ax1.set_xlim(-3, 3) # 聚焦目标频率范围,和参考图匹配 ax1.grid(True) # 绘制原信号 ax2.plot(t, f_t) ax2.set_title("$f(t) = e^{-t}\sin(t)$") ax2.set_xlabel("时间 $t$") ax2.set_ylabel("幅值") ax2.set_xticks([0, np.pi, 2*np.pi, 3*np.pi]) ax2.grid(True) plt.tight_layout() plt.show()
代码说明
- 时间轴:仅保留$t \geq 0$区间,符合目标信号的因果特性,采样间隔由参数推导保证合理性。
- 频率轴:使用
fftfreq生成物理意义正确的频率轴,fftshift实现负到正的对称分布,和连续傅里叶变换的频率范围对应。 - 幅值缩放:除以采样点数
N,让离散FFT结果近似匹配连续傅里叶变换的幅值比例。 - 范围限制:通过
xlim锁定频率展示区间,和目标图像的视觉范围一致。
内容的提问来源于stack exchange,提问作者Freya the Goddess
相关产品推荐
相关产品推荐

