使用numpy的矩形脉冲的傅立叶逆

时间:2018-04-19 15:45:23

标签: 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)
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()

这导致以下图像 enter image description here

由于我想模拟以原点(信号Y)为中心的矩形脉冲,我使用irfft函数对其进行逆变换,因为我知道时域信号是一个真实的函数(一个sinc函数)以原点为中心),这就是信号y。但是看看如何获​​得正确的sinc信号,我得到某种移位信号,这就是我为了获得更正确的sinc函数而将ifftshift结果用于绘制最右边信号的原因。

问题是,使用irfft时获得一个fftshifted版本的sinc是否合理?我没有在irfft的文档中遇到任何让我期待的事情。我真的不知道这是否是irfft函数的正确行为,或者我做错了什么。

1 个答案:

答案 0 :(得分:1)

我认为您的y信号的峰值接近x=0x=400是正确的,但是,我并不完全清楚您要实现的目标。< / p>

看起来你的Y向量代表了一个顶帽函数的频谱。通过将其传递给numpy.fft.irfft,您有效地将频谱视为由正负频率的相等幅度组成,其中您只提供正(和零)频率。如果您有这种形式的连续频谱,那么逆傅立叶变换将是以sinc()为中心的t=0函数。

对于离散傅里叶变换,这不是严格正确的,但除了在t=0处发生的环绕外,它是一个很好的近似。这意味着逆傅里叶变换的负时间部分放在时间窗的末尾,正如您在中间(y)图中观察到的那样。如果你想改变这个时域函数,你可以做的是在Y向量中引入一个线性相位变化(使它成为一个复数序列)。

但是,如果你要做的是生成一个以给定时间值为中心的sinc()函数,那么直接在时域中使用{{1而且不需要任何傅里叶变换。也许在您的应用中,您需要频域中的已知带宽,但这应该很容易转换为numpy.sinc()函数的宽度(时域中的宽度与频率中的宽度成反比)域)。