Real-World Signale und Systeme Gehäuse: Analog Filter Design mit einem Twist

Sie sind die Aufgabe der Gestaltung eines analogen (Continuous-Time) angegeben filtern, um die Amplitudengang Spezifikationen gezeigt zu erfüllen. Sie müssen auch die Filtersprungantwort zu finden, die den Wert des Spitzenüberschwingens zu bestimmen, und die Zeit, wo die Spitzenüberschwingen auftritt.

bild0.jpg

Das Ziel des Filterentwurf ist für den Frequenzgang in Betrag dB (20log10|H(f) |) Durch den nicht schattierten Bereich der Figur mit steigender Frequenz zu übergeben. Die Designanforderungen zu reduzieren, um die Bandbreite und die Sperrbereich kritische Frequenzen fp und fs Hz und die Bandbreite und die Sperrdämpfung Ebenen EINp und EINs dB.

Zusätzlich ist die Reaktionscharakteristik zu sein Butterworth, was bedeutet, dass die Filter Magnitudenantwort und Systemfunktion dieses Formular übernehmen:

image1.jpg

Hier, N ist die Filterordnung, fc ist das Durchlaßband 3 dB-Grenzfrequenz des Filters ist, und die Pole, auf einem Halbkreis gelegen ist die linke, die Hälfte s-Flugzeug, sind gegeben durch

image2.jpg

Dieses Problem erfordert, dass Sie in der Frequenzdomäne, der Zeitdomäne zu arbeiten, und vielleicht s-Domäne, in Abhängigkeit von der Lösungsansatz Sie wählen.

Von den Anforderungen weist die Filterfrequenzgang mit Verstärkungsfaktor Eins (0 dB) im Durchlaßbereich. Die Sprungantwort (ein Zeitbereichscharakterisierung) des Butterworth-Filters ist bekannt Einheit zu überschreiten, bevor sie schließlich Absetzen der Einheit als

image3.jpg

Um den Filter zu entwerfen, können Sie einen von zwei Ansätzen verwendet werden:

  1. Die Arbeit, eine Lösung mit der Hand, die Butterbetragsfrequenzgang mit |HBU(f) | und die Systemfunktion, HBU(s).

  2. Verwenden Sie die Filter-Design-Fähigkeiten des SciPy Signal Paket.

Das Finden der Filterordnung und 3 dB-Grenzfrequenz

Gehen Sie wie folgt vor, um den Filter zu entwerfen, von Python und SciPy mit knirsch die tatsächliche Zahl zu tun:

  1. Finden N und fc die Größenreaktion Anforderungen gerecht zu werden.

    Verwenden Sie die Funktion SciPy N, wc = signal.buttord (wp, ws, Ap, As, analog = 1) und geben Sie die Filter Design-Anforderungen, in denen wp und ws sind die Durchlaß- und Sperrbereich kritische Frequenzen in rad / s und Ap und Wie die Bandbreite und die Sperrdämpfung Niveaus sind (beide Sätze von Zahlen stammen aus der vorangegangenen Abbildung). Die Funktion liefert die Filterordnung N und die Grenzfrequenz Toilette in rad / s.

  2. Synthesize den Filter - finden Sie die {bk} und {eink} Koeffizienten der LCC Differentialgleichung, die das gewünschte System realisiert.

    Wenn der Suche nach Elementen Schaltung das Ende des Spiels ist, können Sie gehen dort sofort, Schaltungssynthese Formeln. Rufen Sie die Funktion SciPy b, a = signal.butter (N, WC, analog = 1) mit dem Filter Ordnung und der Cutoff-Frequenz, und es gibt die Filterkoeffizienten in Arrays b und ein.

  3. Finden Sie die Sprungantwort in exakte mathematische Form oder durch Simulation.

Hier ist, wie die Python-Tools mit den gegebenen Design-Anforderungen zu verwenden und dann die Arbeit überprüfen, indem Sie den Frequenzgang als Overlay aufgetragen ist. Hinweis: Sie können mit fast der gleichen Syntax die gleiche Sache in MATLAB tun.

Im [379]: N, WC = signal.buttord (2 * pi * 1e3,2 * pi * 10e3,3.0,50, analog = 1) Filter, um # find NIn [380]: N # Filter orderOut [380]: 3In [381]: WC-Freq # Cutoff in rad / sOut [381]: 9222.4701630595955In [382]: B, a = signal.butter (N, WC, analog = 1) # get coeffs.In [383]: BOut [383]: Array ([7.84407571e + 11 + 0.j]) in [384]: Real (a) Out [384]: Array ([1.00000000e + 00, 1.84449403e + 04,1.70107912e + 08,7.84407571e + 11])

Die Ergebnisse der Zeile [379] sagen, dass die erforderliche Filterordnung ist N = 3 und die erforderliche Filter-Cutoff-Frequenz

image4.jpg

Die Filterkoeffizientensätze werden ebenfalls in den Ergebnissen enthalten.

Verwenden Sie die echt() Funktion, um sicher den Realteil des Koeffizienten-Array angezeigt werden ein weil Sie die Koeffizienten sind real kennen. Wie? Die Pole, Nenner Wurzeln HBU(s), Sind real oder in komplexen konjugierten Paaren auftreten, um sicherzustellen, dass der Nenner Polynom reelle Koeffizienten hat, wenn multipliziert werden. Die sehr kleinen imaginären Teile sind aufgrund numerischer Präzision Fehler.

