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.
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; wenna[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
lfilternicht 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
lfiltermitlfilter_ziberechnet und mitx[0]skaliert wurde. Dann hat die Ausgabe y kein Einschwingverhalten, bis die Eingabe von 0.5 auf 0.0 fällt.