Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- """
- Created on Sat Nov 14 08:04:09 2020
- @author: steca
- Autore: Stefano Carsi
- Data ultima modifica: 202011140804
- - Qui sovrappongo i due plot relativi a modello per bambini e modello per
- adolescenti in un unico plot
- - Non completo. In realtà neanche iniziato
- ==> Eseguire sempre le sezioni a coppie
- """
- #INIZIO STANDARD
- %matplotlib inline
- import matplotlib.pyplot as plt
- import numpy as np
- from scipy.optimize import curve_fit
- from scipy.signal import find_peaks
- import os
- path = "F:\\Corsi\\Laboratorio 3 - Fisica Moderna\\1 Filtri\\PITONE"
- os.chdir(path)
- #%% *** 1k - piccolo *** [Modello parassita]
- f,v1,v2,dp = np.loadtxt('../DATI/Passa Banda/PassaBandaSerie_1K_4.7mH.csv', \
- delimiter=',', unpack=True, skiprows=21)
- #Calcolo il guadagno
- gain = abs(v2/v1)
- # Parametri per questa particolare cella
- R = 1e3
- L = 4.7e-3
- C = 100e-9
- RP = 12
- Vin = 2 + 0j
- #Creo funzioni di guadagno e sfasamento usando il formalismo complesso
- def gainf(f,r,l,c,rp,cp):
- # =============================================================================
- # 1. So Vin
- # 2. Calcolo Ztot
- # 3. Calcolo la corrente I=Vin/Ztot
- # 4. Calcolo Zout
- # 5. Vout = Zout * I
- # 6. G = Vout/Vin = Zout*I / Zin*I ==> G = Zout/Ztot
- #
- # + è sufficiente la formula [ G = Zout/Ztot ]
- #
- # Nota: Si è assunto Vin con fase nulla
- # =============================================================================
- omega = 2*np.pi*f
- # Dati del circuito [Adattare per il particolare circuito]
- zr = r + 0j
- zc = 0 - 1j/(omega*c)
- zl = 0 + 1j*(omega*l)
- # Parassiti
- zrp = rp + 0j
- zcp = 0 - 1j/(omega*cp)
- # Calcolo le impedenze [Adattare per il particolare circuito]
- # Calcolo Z dell'induttore
- zindutt = 1/( 1/zcp + 1/(zl + zrp) )
- # Impedenza del circuito
- ztot = zindutt + zr + zc
- # In uscita
- zout = zr
- # Applico la formula
- return abs(zout/ztot)
- def sfasf(f,r,l,c,rp,cp):
- # =============================================================================
- # 1. Assumo Vin con fase nulla (Tanto contano solo le fasi relative)
- # 2. Calcolo Ztot
- # 3. So quindi la fase di Ztot
- # 4. Poichè I=Vin/Ztot, la fase di I è (-Fase di Ztot)
- # 5. Poichè Vout = I*Zout, la fase di Vout è (fase di I + Fase di Zout)
- # 6. Lo sfasamento è quindi la fase di Vout
- #
- # Nota: Si è assunto Vin con fase nulla, tanto conta la differenza di fase
- # =============================================================================
- omega = 2*np.pi*f
- # Dati del circuito [Adattare per il particolare circuito]
- zr = r + 0j
- zc = 0 - 1j/(omega*c)
- zl = 0 + 1j*(omega*l)
- # Parassiti
- zrp = rp + 0j
- zcp = 0 - 1j/(omega*cp)
- # Calcolo Ztot [Adattare per il particolare circuito]
- # Calcolo Z dell'induttore
- zindutt = 1/( 1/zcp + 1/(zl + zrp) )
- # Impedenza del circuito
- ztot = zindutt + zr + zc
- # Calcolo la corrente
- I = Vin/ztot
- # Calcolo Zout [Adattare per il particolare circuito]
- zout = zr
- # Calcolo Vout
- Vout = zout*I
- # Ritorno la fase di Vout
- return np.angle(Vout, deg=True)
- # Fit
- # Fit per verificare il valore della capacità C e L
- # Effettuo il fit passando funzione, vettori da fittare e starting point dei parametri
- # Nella funzione, direi che la prima è la variabile, tutti gli altri i parametri
- pars0=[R,L,C,RP,1e-11]
- parsG, cov = curve_fit(gainf, f, gain, p0=pars0)
- parsS, cov = curve_fit(sfasf, f, dp, p0=pars0)
- # "Esporto i parametri con questo fit
- f_par = f
- dp_par = sfasf(f,*parsS)
- gain_par = gainf(f,*parsG)
- """
- Inizia la sezione del modello per bambini
- """
- #Creo funzioni di guadagno e sfasamento usando il formalismo complesso
- def gainf(f,r,l,c):
- # =============================================================================
- # 1. So Vin
- # 2. Calcolo Ztot
- # 3. Calcolo la corrente I=Vin/Ztot
- # 4. Calcolo Zout
- # 5. Vout = Zout * I
- # 6. G = Vout/Vin = Zout*I / Zin*I ==> G = Zout/Ztot
- #
- # + è sufficiente la formula [ G = Zout/Ztot ]
- #
- # Nota: Si è assunto Vin con fase nulla
- # =============================================================================
- omega = 2*np.pi*f
- # Dati del circuito [Adattare per il particolare circuito]
- zr = r + 0j
- zc = 0 - 1j/(omega*c)
- zl = 0 + 1j*(omega*l)
- # Calcolo le impedenze [Adattare per il particolare circuito]
- ztot = zr+zc+zl #Sono in serie
- zout = zr
- # Applico la formula
- return abs(zout/ztot)
- def sfasf(f,r,l,c):
- # =============================================================================
- # 1. Assumo Vin con fase nulla (Tanto contano solo le fasi relative)
- # 2. Calcolo Ztot
- # 3. So quindi la fase di Ztot
- # 4. Poichè I=Vin/Ztot, la fase di I è (-Fase di Ztot)
- # 5. Poichè Vout = I*Zout, la fase di Vout è (fase di I + Fase di Zout)
- # 6. Lo sfasamento è quindi la fase di Vout
- #
- # Nota: Si è assunto Vin con fase nulla, tanto conta la differenza di fase
- # =============================================================================
- omega = 2*np.pi*f
- # Dati del circuito [Adattare per il particolare circuito]
- zr = r + 0j
- zc = 0 - 1j/(omega*c)
- zl = 0 + 1j*(omega*l)
- # Calcolo Ztot [Adattare per il particolare circuito]
- ztot = zr+zc+zl #Sono in serie
- # Calcolo la corrente
- I = Vin/ztot
- # Calcolo Zout [Adattare per il particolare circuito]
- zout = zr
- # Calcolo Vout
- Vout = zout*I
- # Ritorno la fase di Vout
- return np.angle(Vout, deg=True)
- """
- Fit con modello per bambini
- """
- # Fit
- # Fit per verificare il valore della capacità C e L
- # Effettuo il fit passando funzione, vettori da fittare e starting point dei parametri
- # Nella funzione, direi che la prima è la variabile, tutti gli altri i parametri
- pars0=[R,L,C]
- condizione = f < 2e5
- f_sub=f[condizione]
- gain_sub = gain[condizione]
- dp_sub = dp[condizione]
- parsG, cov = curve_fit(gainf, f_sub, gain_sub, p0=pars0)
- parsS, cov = curve_fit(sfasf, f_sub, dp_sub, p0=pars0)
- # Lo plotto
- fig = plt.figure(figsize=(12,5))
- plt.suptitle('Guadagno e sfasamento in funzione della frequenza (filtro passa banda serie)\n(R = 1K - L Piccolo)', fontsize=16) # super title
- plt.subplot(1,2,1)
- plt.yscale('log')
- plt.xscale('log')
- plt.xlabel('Frequenza (Hz)',fontsize=14)
- plt.ylabel('Guadagno (Vout/Vin)',fontsize=14)
- plt.grid()
- plt.plot(f,gain, label='Dati')
- plt.plot(f,gainf(f,R,L,C),linestyle='--',label='Modello teorico')
- plt.plot(f_sub,gainf(f_sub,*parsG),':r',label='Fit con modello semplice')
- plt.plot(f_par,gain_par, label='Fit con modello parassita', ls=":")
- plt.legend(fontsize=14)#(fontsize=14)
- plt.axvline(x=f_sub[-1], linestyle="--", color="grey")
- plt.subplot(1,2,2)
- plt.xscale('log')
- plt.ylabel('Sfasamento (deg)',fontsize=14)
- plt.xlabel('Frequenza (Hz)',fontsize=14)
- plt.grid()
- plt.plot(f,dp, label='Dati')
- plt.plot(f,sfasf(f,R,L,C),linestyle='--',label='Modello teorico')
- plt.plot(f_sub,sfasf(f_sub,*parsS),':r',label='Fit con modello semplice')
- plt.plot(f_par,dp_par, label='Fit con modello parassita', ls=":")
- plt.legend(fontsize=14)#(fontsize=14)
- plt.axvline(x=f_sub[-1], linestyle="--", color="grey")
- # Cerco la f0
- g0 = np.max(gain)
- # Disegno sul grafico
- plt.subplot(1,2,1)
- plt.axhline(y = ((1/np.sqrt(2)) * g0) , linestyle=":" , color="grey" )
- plt.savefig('../RELAZIONE/FIGURE/passa-banda-serie/1k-piccolo-unito.eps', format='eps')
- plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement