2016-02-18 104 views
1

我不知道numpy/scipy中是否有一個函數用於1d數組循環卷積。 scipy.signal.convolve() function只提供「模式」而不提供「邊界」,而signal.convolve2d()函數需要2d數組作爲輸入。Python:1d數組循環卷積

我需要做這個比較開放與循環卷積作爲時間序列作業的一部分。

+0

您是否嘗試過[''scipy.ndimage.filters.convolve1d''(http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.ndimage.filters .convolve1d.html#scipy.ndimage.filters.convolve1d)?這提供了更多的選項,比如''wrap''(基本上是循環的),但是隻有當內核足夠「大」時。 – MSeifert

回答

3

由於這是作業,我將略去一些細節。

definition of convolution,如果追加的信號一個給自己,然後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)); 

enter image description here

這是標準的卷積。現在這一點,但是

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

enter image description here

在這最後的數字,嘗試看看哪裏是循環卷積,以及如何推廣這個結果。

2

通過卷積定理,您可以使用傅里葉變換來獲得循環卷積。

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))) 
+0

這比在我的PC上使用'scipy.signal.convolve'的其他方法快得多......不確定缺點是什麼,但我喜歡它。 –