簡體   English   中英

遞歸:帶有`scipy.lfilter`的IIR過濾器

[英]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)

這是一個xy (使用帶有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM