2017-08-30 76 views
1

鑑於一些數據x遞歸:用`IIR濾波器scipy.lfilter`

from pandas_datareader.data import DataReader as dr 
x = np.squeeze(dr('DTWEXB', 'fred').dropna().values) 

我想計算的另一種載體y如下:

enter image description here

阿爾法等於0.03 , 在這種情況下。

我可以用scipy.lfilter?來做到這一點。類似的問題here,但在這種情況下,結果的起始值是0,這是拋出一些東西。

我嘗試:

from scipy.signal import lfilter 
a = 0.03 
b = 1 - a 
y0 = x[0] 
y = lfilter([a], [y0, -b], x) 

結果應該是:

true_y = np.empty(len(x)) 
for k in range(0, len(true_y)): 
    if k == 0: 
     true_y[k] = x[0] 
    else: 
     true_y[k] = a*x[k] + b*true_y[k-1] 
print(true_y) 
[ 101.1818  101.176862 101.16819314 ..., 120.9813121 120.92484874 
    120.85786628] 

回答

2

傳遞函數係數的正確參數是[a][1, -b]

處理您所需的初始條件,則可以使用scipy.signal.lfiltic創建過濾器的正確的初始狀態:

zi = lfiltic([a], [1, -b], y=[x[0]]) 

然後調用lfilterzi說法:

y, zo = lfilter([a], [1, -b], x, zi=zi) 

這裏有一個xy(使用lfilterzi計算)和您的true_y

In [37]: x 
Out[37]: array([ 3., 1., 2., 0., -1., 2.]) 

In [38]: y 
Out[38]: 
array([ 3.  , 2.94  , 2.9118 , 2.824446 , 2.70971262, 
     2.68842124]) 

In [39]: true_y 
Out[39]: 
array([ 3.  , 2.94  , 2.9118 , 2.824446 , 2.70971262, 
     2.68842124]) 
1

把你的濾波器的z變換,這爲您提供分子b和分母a值:

 alpha 
y(z) = ------------------ x(z) 
     1 - (1-alpha) z^-1 

所以你運行

import scipy.signal 
x[0] /= alpha 
y = scipy.signal.lfilter([alpha], [1, - 1 + alpha], x) 

其中產量

array([ 101.1818 , 101.176862 , 101.16819314, ..., 120.9813121 , 
     120.92484874, 120.85786628]) 

注意我攀登x[0]考慮到你要的初始條件。

+0

似乎是在正確的軌道上,但有些事情是關閉的。結果'y'應該從上面等於'true_y'。我也從設置'a [0] = 0',即'[0,1-alpha]'('ValueError:BUG:filter coefficient a [0] == 0 yet supported')中得到錯誤。 –

+1

遞歸關係可以寫成'y [k] - (1-a)* y [k-1] = a * x [k]'。取*表示*的z變換並求解'Y(z)'得到傳遞函數。 –

+0

我需要刷一下我的z轉換技能看起來:-D –