我无法解释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)
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信号,我得到某种移位信号,这就是我为了获得更正确的sinc函数而将ifftshift结果用于绘制最右边信号的原因。
问题是,使用irfft时获得一个fftshifted版本的sinc是否合理?我没有在irfft的文档中遇到任何让我期待的事情。我真的不知道这是否是irfft函数的正确行为,或者我做错了什么。
答案 0 :(得分:1)
我认为您的y
信号的峰值接近x=0
和x=400
是正确的,但是,我并不完全清楚您要实现的目标。< / p>
看起来你的Y
向量代表了一个顶帽函数的频谱。通过将其传递给numpy.fft.irfft
,您有效地将频谱视为由正负频率的相等幅度组成,其中您只提供正(和零)频率。如果您有这种形式的连续频谱,那么逆傅立叶变换将是以sinc()
为中心的t=0
函数。
对于离散傅里叶变换,这不是严格正确的,但除了在t=0
处发生的环绕外,它是一个很好的近似。这意味着逆傅里叶变换的负时间部分放在时间窗的末尾,正如您在中间(y
)图中观察到的那样。如果你想改变这个时域函数,你可以做的是在Y
向量中引入一个线性相位变化(使它成为一个复数序列)。
但是,如果你要做的是生成一个以给定时间值为中心的sinc()
函数,那么直接在时域中使用{{1而且不需要任何傅里叶变换。也许在您的应用中,您需要频域中的已知带宽,但这应该很容易转换为numpy.sinc()
函数的宽度(时域中的宽度与频率中的宽度成反比)域)。