scipy.signal.

lfilter_zi#

scipy.signal.lfilter_zi(b, a)[Quelle]#

Konstruiert Anfangsbedingungen für lfilter für den stationären Zustand der Sprungantwort.

Berechnet einen Anfangszustand zi für die Funktion lfilter, der dem stationären Zustand der Sprungantwort entspricht.

Eine typische Verwendung dieser Funktion ist das Festlegen des Anfangszustands, sodass die Ausgabe des Filters mit demselben Wert wie das erste Element des zu filternden Signals beginnt.

Parameter:
b, aarray_like (1-D)

Die Koeffizienten des IIR-Filters. Weitere Informationen finden Sie unter lfilter.

Rückgabe:
zi1-D ndarray

Der Anfangszustand für den Filter.

Siehe auch

lfilter, lfiltic, filtfilt

Hinweise

Ein linearer Filter der Ordnung m hat eine Zustandsraumdarstellung (A, B, C, D), für die die Ausgabe y des Filters wie folgt ausgedrückt werden kann:

z(n+1) = A*z(n) + B*x(n)
y(n)   = C*z(n) + D*x(n)

wobei z(n) ein Vektor der Länge m ist, A die Form (m, m), B die Form (m, 1), C die Form (1, m) und D die Form (1, 1) hat (vorausgesetzt, x(n) ist ein Skalar). lfilter_zi löst

zi = A*zi + B

Mit anderen Worten, es findet die Anfangsbedingung, für die die Antwort auf eine Eingabe von lauter Einsen konstant ist.

Gegeben die Filterkoeffizienten a und b, sind die Zustandsraummatrizen für die transponierte Implementierung der direkten Form II des linearen Filters, die von scipy.signal.lfilter verwendet wird:

A = scipy.linalg.companion(a).T
B = b[1:] - a[1:]*b[0]

vorausgesetzt a[0] ist 1.0; wenn a[0] nicht 1 ist, werden a und b zuerst durch a[0] geteilt.

Beispiele

Der folgende Code erstellt einen Tiefpass-Butterworth-Filter. Dann wendet er diesen Filter auf ein Array an, dessen Werte alle 1.0 sind; die Ausgabe ist ebenfalls nur 1.0, wie für einen Tiefpassfilter zu erwarten. Wenn das Argument zi von lfilter nicht angegeben worden wäre, hätte die Ausgabe das Einschwingverhalten gezeigt.

>>> from numpy import array, ones
>>> from scipy.signal import lfilter, lfilter_zi, butter
>>> b, a = butter(5, 0.25)
>>> zi = lfilter_zi(b, a)
>>> y, zo = lfilter(b, a, ones(10), zi=zi)
>>> y
array([1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])

Ein weiteres Beispiel

>>> x = array([0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.0])
>>> y, zf = lfilter(b, a, x, zi=zi*x[0])
>>> y
array([ 0.5       ,  0.5       ,  0.5       ,  0.49836039,  0.48610528,
    0.44399389,  0.35505241])

Beachten Sie, dass das Argument zi für lfilter mit lfilter_zi berechnet und mit x[0] skaliert wurde. Dann hat die Ausgabe y kein Einschwingverhalten, bis die Eingabe von 0.5 auf 0.0 fällt.