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

如何修正代码以生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:55:58