Python:1d数组循环卷积

时间:2016-02-18 06:08:21

标签: python numpy scipy convolution

我想知道在1d数组循环卷积的numpy / scipy中是否有函数。 scipy.signal.convolve() function仅提供“模式”而非“边界”,而signal.convolve2d()函数需要2d数组作为输入。

我需要这样做来比较开卷与循环卷积作为时间序列作业的一部分。

3 个答案:

答案 0 :(得分:7)

由于这是作业,我省略了一些细节。

通过definition of convolution,如果您将信号 a 附加到自身,那么 aa b 之间的卷积将包含在 a b 的循环卷积内。

例如,请考虑以下事项:

import numpy as np
from scipy import signal

%pylab inline

a = np.array([1] * 10)
b = np.array([1] * 10)

plot(signal.convolve(a, b));

enter image description here

这是标准卷积。不过现在这个

plot(signal.convolve(a, np.concatenate((b, b))));

enter image description here

在最后一个图中,试着看看循环卷积的结果在哪里,以及如何概括它。

答案 1 :(得分:6)

通过卷积定理,您可以使用傅里叶变换得到循环卷积。

import numpy as np
def conv_circ( signal, ker ):
    '''
        signal: real 1D array
        ker: real 1D array
        signal and ker must have same shape
    '''
    return np.real(np.fft.ifft( np.fft.fft(signal)*np.fft.fft(ker) ))

答案 2 :(得分:1)

您可以复制粘贴的代码,本着 StackOverflow 的精神:

n = a.shape[0]
np.convolve(np.tile(a, 2), b)[n:2 * n]

这里假设 a, b 具有相同的形状。