Laplace-Transformation auf einem einfachen Tiefpassfilter in Python

Betrachten Sie das erste Bild im Link, das ein einfaches Diagramm einer Spannungsdifferenz mit und ohne Bypass-Filterschaltung zeigt.

Ich wollte dieses Diagramm neu erstellen:

Geben Sie hier die Bildbeschreibung ein

Ich habe das Rauschen codiert und den Graphen des verrauschten Signals erstellt:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

v_in = np.random.uniform(-0.005,0.005,150)+5
v_out = 1/(1+1*0.1E-6*s)*v_in #this line is wrong, no such thing as '*s'

plt.plot(v_in)
plt.plot(v_out)
plt.axis([0, 150, 4.95, 5.05])
plt.title('Bypass capacitor')
plt.ylabel('Volts')
plt.xticks(v_in, " ")
plt.show()

Geben Sie hier die Bildbeschreibung ein

Problem

Der schwierige Teil ist nun, dass ich dies lösen möchte, indem ich den Parallelkondensator als RC-Tiefpassschaltung mit R = 1 und der entsprechenden Übertragungsfunktion darstellen lasse

v Ö u T = 1 1 + R C S v ich N

Ich bin verwirrt, was ich mit dem 's' machen soll. Ich denke, eine Laplace-Transformation der Eingabe wäre erforderlich.

Ich kann mit Impedanzen und AC-Frequenzen arbeiten, aber ein komplexes Signal ist neu. Ein bisschen Theorie hinter der Variablen von Laplace, gefolgt von einer einfachen, teilweise eingerichteten Demo, wäre sehr zu begrüßen!

Wenn Sie sich fragen, was Sie mit 's' machen sollen, müssen Sie ein paar Schritte zurückgehen und etwas über die Laplace-Transformation lesen.
Dies ist, was ich in Matlab verwenden würde: mathworks.com/help/control/ref/lsim.html keine Ahnung von Python
Versuchen Sie, einen einfachen Filter zu entwerfen, den Sie codieren können?

Antworten (2)

Sie versuchen, im Zeitbereich zu zeichnen (dh die x-Achse ist in Sekunden), aber Ihre Formel befindet sich im Frequenzbereich ( sist eine komplexe Frequenzvariable). Sie müssten die inverse Laplace-Transformation durchführen, um zum Zeitbereich zurückzukehren.

Dies ist nur möglich, wenn Sie einen s-domain-Ausdruck für haben Vin, was schwierig ist, da Sie ihn gerade mit zufälligen Zeitbereichswerten erstellt haben. Im Allgemeinen wird bei dieser Art von s-Domain-Zeug die Ausgabe nur für sehr einfache (aber sehr nützliche) Eingaben wie Schrittfunktionen, Impulse oder Sinuswellen mit einer Frequenz berechnet.

Es gibt viele Möglichkeiten, das zu tun, was Sie tun, und viele davon erfordern jahrelanges Studium. Wie von @sstobbe vorgeschlagen, denke ich, dass die Zeitbereichssimulation wahrscheinlich Ihre beste Route ist. Glücklicherweise hat Python (über die SciPy-Bibliothek) eine äquivalente lsimFunktion. Sie müssen nur eine Systemübertragungsfunktion mit konstruieren lti. Etwas wie das:

import matplotlib.pyplot as plt
from scipy import signal

sys = signal.lti(1,[1*0.1E-6,1])
t = np.linspace(0, 5, 150)
v_in = np.random.uniform(-0.005,0.005,150)+5
tout, y, x = signal.lsim(sys, v_in, t)

plt.plot(t, y)

Ihre Spannung wird im Zeitbereich angegeben (Spannungswerte als Funktion der Zeit T ).

Ihre Tiefpassfilterdefinition ist in der s-Domäne angegeben (Übertragungsfunktion als Funktion der komplexen Frequenz S ).

Beide Definitionen passen nicht gut zusammen (ich frage mich sowieso, woher Sie die Übertragungsfunktionsdefinition des Filters haben, wenn Sie nicht wissen, was Sie damit anfangen sollen).

Ich schlage vor, auch im Zeitbereich eine Definition Ihres Tiefpassfilters zu verwenden .

Eine solche Definition wird als gewöhnliche Differentialgleichung bezeichnet und es gibt bekannte Methoden (z. B. sehr einfache Euler-Methode oder anspruchsvollere Runge-Kutta-Methoden ; auch von SciPy angeboten; siehe unten), um sie numerisch für Ihr spezielles Eingangssignal zu lösen.

Die ODE für den Tiefpassfilter ist:

D D T v Ö u T ( T ) = 1 R C ( v ich N ( T ) v Ö u T ( T ) )

(Sie erhalten es, indem Sie KVL, das Ohmsche Gesetz und das VI-Verhältnis des Kondensators anwenden D D T v = 1 C ich )

Und so würde das Python-Skript aussehen:

import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as integrate
#%matplotlib inline

v_in = np.random.uniform(-0.005, 0.005, 150) + 5
tPoints = np.linspace(0, 150 - 1, 150)

# define function that yields v_in(t) at arbitrary values of t:
def vIn(t):
    global tPoint, v_in
    return np.interp(t, tPoints, v_in)

# define constants used in the ODE:
R = 1.0;   C = 1.0  

# define dvOut/dt of ODE:
def dvOut_dt(vOut, t):
    global R, C
    return 1 / (R * C) * (vIn(t) - vOut)

# define starting value:
v_out_start = v_in[0]

# solve ODE by numerical integration:
v_out = integrate.odeint(dvOut_dt, v_out_start, tPoints)

plt.plot(v_in)
plt.plot(v_out)
plt.axis([0, 150, 4.95, 5.05])
plt.title('Bypass capacitor')
plt.ylabel('Volts')
plt.show()

Der Vorteil dieser Lösung (im Vergleich zu der von Heath Raftery) ist, dass sie allgemeiner ist. Das heißt, es funktioniert auch für nichtlineare Systeme (z. B. wenn Sie irgendwo in der Schaltung eine Diode einbauen) und auch für zeitvariante Systeme (z. B. wenn Sie plötzlich einen Wert einer Komponente ändern), während der Laplace-Ansatz nur für LTI-Systeme funktioniert .