Python:一维数组循环卷积
Python: 1d array circular convolution
我想知道numpy/scipy中是否有用于一维数组循环卷积的函数。 scipy.signal.convolve()
function只提供"mode",不提供"boundary",而signal.convolve2d()
函数需要二维数组作为输入。
作为时间序列作业的一部分,我需要这样做来比较开放卷积与循环卷积。
由于这是作业,我省略了一些细节。
通过definition of convolution,如果你将信号a附加到自身,那么aa和[=之间的卷积29=]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));
也就是标准的卷积。然而现在这个
plot(signal.convolve(a, np.concatenate((b, b))));
在最后一张图中,试着看看循环卷积的结果在哪里,以及如何概括它。
根据卷积定理,可以用傅里叶变换得到圆卷积。
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) ))
本着 Whosebug 的精神,您可以复制粘贴的代码:
n = a.shape[0]
np.convolve(np.tile(a, 2), b)[n:2 * n]
这假设 a, b 具有相同的形状。
我想知道numpy/scipy中是否有用于一维数组循环卷积的函数。 scipy.signal.convolve()
function只提供"mode",不提供"boundary",而signal.convolve2d()
函数需要二维数组作为输入。
作为时间序列作业的一部分,我需要这样做来比较开放卷积与循环卷积。
由于这是作业,我省略了一些细节。
通过definition of convolution,如果你将信号a附加到自身,那么aa和[=之间的卷积29=]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));
也就是标准的卷积。然而现在这个
plot(signal.convolve(a, np.concatenate((b, b))));
在最后一张图中,试着看看循环卷积的结果在哪里,以及如何概括它。
根据卷积定理,可以用傅里叶变换得到圆卷积。
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) ))
本着 Whosebug 的精神,您可以复制粘贴的代码:
n = a.shape[0]
np.convolve(np.tile(a, 2), b)[n:2 * n]
这假设 a, b 具有相同的形状。