transformación de lugar en un filtro simple de paso bajo en python

2

Mirando la primera imagen en el enlace, que muestra un gráfico simple de un con y sin desvío la diferencia de voltaje del circuito del filtro, quería recrear esta imagen.

He codificado el ruido y he creado la gráfica de la señal ruidosa:

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()

Problema

Ahora lo difícil es que quiero resolver esto haciendo que el capacitor paralelo se represente como un circuito de paso bajo RC con R = 1, y la función de transferencia correspondiente de $$ V_ {out} = \ dfrac {1} {1 + RCs} \ cdot V_ {in} $$

Estoy confundido con qué hacer con las 's', creo que una transformación de lugar de la entrada? Por favor ayuda, puedo trabajar con impedancias y frecuencia de CA, pero una señal compleja es nueva. ¡un poco de teoría detrás de la variable de laplace seguida de una simple demostración parcial se vería muy apreciada!

    
pregunta IBP

2 respuestas

4

Está intentando trazar en el dominio del tiempo (es decir, el eje x está en segundos) pero su fórmula está en el dominio de la frecuencia ( s es una variable de frecuencia compleja). Necesitaría realizar la transformada inversa de Laplace para volver al dominio del tiempo.

Esto no se puede hacer a menos que tenga una expresión s -domain para Vin , lo cual es complicado dado que acaba de crearla con valores de dominio de tiempo aleatorios. Generalmente cuando se realiza este tipo de cosas de dominio s , la salida solo se calcula para entradas muy simples (pero muy útiles) como funciones de pasos, impulsos u ondas sinusoidales de frecuencia única.

Hay muchas maneras de hacer lo que estás haciendo, y muchas de ellas requieren años de estudio. Según lo sugerido por @sstobbe, creo que la simulación del dominio del tiempo es probablemente tu mejor ruta. Afortunadamente, Python (a través de la biblioteca SciPy) tiene una función equivalente lsim . Solo tienes que construir una función de transferencia del sistema usando lti . Algo como esto:

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)
    
respondido por el Heath Raftery
3

Su voltaje se indica en el dominio del tiempo (valores de voltaje en función del tiempo \ $ t \ $).

Su definición de filtro de paso bajo se encuentra en s-domain (función de transferencia como función de frecuencia compleja \ $ s \ $).

Ambas definiciones no encajan bien (de todos modos me pregunto de dónde sacó la definición de la función de transferencia del filtro si no sabe qué hacer con él).

Propongo usar una definición de tu filtro de paso bajo en el dominio del tiempo , también.

Dicha definición se denomina ecuación diferencial ordinaria y existen métodos bien conocidos ( por ejemplo, muy simple método de Euler o más sofisticado métodos de Runge-Kutta ; también ofrecido por SciPy; vea más abajo) para resolverlo numéricamente para su señal de entrada particular.

La EDO para el filtro de paso bajo es:

\ $ \ frac {d} {dt} v_ {out} (t) = \ frac {1} {RC} (v_ {in} (t) - v_ {out} (t)) \ $

(lo obtiene aplicando KVL, la ley de Ohms y la relación V-I del condensador \ $ \ frac {d} {dt} v = \ frac {1} {C} i \ $)

Y así se vería el script de Python:

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()

La ventaja de esta solución (en comparación con la proporcionada por Heath Raftery) es que es más genérica. Es decir. funciona también para sistemas no lineales (por ejemplo, si incluye un diodo en algún lugar del circuito) y también para sistemas con variación de tiempo (por ejemplo, si cambia repentinamente el valor de algún componente), mientras que el enfoque de Laplace funciona solo para LTI systems .

    
respondido por el Curd

Lea otras preguntas en las etiquetas