NumPy 模块中的 fftshift 或卷积操作不正确

问题描述 投票:0回答:1

我试图在

Python
中展示时域中两个信号相乘与频域中它们的卷积的等价性。

感谢this帖子中的Baddioes,表明可以使用

fftshift
函数来显示这种等价性,但示例是在
Matlab
中完成的。我期望在
Python
中得到完全相同的结果,但它不一样,代码如下:

f = 2e6
t = np.linspace(0,1,64)

x = np.sin(2*np.pi*f*t)
y = np.sin(2*np.pi*0.5*f*t)

# multiplication in time domain
signal_xy = x*y

# Fourier of multiplied signals and individual signal
FFT_xy = np.fft.fft(signal_xy)
FFT_x = np.fft.fft(x)
FFT_y = np.fft.fft(y)

# plot the result
plt.plot(abs(FFT_xy))
plt.plot(np.fft.fftshift(abs(np.convolve(np.fft.fftshift(FFT_x),np.fft.fftshift(FFT_y), 'same')))/len(FFT_x), linestyle='--')

enter image description here

我也尝试使用

fftshift
模块中的
convolve
scipy
,但结果完全一样。

fftshift
convolve
功能在
Python
中是否可以正常工作?

python numpy fft convolution
1个回答
0
投票

存在一一的差异(由于某种原因)。您可以控制移动并使用 numpy.roll() 自行完成。 (注意下面的替代移动距离 n//2-1 和 n//2+1)。

n=len(x)
plt.plot(abs(FFT_xy))
plt.plot(np.roll(abs(np.convolve(np.roll(FFT_x,n//2-1),np.roll(FFT_y,n//2-1), 'same')),n//2+1)/n, linestyle='--')

给出: enter image description here

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.