freqz_sos#
- scipy.signal.freqz_sos(sos, worN=512, whole=False, fs=6.283185307179586)[Quelle]#
Berechnet die Frequenzantwort eines digitalen Filters im SOS-Format.
Gegeben sei sos, ein Array mit der Form (n, 6) von Zweigstellen zweiter Ordnung eines digitalen Filters, berechnen Sie die Frequenzantwort der Systemfunktion
B0(z) B1(z) B{n-1}(z) H(z) = ----- * ----- * ... * --------- A0(z) A1(z) A{n-1}(z)
für z = exp(omega*1j), wobei B{k}(z) und A{k}(z) Zähler und Nenner der Übertragungsfunktion des k-ten Zweigstellen zweiter Ordnung sind.
- Parameter:
- sosarray_like
Array von Koeffizienten von Filtersektionen zweiter Ordnung, muss die Form
(n_sections, 6)haben. Jede Zeile entspricht einer Filtersektion zweiter Ordnung, wobei die ersten drei Spalten die Zählerkoeffizienten und die letzten drei die Nennerkoeffizienten liefern.- worN{None, int, array_like}, optional
Wenn eine einzelne Ganzzahl, berechnen Sie dann bei dieser Anzahl von Frequenzen (Standard ist N=512). Die Verwendung einer Zahl, die für FFT-Berechnungen schnell ist, kann zu schnelleren Berechnungen führen (siehe Hinweise zu
freqz).Wenn array_like, berechnen Sie die Antwort bei den gegebenen Frequenzen (muss 1-D sein). Diese sind in denselben Einheiten wie fs.
- wholebool, optional
Normalerweise werden Frequenzen von 0 bis zur Nyquist-Frequenz, fs/2 (obere Hälfte des Einheitskreises) berechnet. Wenn whole True ist, berechnen Sie Frequenzen von 0 bis fs.
- fsfloat, optional
Die Abtastfrequenz des digitalen Systems. Standardmäßig 2*pi Radiant/Abtastung (also w von 0 bis pi).
Hinzugefügt in Version 1.2.0.
- Rückgabe:
- wndarray
Die Frequenzen, bei denen h berechnet wurde, in denselben Einheiten wie fs. Standardmäßig wird w auf den Bereich [0, pi) (Radiant/Sample) normalisiert.
- hndarray
Die Frequenzantwort als komplexe Zahlen.
Hinweise
Diese Funktion hieß in älteren Versionen (≥ 0.19.0)
sosfreqz.Hinzugefügt in Version 1.15.0.
Beispiele
Entwirft einen Bandpassfilter 15. Ordnung im SOS-Format.
>>> from scipy import signal >>> import numpy as np >>> sos = signal.ellip(15, 0.5, 60, (0.2, 0.4), btype='bandpass', ... output='sos')
Berechnet die Frequenzantwort bei 1500 Punkten von DC bis Nyquist.
>>> w, h = signal.freqz_sos(sos, worN=1500)
Zeichnet die Antwort.
>>> import matplotlib.pyplot as plt >>> plt.subplot(2, 1, 1) >>> db = 20*np.log10(np.maximum(np.abs(h), 1e-5)) >>> plt.plot(w/np.pi, db) >>> plt.ylim(-75, 5) >>> plt.grid(True) >>> plt.yticks([0, -20, -40, -60]) >>> plt.ylabel('Gain [dB]') >>> plt.title('Frequency Response') >>> plt.subplot(2, 1, 2) >>> plt.plot(w/np.pi, np.angle(h)) >>> plt.grid(True) >>> plt.yticks([-np.pi, -0.5*np.pi, 0, 0.5*np.pi, np.pi], ... [r'$-\pi$', r'$-\pi/2$', '0', r'$\pi/2$', r'$\pi$']) >>> plt.ylabel('Phase [rad]') >>> plt.xlabel('Normalized frequency (1.0 = Nyquist)') >>> plt.show()
Wenn derselbe Filter als einzelne Übertragungsfunktion implementiert ist, verfälschen numerische Fehler die Frequenzantwort.
>>> b, a = signal.ellip(15, 0.5, 60, (0.2, 0.4), btype='bandpass', ... output='ba') >>> w, h = signal.freqz(b, a, worN=1500) >>> plt.subplot(2, 1, 1) >>> db = 20*np.log10(np.maximum(np.abs(h), 1e-5)) >>> plt.plot(w/np.pi, db) >>> plt.ylim(-75, 5) >>> plt.grid(True) >>> plt.yticks([0, -20, -40, -60]) >>> plt.ylabel('Gain [dB]') >>> plt.title('Frequency Response') >>> plt.subplot(2, 1, 2) >>> plt.plot(w/np.pi, np.angle(h)) >>> plt.grid(True) >>> plt.yticks([-np.pi, -0.5*np.pi, 0, 0.5*np.pi, np.pi], ... [r'$-\pi$', r'$-\pi/2$', '0', r'$\pi/2$', r'$\pi$']) >>> plt.ylabel('Phase [rad]') >>> plt.xlabel('Normalized frequency (1.0 = Nyquist)') >>> plt.show()