LABO 3

Plot segnale e fit con esponenziale

Esempio di fit di un sottorange del segnale

Import dei moduli necessari, lettura dati da file csv, plot segnali.

I dati provengono da onda quadra (f=500 Hz) attraverso un filtro CR passa-alto con frequenza a 3dB di 10 kH.

In [1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
time,v1,v2 = np.loadtxt('dati/passa_alto_signal_square_wave.csv', delimiter=',', unpack=True, skiprows=1)
plt.plot(time,v1, label='Canale 1')
plt.plot(time,v2, label='Canale 2')
plt.xlabel('Tempo [s]',fontsize=16)
plt.ylabel('Ampiezza segnali [V]',fontsize=16)
plt.legend(fontsize=16)
plt.show()

Vogliamo analizzare la curva esponenziale e verificare che la costante di tempo corrisponda alla costante di tempo caratteristica del circuito RC.

Per farlo prima definiamo la funzione esponenziale e poi la usiamo per un fit su un sottoinsieme dei dati.

In [2]:
time_sub=time[(time>0.0001) & (time<0.0007)]
v2_sub = v2[(time>0.0001) & (time<0.0007)]
plt.plot(time,v1, label='Canale 1')
plt.plot(time_sub,v2_sub, label='Canale 2')

def expo(t,A,RC):
    return A*np.exp(-t/RC)

pars0=[1,100e-6]

plt.plot(time_sub,expo(time_sub,*pars0), label='Esp. prima del fit')
pars, cov = curve_fit(expo,time_sub,v2_sub,p0=pars0)
plt.plot(time_sub,expo(time_sub,*pars),'--r', label='Esp. dopo del fit')
plt.legend()
plt.show()
         
print('Parametri risultanti del fit: ')
print('p0 = A = %s V' % pars[0])
print('p1 = RC = %s' % pars[1])
Parametri risultanti del fit: 
p0 = A = 1.9364944113113243 V
p1 = RC = 9.791076560205935e-05

Per mostrare solo l'esponenziale basta ripetere il plot di prima escludendo il Canale 1 (che allarga il range)

In [3]:
plt.title('Fit esponenziale',fontsize=16)
plt.xlabel('Tempo [s]',fontsize=16)
plt.ylabel('Ampiezza segnale [V]',fontsize=16)
plt.plot(time_sub,v2_sub, label='Canale 2')
plt.plot(time_sub,expo(time_sub,*pars0), label='Esp. prima del fit')
plt.plot(time_sub,expo(time_sub,*pars),'--r', label='Esp. dopo del fit')
plt.legend(fontsize=16)
plt.show()