使用numpy.fft.irfft计算矩形脉冲逆傅里叶变换:结果解读困惑
搞懂numpy.fft.irfft的正确用法,解决矩形脉冲逆变换的困惑
嘿,我来帮你理清这个问题~你现在的核心误区是搞混了irfft的输入要求,直接把时域的矩形脉冲当成了它的输入,这就导致输出结果完全不是你预期的。咱们一步一步拆解:
先明确几个FFT函数的分工
别搞混这些函数的用途,这是关键:
np.fft.fft:给时域信号,输出完整的复数频域序列(包含正负频率)np.fft.ifft:给复数频域序列,输出还原的时域信号np.fft.rfft:专门给实数时域信号,只输出正频率部分的频域序列(因为负频率是正频率的共轭,没必要存)np.fft.irfft:专门给rfft输出的正频率频域序列,还原出实数时域信号
你的原代码里,把时域的矩形脉冲Y直接传给irfft,相当于告诉它:“这是某个实数信号的正频率频域分量,帮我还原时域”——但这个输入根本不是频域数据,所以结果自然看不懂。
修正后的代码:正确计算矩形脉冲的傅里叶变换+逆变换
如果你想实现“矩形脉冲的傅里叶变换,再逆变换还原时域”,用下面的代码:
import numpy as np import matplotlib.pyplot as plt n_on = 100 n_off = n_on # 1. 定义时域的矩形脉冲信号 y_time = np.concatenate((np.ones(n_on), np.zeros(n_off))) total_samples = len(y_time) # 2. 做傅里叶变换,得到完整频域序列 Y_freq = np.fft.fft(y_time) # 3. 逆傅里叶变换还原时域信号(因为数值误差,虚部几乎为0,取实部即可) y_restore = np.real(np.fft.ifft(Y_freq)) # 画图展示 plt.figure(figsize=(12, 4)) plt.subplot(131) plt.plot(y_time, '.') plt.title("时域矩形脉冲 y(t)") plt.xlabel("样本点") plt.subplot(132) # 频域看幅度谱,矩形脉冲的傅里叶变换是sinc函数,符合预期 plt.plot(np.abs(Y_freq)) plt.title("频域幅度谱 |Y(f)|") plt.xlabel("频率点") plt.subplot(133) plt.plot(y_restore) plt.title("逆变换还原的时域信号") plt.xlabel("样本点") plt.tight_layout() plt.show()
如果一定要用irfft怎么办?
那得先通过rfft得到正频率的频域分量,再用irfft还原:
import numpy as np import matplotlib.pyplot as plt n_on = 100 n_off = n_on y_time = np.concatenate((np.ones(n_on), np.zeros(n_off))) # 用rfft得到正频率频域序列 Y_rfft = np.fft.rfft(y_time) # 用irfft还原时域信号 y_irfft = np.fft.irfft(Y_rfft) plt.figure(figsize=(12, 4)) plt.subplot(131) plt.plot(y_time, '.') plt.title("时域矩形脉冲 y(t)") plt.subplot(132) plt.plot(np.abs(Y_rfft)) plt.title("rfft输出的正频率幅度谱") plt.subplot(133) plt.plot(y_irfft) plt.title("irfft还原的时域信号") plt.tight_layout() plt.show()
最后说下你原代码里的ifftshift
np.fft.ifftshift是用来把FFT结果的直流分量从序列开头移到中间的,但你原代码里的y是错误输入得到的无意义序列,所以shift之后也不会有你想要的效果。
内容的提问来源于stack exchange,提问作者Javi
相关产品推荐
相关产品推荐

