Python中的线性和循环卷积

时间:2016-07-01 08:57:18

标签: python numpy fft convolution ifft

我试图通过比较FFT和卷积函数的结果来在Python中执行线性卷积。

Python的scipy.signal.fftconvolve自动执行必要的零填充。如果我们仅使用FFT进行计算,我们在输入信号后添加一个零长度。有没有办法修剪FFT结果的输出数组? (fftconvolvemode='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是一个归一化常数)然后绘制z1z2,我们得到奇怪的边界效应:

enter image description here

this DSP post解释了这种效果,但我不确定如何将解决方案应用到我的系统中。

0 个答案:

没有答案