Python:1d数组循环卷积

Wil*_* Gu 6 python numpy convolution scipy

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

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

Kh4*_*tiK 9

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

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) ))
Run Code Online (Sandbox Code Playgroud)


Ami*_*ory 8

由于这是作业,我遗漏了一些细节.

通过卷积的定义,如果你追加一个信号一个给自己,然后之间的卷积AAb将包含的循环卷积内一个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));
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

那是标准的卷积.不过现在这个

plot(signal.convolve(a, np.concatenate((b, b))));
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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


qwi*_*ipo 6

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

n = a.shape[0]
np.convolve(np.tile(a, 2), b)[n:2 * n]
Run Code Online (Sandbox Code Playgroud)

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