Plotting: Interactive analysis of an RLC ressonant filter

import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interactive
import matplotlib
font = {'family' : 'arial',
        'weight' : 'normal',
        'size'   : 18}

matplotlib.rc('font', **font)

Filtro RLC passa-banda

A função resposta de um filtro RLC com resistor na saída será dada por, $\(H=\frac{R}{R+Z_L+Z_C}\)\( Na expressão acima, \)Z_L\( e \)Z_C$ representam as impedâncias complexas do indutor e capacitor.

Capacitor e Indutor ideais

Neste caso, \(Z_L=jX_L\) e \(Z_C=-jX_C\), sendo que as as reatâncias são dadas por \(X_L=\omega L\) e \(X_C=1/(\omega C)\) $\(H=\frac{R}{R+j(X_L-X_C)}\)$

def T(freq,R,L,C):
    #função para gerar transmitância
    ω = 2*np.pi*freq
    XL = ω*L
    XC = 1/(ω*C)
    H = R/(R+1j*(XL-XC))
    return np.abs(H)**2
#---
#grafico básico
freq = np.linspace(10,1e4,200)
plt.plot(freq,T(freq,100,50e-3,220e-9))
plt.show()
../_images/Plotting - Interactive Transfer function_5_01.png

Abaixo geramos um gráfico dentro de uma função plot_interactive1(R=1e2,L=50,C=220) que nos pemitirá gerar um gráfico interativo, nos quais os três argumentos da função R,L,C serão controlados.

def plot_interactive1(R=1e2,L=50,C=220):
    #Esta função gera o grafico com base nos parâmetros R,L,C
    #Unidades: R[Ω]; L[mH]; C[nF]
    #-------
    L = L*1e-3 #converte para H
    C = C*1e-9 # converte para F
    f0 = 1/(2*np.pi*np.sqrt(L*C)) # ressonancia
    f1 = ((1/2)*((C**-1)*((L**-1)*((C*R)+((C**(1/2))*(((4*L)+(C*(R**2)))**(1/2))))))) /(2*np.pi)
    f2 = ((1/2)*((C**-1)*((L**-1)*((-1*(C*R))+((C**(1/2))*(((4*L)+(C*(R**2)))**(1/2))))))) /(2*np.pi)
    #---graficos
    fig, ax = plt.subplots(1,2,figsize=(12,4))
    #---------------
    #eixo da esquerda
    #---------------
    ax[0].plot(freq,T(freq,R,L,C)) # transmitância
    ax[0].plot(freq,0*freq+0.5,'--k') #meia-altura
    ax[0].plot([f1,f0, f2],[T(f1,R,L,C),T(f0,R,L,C),T(f2,R,L,C)],'or')# pontos da largura meia altura
    #formatação do gráfico
    ax[0].set_xlabel('Frequência (Hz)')
    ax[0].set_ylabel('Transmitância')
    ax[0].set_xlim([10,1e4])
    ax[0].set_ylim([0,1.1])
    ax[0].grid(True)
    #---------------
    #eixo da direita
    #---------------
    ax[1].plot(freq,10*np.log10(T(freq,R,L,C)))
    ax[1].plot(freq,0*freq-3,'--k')
    ax[1].plot([f1, f2],10*np.log10([T(f1,R,L,C),T(f2,R,L,C)]),'or')
    #formatação do gráfico
    ax[1].set_xlabel('Frequência (Hz)')
    ax[1].set_ylabel('Transmitância (dB)')
    ax[1].set_xlim([10,1e4])
    ax[1].set_ylim([-30,0.5])
    ax[1].grid(True)
    plt.xscale('log')
    plt.tight_layout()
    plt.show()
freq = np.linspace(10,1e4,200)
graph1 = interactive(plot_interactive1,R=(1e2,1e3,100),L=(10,100,10),C=(100,800,100))
graph1

Indutor com resistência interna (em série),

Neste caso, \(Z_L=r_L+jX_L\) e \(Z_C=-jX_C\), sendo que as as reatâncias são dadas por \(X_L=\omega L\) e \(X_C=1/(\omega C)\) $\(H=\frac{R}{R+r_l+j(X_L-X_C)}\)$

def T(freq,R=1e2,rl=0,L=50,C=220):
    ω = 2*np.pi*freq
    XL = ω*L
    XC = 1/(ω*C)
    H = R/(R+rl+1j*(XL-XC))
    return np.abs(H)**2
def plot_interactive2(R=1e2,rl=0,L=50,C=220):
    #Esta função gera o grafico com base nos parâmetros R,L,C
    #Unidades: R[Ω]; L[mH]; C[nF]
    L = L*1e-3 #converte para H
    C = C*1e-9 # converte para F
    f0 = 1/(2*np.pi*np.sqrt(L*C)) # ressonancia
    f1 = ((1/2)*((C**-1)*((L**-1)*((C*R)+((C*rl)+(((4*(C*L))+(((-1*(C*R))+(-1*(C*rl)))**2))**(1/2)))))))/(2*np.pi)
    f2 = ((1/2)*((C**-1)*((L**-1)*((-1*(C*R))+((-1*(C*rl))+(((4*(C*L))+(((C*R)+(C*rl))**2))**(1/2)))))))/(2*np.pi)
    #---graficos
    fig, ax = plt.subplots(1,2,figsize=(12,4))
    #---------------
    #eixo da esquerda
    #---------------
    ax[0].plot(freq,T(freq,R,rl,L,C))
    ax[0].plot(freq,0*freq+T(f0,R,rl,L,C)/2,'--k')
    ax[0].plot([f1, f0, f2],[T(f1,R,rl,L,C),T(f0,R,rl,L,C),T(f2,R,rl,L,C)],'or')
    #formatação do gráfico
    ax[0].set_xlabel('Frequência (Hz)')
    ax[0].set_ylabel('Transmitância')
    ax[0].set_xlim([10,1e4])
    ax[0].set_ylim([0,1.1])
    ax[0].grid(True)
    #---------------
    #eixo da direita
    #---------------
    ax[1].plot(freq,10*np.log10(T(freq,R,rl,L,C)))
    ax[1].plot(freq,0*freq +10*np.log10(T(f0,R,rl,L,C))-3,'--k')
    ax[1].plot([f1, f0, f2],10*np.log10([T(f1,R,rl,L,C),T(f0,R,rl,L,C),T(f2,R,rl,L,C)]),'or')
    #formatação do gráfico
    ax[1].set_xlabel('Frequência (Hz)')
    ax[1].set_ylabel('Transmitância (dB)')
    ax[1].set_xlim([10,1e4])
    ax[1].set_ylim([-30,0.5])
    ax[1].grid(True)
    plt.xscale('log')
    plt.tight_layout()
    plt.show()
graph2 = interactive(plot_interactive2,R=(1e2,1e3,100),rl=(0,100,10),L=(10,100,10),C=(100,800,100))
freq = np.linspace(10,1e4,200)
graph2