[英]Recursion: IIR filter with `scipy.lfilter`
給出一些數據x
:
from pandas_datareader.data import DataReader as dr
x = np.squeeze(dr('DTWEXB', 'fred').dropna().values)
我想計算另一個向量y
如下:
在這種情況下, alpha等於0.03。
我可以用scipy.lfilter?
做到這scipy.lfilter?
。 類似的問題在這里 ,但在這種情況下,結果的起始值是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]
傳遞函數系數的正確參數是[a]
和[1, -b]
。
要處理所需的初始條件,可以使用scipy.signal.lfiltic
為過濾器創建正確的初始狀態:
zi = lfiltic([a], [1, -b], y=[x[0]])
然后使用zi
參數調用lfilter
:
y, zo = lfilter([a], [1, -b], x, zi=zi)
這是一個x
, y
(使用帶有zi
lfilter
計算)和你的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])
采用濾波器的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]
以考慮您想要的初始條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.