我试图通过比较FFT和卷积函数的结果来在Python中执行线性卷积。
Python的scipy.signal.fftconvolve
自动执行必要的零填充。如果我们仅使用FFT进行计算,我们在输入信号后添加一个零长度。有没有办法修剪FFT结果的输出数组? (fftconvolve
有mode='same'
选项,其中输出数组与输入的大小相同。)
import numpy as np
from numpy.fft import fft,ifft
from scipy.signal import fftconvolve
import matplotlib.pyplot as plt
tf = 50
ti = -tf
N = 2**10
t = np.linspace(ti,tf,N)
T = (tf-ti)/N
x = np.exp(-4*t**2)*np.cos(t)
y = (t-2)/((t-2)**2+3**2)
z1 = ifft(fft(x,len(x)+len(y)-1)*fft(y,len(x)+len(y)-1)) # need zero-padding
z2 = fftconvolve(x,y,mode='same') # automatic zero-padding
plt.figure(0)
plt.plot(t,z2)
#plt.figure(1)
#plt.plot(t,z1)
注意:另一个问题是如果我们将输出更改为:
z1 = ifft(fft(x,len(x)+len(y)-1)*fft(y,len(x)+len(y)-1))*T
z2 = fftconvolve(x,y)*T
(其中T
是一个归一化常数)然后绘制z1
或z2
,我们得到奇怪的边界效应:
this DSP post解释了这种效果,但我不确定如何将解决方案应用到我的系统中。