LABO 3

Plot segnale e fit con sinusoide

Import dei moduli necessari (numpy, matplotlib.pyplot, scipy.optimize solo per usare curve_fit)

In [1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

Lettura dei dati (file csv con tempo, ampiezza segnale 1, ampiezza segnale 2. Prima riga di header da saltare).

Time (s),Channel 1 (V),Channel 2 (V)
-0.005119632352941177,0.3642274122697351,-0.22513744034737976
-0.0051183823529411766,0.35927128729164592,-0.2244801045750239
-0.0051171323529411762,0.35728883730040834,-0.22448010457502479
-0.0051158823529411767,0.35299352898606634,-0.2264521118920915
-0.0051146323529411763,0.3486982206717224,-0.2261234440059135
...
In [2]:
time,v1,v2 = np.loadtxt('dati/passa_alto_signal.csv', delimiter=',', unpack=True, skiprows=1)

Plot dei due segnali (i dati vengono da un segnale a 500Hz filtrato da un CR passa-alto con frequenza a 3dB di 10 kHz, quindi il segnale è attenuato e sfasato)

In [3]:
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()

Definizione della funzione sinusoidale (con frequenza f, ampiezza A, sfasamento phi) $$f = A sin(2\pi f t + \phi)$$

In [4]:
def fsin(t,f,A,phi):
    return A*np.sin(2*np.pi*f*t+phi)

Possiamo fare il plot della funzione inserendo i parametri a mano (500 Hz, 1 volt, 0 rad di sfasamento)

In [5]:
plt.plot(time,fsin(time,500,1,0))
plt.show()

Oppure usare la funzione per un fit. In questo caso si forniscono dei parametri iniziali ragionevoli e si effettua il fit lasciando i parametri liberi. Per il fit usiamo il secondo segnale.

In [6]:
plt.figure(figsize=(12,5)) # <-- figura un po' piu grande
plt.xlabel('Tempo [s]',fontsize=16)
plt.ylabel('Ampiezza segnali [V]',fontsize=16)
plt.plot(time,v1, label='Canale 1', linewidth=2)
plt.plot(time,v2, label='Canale 2', linewidth=2)

# definisco una lista per metterci i parametri iniziali (500 Hz, ampiezza 0.2, no sfasamento)
pars0=[500,0.5,0]
plt.plot(time,fsin(time,*pars0),':r', label='funzione di fit con parametri iniziali')

# uso di curve_fit -> restituisce i parametri ottimizzati e la matrice di covarianza (che non useremo)
pars, pcov = curve_fit(fsin,time,v2,p0=pars0);

print('Parametri risultanti del fit: ')
print('p0: %s Hz' % pars[0])
print('p1: %s V' % pars[1])
print('p2: %s rad' % pars[2])

# plot della funzione con i parametri ottimizzati
plt.plot(time,fsin(time,*pars),'--g', label='funzione di fit con parametri ottimizzati (canale 2)')

plt.legend(fontsize=14)

plt.show()
Parametri risultanti del fit: 
p0: 499.9887713202381 Hz
p1: 0.2870261116321686 V
p2: 1.273145062479896 rad