Advertisement
Stex6299

Untitled

Nov 14th, 2020
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.79 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sat Nov 14 08:04:09 2020
  4.  
  5. @author: steca
  6.  
  7. Autore: Stefano Carsi
  8. Data ultima modifica: 202011140804
  9.  
  10. - Qui sovrappongo i due plot relativi a modello per bambini e modello per
  11. adolescenti in un unico plot
  12.  
  13. - Non completo. In realtà neanche iniziato
  14.  
  15. ==> Eseguire sempre le sezioni a coppie
  16.  
  17.  
  18. """
  19.  
  20. #INIZIO STANDARD
  21. %matplotlib inline
  22. import matplotlib.pyplot as plt
  23. import numpy as np
  24. from scipy.optimize import curve_fit
  25. from scipy.signal import find_peaks
  26.  
  27.  
  28. import os
  29. path = "F:\\Corsi\\Laboratorio 3 - Fisica Moderna\\1 Filtri\\PITONE"
  30. os.chdir(path)
  31.  
  32.  
  33.  
  34. #%% *** 1k - piccolo *** [Modello parassita]
  35. f,v1,v2,dp = np.loadtxt('../DATI/Passa Banda/PassaBandaSerie_1K_4.7mH.csv', \
  36. delimiter=',', unpack=True, skiprows=21)
  37.  
  38. #Calcolo il guadagno
  39. gain = abs(v2/v1)
  40.  
  41. # Parametri per questa particolare cella
  42. R = 1e3
  43. L = 4.7e-3
  44. C = 100e-9
  45.  
  46. RP = 12
  47.  
  48. Vin = 2 + 0j
  49.  
  50. #Creo funzioni di guadagno e sfasamento usando il formalismo complesso
  51. def gainf(f,r,l,c,rp,cp):
  52. # =============================================================================
  53. # 1. So Vin
  54. # 2. Calcolo Ztot
  55. # 3. Calcolo la corrente I=Vin/Ztot
  56. # 4. Calcolo Zout
  57. # 5. Vout = Zout * I
  58. # 6. G = Vout/Vin = Zout*I / Zin*I ==> G = Zout/Ztot
  59. #
  60. # + è sufficiente la formula [ G = Zout/Ztot ]
  61. #
  62. # Nota: Si è assunto Vin con fase nulla
  63. # =============================================================================
  64.  
  65. omega = 2*np.pi*f
  66.  
  67. # Dati del circuito [Adattare per il particolare circuito]
  68. zr = r + 0j
  69. zc = 0 - 1j/(omega*c)
  70. zl = 0 + 1j*(omega*l)
  71.  
  72. # Parassiti
  73. zrp = rp + 0j
  74. zcp = 0 - 1j/(omega*cp)
  75.  
  76.  
  77. # Calcolo le impedenze [Adattare per il particolare circuito]
  78.  
  79. # Calcolo Z dell'induttore
  80. zindutt = 1/( 1/zcp + 1/(zl + zrp) )
  81.  
  82. # Impedenza del circuito
  83. ztot = zindutt + zr + zc
  84.  
  85. # In uscita
  86. zout = zr
  87.  
  88.  
  89. # Applico la formula
  90. return abs(zout/ztot)
  91.  
  92.  
  93.  
  94. def sfasf(f,r,l,c,rp,cp):
  95. # =============================================================================
  96. # 1. Assumo Vin con fase nulla (Tanto contano solo le fasi relative)
  97. # 2. Calcolo Ztot
  98. # 3. So quindi la fase di Ztot
  99. # 4. Poichè I=Vin/Ztot, la fase di I è (-Fase di Ztot)
  100. # 5. Poichè Vout = I*Zout, la fase di Vout è (fase di I + Fase di Zout)
  101. # 6. Lo sfasamento è quindi la fase di Vout
  102. #
  103. # Nota: Si è assunto Vin con fase nulla, tanto conta la differenza di fase
  104. # =============================================================================
  105.  
  106. omega = 2*np.pi*f
  107.  
  108. # Dati del circuito [Adattare per il particolare circuito]
  109. zr = r + 0j
  110. zc = 0 - 1j/(omega*c)
  111. zl = 0 + 1j*(omega*l)
  112.  
  113. # Parassiti
  114. zrp = rp + 0j
  115. zcp = 0 - 1j/(omega*cp)
  116.  
  117. # Calcolo Ztot [Adattare per il particolare circuito]
  118. # Calcolo Z dell'induttore
  119. zindutt = 1/( 1/zcp + 1/(zl + zrp) )
  120. # Impedenza del circuito
  121. ztot = zindutt + zr + zc
  122.  
  123. # Calcolo la corrente
  124. I = Vin/ztot
  125.  
  126. # Calcolo Zout [Adattare per il particolare circuito]
  127. zout = zr
  128.  
  129. # Calcolo Vout
  130. Vout = zout*I
  131.  
  132. # Ritorno la fase di Vout
  133. return np.angle(Vout, deg=True)
  134.  
  135.  
  136.  
  137.  
  138.  
  139. # Fit
  140. # Fit per verificare il valore della capacità C e L
  141. # Effettuo il fit passando funzione, vettori da fittare e starting point dei parametri
  142. # Nella funzione, direi che la prima è la variabile, tutti gli altri i parametri
  143.  
  144. pars0=[R,L,C,RP,1e-11]
  145.  
  146. parsG, cov = curve_fit(gainf, f, gain, p0=pars0)
  147. parsS, cov = curve_fit(sfasf, f, dp, p0=pars0)
  148.  
  149.  
  150.  
  151. # "Esporto i parametri con questo fit
  152. f_par = f
  153. dp_par = sfasf(f,*parsS)
  154. gain_par = gainf(f,*parsG)
  155.  
  156.  
  157.  
  158. """
  159. Inizia la sezione del modello per bambini
  160. """
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167. #Creo funzioni di guadagno e sfasamento usando il formalismo complesso
  168. def gainf(f,r,l,c):
  169. # =============================================================================
  170. # 1. So Vin
  171. # 2. Calcolo Ztot
  172. # 3. Calcolo la corrente I=Vin/Ztot
  173. # 4. Calcolo Zout
  174. # 5. Vout = Zout * I
  175. # 6. G = Vout/Vin = Zout*I / Zin*I ==> G = Zout/Ztot
  176. #
  177. # + è sufficiente la formula [ G = Zout/Ztot ]
  178. #
  179. # Nota: Si è assunto Vin con fase nulla
  180. # =============================================================================
  181.  
  182. omega = 2*np.pi*f
  183.  
  184. # Dati del circuito [Adattare per il particolare circuito]
  185. zr = r + 0j
  186. zc = 0 - 1j/(omega*c)
  187. zl = 0 + 1j*(omega*l)
  188.  
  189. # Calcolo le impedenze [Adattare per il particolare circuito]
  190. ztot = zr+zc+zl #Sono in serie
  191. zout = zr
  192.  
  193. # Applico la formula
  194. return abs(zout/ztot)
  195.  
  196.  
  197.  
  198. def sfasf(f,r,l,c):
  199. # =============================================================================
  200. # 1. Assumo Vin con fase nulla (Tanto contano solo le fasi relative)
  201. # 2. Calcolo Ztot
  202. # 3. So quindi la fase di Ztot
  203. # 4. Poichè I=Vin/Ztot, la fase di I è (-Fase di Ztot)
  204. # 5. Poichè Vout = I*Zout, la fase di Vout è (fase di I + Fase di Zout)
  205. # 6. Lo sfasamento è quindi la fase di Vout
  206. #
  207. # Nota: Si è assunto Vin con fase nulla, tanto conta la differenza di fase
  208. # =============================================================================
  209.  
  210. omega = 2*np.pi*f
  211.  
  212. # Dati del circuito [Adattare per il particolare circuito]
  213. zr = r + 0j
  214. zc = 0 - 1j/(omega*c)
  215. zl = 0 + 1j*(omega*l)
  216.  
  217. # Calcolo Ztot [Adattare per il particolare circuito]
  218. ztot = zr+zc+zl #Sono in serie
  219.  
  220. # Calcolo la corrente
  221. I = Vin/ztot
  222.  
  223. # Calcolo Zout [Adattare per il particolare circuito]
  224. zout = zr
  225.  
  226. # Calcolo Vout
  227. Vout = zout*I
  228.  
  229. # Ritorno la fase di Vout
  230. return np.angle(Vout, deg=True)
  231.  
  232.  
  233.  
  234.  
  235. """
  236. Fit con modello per bambini
  237. """
  238.  
  239.  
  240.  
  241.  
  242. # Fit
  243. # Fit per verificare il valore della capacità C e L
  244. # Effettuo il fit passando funzione, vettori da fittare e starting point dei parametri
  245. # Nella funzione, direi che la prima è la variabile, tutti gli altri i parametri
  246.  
  247. pars0=[R,L,C]
  248.  
  249. condizione = f < 2e5
  250.  
  251. f_sub=f[condizione]
  252. gain_sub = gain[condizione]
  253. dp_sub = dp[condizione]
  254.  
  255.  
  256. parsG, cov = curve_fit(gainf, f_sub, gain_sub, p0=pars0)
  257. parsS, cov = curve_fit(sfasf, f_sub, dp_sub, p0=pars0)
  258.  
  259.  
  260. # Lo plotto
  261. fig = plt.figure(figsize=(12,5))
  262.  
  263. plt.suptitle('Guadagno e sfasamento in funzione della frequenza (filtro passa banda serie)\n(R = 1K - L Piccolo)', fontsize=16) # super title
  264. plt.subplot(1,2,1)
  265. plt.yscale('log')
  266. plt.xscale('log')
  267. plt.xlabel('Frequenza (Hz)',fontsize=14)
  268. plt.ylabel('Guadagno (Vout/Vin)',fontsize=14)
  269. plt.grid()
  270. plt.plot(f,gain, label='Dati')
  271. plt.plot(f,gainf(f,R,L,C),linestyle='--',label='Modello teorico')
  272. plt.plot(f_sub,gainf(f_sub,*parsG),':r',label='Fit con modello semplice')
  273. plt.plot(f_par,gain_par, label='Fit con modello parassita', ls=":")
  274. plt.legend(fontsize=14)#(fontsize=14)
  275. plt.axvline(x=f_sub[-1], linestyle="--", color="grey")
  276.  
  277. plt.subplot(1,2,2)
  278. plt.xscale('log')
  279. plt.ylabel('Sfasamento (deg)',fontsize=14)
  280. plt.xlabel('Frequenza (Hz)',fontsize=14)
  281. plt.grid()
  282. plt.plot(f,dp, label='Dati')
  283. plt.plot(f,sfasf(f,R,L,C),linestyle='--',label='Modello teorico')
  284. plt.plot(f_sub,sfasf(f_sub,*parsS),':r',label='Fit con modello semplice')
  285. plt.plot(f_par,dp_par, label='Fit con modello parassita', ls=":")
  286. plt.legend(fontsize=14)#(fontsize=14)
  287. plt.axvline(x=f_sub[-1], linestyle="--", color="grey")
  288.  
  289.  
  290.  
  291.  
  292. # Cerco la f0
  293. g0 = np.max(gain)
  294.  
  295.  
  296. # Disegno sul grafico
  297. plt.subplot(1,2,1)
  298. plt.axhline(y = ((1/np.sqrt(2)) * g0) , linestyle=":" , color="grey" )
  299.  
  300.  
  301. plt.savefig('../RELAZIONE/FIGURE/passa-banda-serie/1k-piccolo-unito.eps', format='eps')
  302. plt.show()
  303.  
  304.  
  305.  
  306.  
  307.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement