Python 用numpy实现矩形脉冲的傅里叶逆
我在Python中解释矩形脉冲的傅里叶逆变换结果时遇到困难。我正在使用库numpy.fft中的函数irfft 这是我的密码:Python 用numpy实现矩形脉冲的傅里叶逆,python,numpy,signal-processing,fft,dft,Python,Numpy,Signal Processing,Fft,Dft,我在Python中解释矩形脉冲的傅里叶逆变换结果时遇到困难。我正在使用库numpy.fft中的函数irfft 这是我的密码: import numpy as np import matplotlib.pyplot as plt n_on = 100 n_off = n_on Y = np.concatenate(( np.ones(n_on), np.zeros(n_off) )) y = np.fft.irfft(Y) plt.figure() plt.subplot(131) pl
import numpy as np
import matplotlib.pyplot as plt
n_on = 100
n_off = n_on
Y = np.concatenate(( np.ones(n_on), np.zeros(n_off) ))
y = np.fft.irfft(Y)
plt.figure()
plt.subplot(131)
plt.plot(Y, '.')
plt.title("Y")
plt.subplot(132)
plt.plot(y)
plt.title("y")
plt.subplot(133)
plt.plot(np.fft.ifftshift(y))
plt.title("ifftshift(y)")
plt.grid()
这将产生下图
因为我想模拟一个以原点(信号Y)为中心的矩形脉冲,所以我使用irfft函数对其进行逆变换,因为我知道时域信号是一个实函数(以原点为中心的sinc函数),这就是信号Y。但是你看,我没有得到正确的sinc信号,而是得到了某种FFT移位信号,这就是为什么我对绘制最右边的信号的结果进行IFFT移位,以得到更合适的sinc函数
问题是,当使用irfft时,得到sinc的FFT移位版本是否合理?我在irfft的文档中没有遇到任何让我想到这一点的东西。我真的不知道这是irfft函数的正确行为还是我做错了什么。我相信你的
y
信号的峰值接近x=0
和x=400
是正确的,但是,我不完全清楚你想要实现什么
看起来你的Y
向量代表一个频谱,它是一个顶级函数。通过将其传递给numpy.fft.irfft
可以有效地将频谱视为由正频率和负频率的相等振幅组成,其中只提供正(和零)频率。如果有这种形式的连续频谱,那么傅里叶逆变换将是一个以t=0
为中心的sinc()
函数
对于离散傅里叶变换,这不是严格正确的,但是是一个很好的近似值,除了在t=0时发生的环绕。这意味着傅里叶逆变换的负时间部分被放置在时间窗口的末尾,正如您在中间(y
)图中所观察到的那样。如果你想移动这个时域函数,你可以做的是在你的Y
向量中引入一个线性相位变化(使它成为一个复数序列)
但是,如果您试图生成一个以给定时间值为中心的sinc()
函数,那么直接在时域中使用numpy.sinc()
,并且不需要任何傅里叶变换,这一定会容易得多。在您的应用程序中,可能需要频域中的已知带宽,但这应该可以直接转换为sinc()
函数的宽度(时域中的宽度与频域中的宽度成反比)。谢谢您的回答。我并没有试图生成一个sinc函数,正如您所指出的,它当然很容易构建;我正在测试一些转换以调试另一个脚本。我相信这里的关键点是你提到的环绕效应,实际上这就是我的问题的目的:你说第二个图像(y信号)是正确的,那么这意味着从x=200到x=400的样本对应于负时间。你同意吗?谢谢你的澄清。我认为你对负时间样本的看法基本上是正确的,但是这些样本是否恰好从200开始还没有定义,因为离散时间傅里叶变换假设了一个严格的周期波形。当然,y
数组的最后一个元素将是最接近零的负时间。另一个想法是,如果你想生成时域波形,你可以利用类似(sin(t)/(sin(t/N))的分析结果,它倾向于sinc(t)当N变为无穷大时。取决于其他脚本的行为,我不确定您对分析结果或(数值)FFT的结果是否更满意。我使用FFT来理解函数的行为,这就是我使用著名的傅立叶对(能够检查我的结果)来做这件事的原因.无论如何,我认为你指出环绕效应的答案以及你对负时间样本的进一步评论解释了这些图像。谢谢。