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

fourier inverse of a rectangular pulse using numpy

我无法解释 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 函数来 inverse-transform 它,因为我知道 time-domain 信号是一个实函数(以原点为中心的 sinc 函数),这就是信号 y。但是看看我是如何得到某种 fftshifted 信号而不是得到正确的 sinc 信号的,这就是为什么我对绘制 right-most 信号的结果进行 ifftshift 以获得更合适的 sinc 函数的原因。

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

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

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

为中心的 sinc() 函数

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

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