使用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=0
和 x=400
是正确的,但是,我不完全清楚您要实现的目标.
您的 Y
向量似乎代表了一个顶帽函数的频谱。通过将其传递给 numpy.fft.irfft
,您可以有效地将频谱视为由等幅的正负频率组成,您只提供正(和零)频率。如果您有这种形式的连续频谱,那么傅立叶逆变换将是一个以 t=0
.
为中心的 sinc()
函数
对于离散傅里叶变换,这并非严格正确,但它是一个很好的近似值,除了发生在 t=0
处的回绕。这意味着傅里叶逆变换的负时间部分放在时间的末尾 - window,正如您在中间 (y
) 图中观察到的那样。如果你想移动这个时域函数,你可以做的是在你的 Y
向量中引入线性相位变化(使其成为一个复数序列)。
但是,如果您想要做的是生成一个以给定时间值为中心的 sinc()
函数,那么直接在时域中使用 numpy.sinc()
,并且不需要任何傅立叶变换。也许在您的应用程序中,您需要频域中的已知带宽,但这应该可以直接转换为 sinc()
函数的宽度(时域中的宽度与频率中的宽度成反比)域)。
我无法解释 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=0
和 x=400
是正确的,但是,我不完全清楚您要实现的目标.
您的 Y
向量似乎代表了一个顶帽函数的频谱。通过将其传递给 numpy.fft.irfft
,您可以有效地将频谱视为由等幅的正负频率组成,您只提供正(和零)频率。如果您有这种形式的连续频谱,那么傅立叶逆变换将是一个以 t=0
.
sinc()
函数
对于离散傅里叶变换,这并非严格正确,但它是一个很好的近似值,除了发生在 t=0
处的回绕。这意味着傅里叶逆变换的负时间部分放在时间的末尾 - window,正如您在中间 (y
) 图中观察到的那样。如果你想移动这个时域函数,你可以做的是在你的 Y
向量中引入线性相位变化(使其成为一个复数序列)。
但是,如果您想要做的是生成一个以给定时间值为中心的 sinc()
函数,那么直接在时域中使用 numpy.sinc()
,并且不需要任何傅立叶变换。也许在您的应用程序中,您需要频域中的已知带宽,但这应该可以直接转换为 sinc()
函数的宽度(时域中的宽度与频率中的宽度成反比)域)。