Überprüfen der endgültige Design Frequenzgang

Um das Design zu überprüfen, verwenden Sie den Frequenzgang Rezept.

Im [386]: F = logspace (2,5,500) # log Frequenz AxisIn [387]: W, H = signal.freqs (b, a, 2 * f pi *) In [388]: Semilogx (f, 20 * log10 (abs (H)), 'g')

Die Abbildung zeigt das Diagramm der endgültigen Design Magnitudenantwort zusammen mit den Original-Design-Anforderungen.

image5.jpg

Finden der Sprungantwort von den Filterkoeffizienten

Die eleganteste Ansatz, um die Sprungantwort von den Filterkoeffizienten zu finden, ist zu finden

image6.jpgimage7.jpg

Das s-Domain-Abschnitt der Figur zeigt, wie Partialbruchentwicklung (PFE) numerisch zu vervollständigen. Sie haben die Koeffizienten-Arrays für H(s), So dass alles, was Sie tun müssen, ist der Nenner Polynom multiplizieren s. Sie können dies von Hand tun, oder Sie eine Beziehung zwischen Polynomkoeffizienten und Sequenz Faltung verwenden können.

Wenn Sie zwei Polynome multiplizieren, werden die Koeffizienten-Arrays für jedes Polynom gefaltet, wie in der Folge Faltung.

Hier arbeiten Sie durch das Problem, indem signal.convolve Polynom-Multiplikation im Nenner auszuführen. Sie zu überzeugen, dass dies wirklich funktioniert, sollten Multiplikation der folgenden zwei Polynome:

(x2 + x + 1) (x + 1) = x3 + 2x2 + 2x + 1

Wenn Sie die Koeffizienten-Sets convolve [1, 1, 1] und [1, 1] als Arrays in Python, können Sie diese Ausgabe erhalten:

Im [418]: Signal.convolve ([1,1,1], [1,1]) Out [418]: Array ([1, 2, 2, 1])

Dies stimmt mit der Hand Berechnung. Um die PFE finden, schließen Sie die Koeffizienten-Arrays b und convolve (a, [1,0]) in R, p, K = Rest (b, a). Die Koeffizienten [1, 0] entsprechen dem s-Domain-Polynom s + 0.

Im [420]: R, p, K = signal.residue (b, signal.convolve ([1,0], a)) in [421]: R # (Rückstände) kratzen kleine numerische errorsOut [421]: Array ([1.0000E + 00 + 2.3343e-16j, # Rest 0, imag Teil 0-1.0000e + 00 + 1.0695e-15j, # Rest 1, imag Teil 01.08935e-15 -5.7735e-01J, # 2 Rückstand, Realteil 01.6081e-15 + 5.7735e-01J]) # Rückstand 3, Realteil 0in [422]: P # (Pole) Out [422]: Array ([0,0000 + 0.0000e + 00J, # Pol 0-9222,4702 -1.5454e-12j, # Pol 1, Teil imag 0-4.611,2351 -7.9869e + 03J, pole # 2-4.611,2351 + 7.9869e + 03J]) # Pol 3In [423]: K # (von langen Teilung) Out [423]: Array ([0 + 0.j]) # richtige rational, also keine Begriffe

Sie haben vier Pole: zwei echte und ein konjugiert komplexe Paar - ein bisschen ein Durcheinander zu arbeiten durch, aber es ist machbar. Wenden Sie sich an die Transformation Paar

image8.jpg

die inverse Transformation für alle vier Bedingungen zu berechnen.

Für den konjugierten Pole sind die Reste auch Konjugate. Diese Eigenschaft gilt immer.

Sie können die inverse Transformation der konjugierten Pol Begriffe wie Sinus und Cosinus, unter Verwendung der Eulerschen Formel und die Annullierung der imaginären Teile vor dem Cosinus und Realteile vor dem Sinus schreiben:

bild9.jpg

Dass sie alle zusammen, Sie bekommen ySchritt(t) = u(t) - e-9,222.47tu(t) -2 X 0,5774e-4,611.74tsin (7,986.89t)u(t). diese Form zu haben, ist schön, aber Sie müssen noch die Funktion Maximum zu finden t > 0 ist und die maximale Position. Dazu zeichnen Sie die Funktion und die maximale beobachten.

Ein direkterer Ansatz ist die Simulation zu verwenden, über signal.lsim und die Zeitbereichs-Rezept. Das System-Eingang ist ein Schritt, so dass die Simulationsausgabe die Sprungantwort sein wird. Aus dem simulierten Sprungantwort können Sie die Spitzen Überschreitung numerisch und sehen sie in einem Plan zu berechnen. Der Code IPython Befehlszeile ist

image10.jpg
Im [425]: T = arange (0,0.002,1e-6) # Schritt weniger als kleinste Zeit CONSTANTIN [426]: T, ys, x_state = signal.lsim ((b, a), diejenigen (len (t)), t) In [428]: Plot (t * 1e3, ys)

Mit der Zeit Array t und die Sprungantwort Array ys, Sie können die Verwendung max () und finden() Funktionen, die Aufgabe abzuschließen:

Im [436]: Max (real (ys)) # echte num zu löschen. errorsOut [436]: 1,0814651457627822 # Spitzen Überschreitung is8.14% In [437]: Find (real (ys) == max (real (ys))) Out [437]: Array ([534]) Peak # find bei Index 534In zu sein [439]: T [534] * 1e3 # Zeit bei Index 534 in msOut [439]: 0,5339

Menü