1 Strumenti musicali
In questo tutorial faremo l'analisi delle frequenze di segnali provenienti da due sorgenti differenti: il primo rappresenta in numero di macchie solari monitorate mensilmente dal 1749 al 2011; il secondo è una nota musicale proveniente da due strumenti differenti, un piano e una tromba.
Partiamo con il primo segnale. Di seguito riporto le righe di codice utili a importare dei dati presenti su un file e salvarli in arrays python:
1 2 3 4 5 | data=loadtxt('sunspots.txt')
time=data[:,0]
nspots=data[:,1]
plot(time,nspots)
|
La funzione loadtxt('nomefile') legge i dati contenuti all'interno del file indicato come primo argomento e li salva un array mantenendo la stessa struttura che hanno nel file. In questo caso, il file contiene due colonne e 3143 colonne perciò l'array data avrà dimensioni 3143x2. Nelle righe successive estraiamo dall'array data la prima e la seconda colonna, il tempo e in numero di macchie solari, rispettivamente, e le salviamo in due array diversi, per comodità. Il grafico è mostrato qui:
Dal grafico si può notare una certa periodicità nell'andamento degli sunspots. Prendendo due picchi a caso, la loro distanza è di circa 130 mesi, quindi circa 11 anni. Proviamo a calcolare lo spettro delle frequenze facendo la trasformata del segnale con le righe di codice seguenti:
1 2 3 4 5 6 7 | tau=time[1]-time[0]
T=time[-1]
N=len(time)
freq=arange(N)/T
Transf = my_dft(nspots,tau)
plot(freq,abs(Transf)**2,'-d')
|
Dopo aver definito alcune costanti a partire dal segnale campionato, creiamo l'array delle frequenze e poi facciamo la trasformata, supponendo di aver definito la funzione my_dft precedentemente. Di seguito è riportato il grafico del potere spettrale:
Come si nota effettuando uno zoom troviamo un picco dominante a frequenze di cira . Per ridurre il leakage si è provato a usare la finestra di Hanning, in questo modo:
1 2 3 4 5 | r=2*pi*time/T
han=0.5-0.5*cos(r)
Transf_w=my_dft(nspots*han)
plot(freq,abs(Hw)**2,'-d')
|
Il picco ora è più facilemente identificabile e risulta in corrispondenza della frequenza . Il periodo corrispondente a tale frequenza è dunque .
Abbiamo dunque trovato in maniera più precisa ed elaborata il periodo di variazione delle macchie solari, noto per essere di cira 11 anni apppunto, utilizzando la trasformata di fourier di un segnale proveniente da una sorgente naturale, in questo caso il sole.
Passiamo ora al caso di segnale proveniente da due strumenti musicali. Cominciamo importando i dati e visualizzandoli:
1 2 3 4 5 6 7 8 9 10 | samples_piano=loadtxt('piano.txt')
samples_trumpet=loadtxt('trumpet.txt')
N=len(samples_piano)
tau=1./44100
T=N*tau
time=linspace(0,T,N)
plot(time,samples_piano)
plot(time,samples_trumpet)
|
In questo caso i files contenenti il suono proveniente dai due strumenti hanno una sola colonna, ma sapendo che la frequenza di campionamento è quella standard di 44100 Hz, possiamo ricavare l'array tempo e fare il grafico di entrambi i suoni registrati:
Le forme sono notevolemente differenti anche nello spazio dei tempi: il suono del piano tende a decrescere rapidamente, mentre quello della tromba sale rapidamente ad una certa soglia che poi mantiene per tutto il periodo di campionamento.
Vediamo come appaiono questi due segnali nello spazio delle frequenze, usando le seguenti righe di codice:
1 2 3 4 5 6 7 | Transf_piano=my_dft(samples_piano,tau)
Transf_trumpet=my_dft(samples_trumpet,tau)
freq=arange(N)/T
plot(freq,abs(Transf_piano)**2)
xlim(0,10000/T) # imposto il range da visualizzare lungo x
ylim(0,3E+16) # e lungo y
|
Come osserviamo dalle figure seguenti, la frequenza dominante per per il segnale prodoto dal piano si trova a circa e rappresenta un Do5, cioé il Do successivo al La4 () presa convenzionalmente come nota di riferimento. Ingrandendo, compaiono frequenze corrispondenti a note superiori in frequenza, ma con peso ordini di grandezza via via inferiore. Nello spettro delle frequenze del segnale della tromba, notiamo che la prima frequenza è la stessa trovata nel piano, ma ci sono altre due frequenze successive che pesano di più e corrispondono al Do7 () e al Sol7 () , e un altra che ha lo stesso peso e che corrisponde al Do8 ().