Il contrabbasso Di Maria Gabriella Fois Il programma Il programma riceve in input il file nel quale è contenuto il segnale da elaborare in un intervallo di tempo immesso dall' utente. In particolare verrà richiamata una funzione le cui operazioni sono: La funzione Importare i dati dal file “contrabbasso.m4a”. Memorizzare il segnale in una variabile y. Visualizzare y nella finestra temporale selezionata dall' utente. Effettuare la trasformata di Fourier di y nel medesimo arco temporale. Rappresentare graficamente il segnale nel tempo e quello nelle frequenze. Salvare il grafico ottenuto al punto precedente. La trasformata di Fourier Jean Baptiste Joseph Fourier (Auxerre 1768-Parigi 1830) Théorie analytique de la chaleur (1822) La trasformata di Fourier In ambito scientifico, la trasformata di Fourier è uno degli strumenti più utilizzati. In particolare, essa permette di trasformare una funzione, un segnale nel nostro caso, x(t), definita nel dominio del tempo, ad un' altra funzione X(f) il cui argomento è la frequenza (Hz). L' operazione di trasformata di Fourier è invertibile, per questo è garantito il processo inverso che permette di ricavare la funzione del tempo x(t) da una funzione X(f). La trasformata di Fourier Nel caso di segnali periodici, la FT risulta particolarmente semplice. Essa prende il nome di Serie di Fourier e permette di scomporre tale segnale periodico nella somma di componenti di ampiezza, frequenza e fase opportuna. La trasformata di Fourier Quando il segnale non è periodico, le cose sono leggermente diverse, infatti qualsiasi segnale aperiodico può essere visto come un segnale periodico il cui periodo T→∞ e, di conseguenza, f0→0. La trasformata di Fourier Queste definizioni di FT e IFT sono valide qualora la funzione al secondo membro esista! Matlab presenta già predefinite le due funzioni di trasformata e antitrasformata di Fourier. Esse sono la FFT e la IFFT. FFT e IFFT Lavorando con dati numerici la FFT e la IFFT sono funzioni discrete. Esse calcolano la DFT(discrete Fourier Trasform) per ogni singolo valore di un vettore di N dati di input, in pratica si esegue: Dove: L' algoritmo Lo script: %progetto contrabbasso %Richiedo all' utente di inserire gli istanti t1 e t2 per avviare il %programma: t1=input('Inserisci l''istante temporale iniziale'); t2=input('Inserisci l''istante temporale finale'); %Estraggo dal file i dati numerici relativi al segnale contenuto nel file %"contrabbasso.m4a": importdata('contrabbasso.m4a'); [y,Fs]=audioread('contrabbasso.m4a'); %Richiamo la funzione: [ Y ] = funzione( y, Fs, t1, t2 ); %Riproduco il segnale mediante la funzione Sound: sound (y, Fs); Come si vede, lo script ha il compito di richiedere ed importare i dati di input, il cuore dell' algoritmo è implementato nella funzione che esso richiama. La funzione: function [Y] = funzione(y, Fs, t1, t2 ) %UNTITLED Summary of this function goes here % Detailed explanation goes here %Inserisco dei valori di default nel caso in cui l' utente non specifichi t1 e t2: if isempty (t1) t1=0.00000; end if isempty(t2) t2=1.00000; end %In particolare, qualora l' utente richiedesse di richiamare la funzione per %tutta la durata del file, a lui non nota, assegno alla stringa di input %'end' la durata totale del segnale pari a 74 secondi. if t2==char('end') t2=74.00000; end T=(length(y)-1)/Fs; %Creo l' asse dei tempi: t=0:1/Fs:T; %Ricavo il numero di campioni del segnale presenti all' interno dell' arco %temporale t2-t1: N=(t2-t1)*Fs; %Quindi definisco l' asse delle frequenze: df=Fs/N; f=0:df:(Fs-df); f1=1/t2; f2=1/t1; %Eseguo la FFT, ovvero la Fast Fourier Trasform. Questa funzione %predefinita di matlab prende come input il segnale nel tempo e il numero N di campioni che identifica la lunghezza della trasformata che otteniamo. Y=fft(y,N); %Divido il mio grafico in cinque sottografici, in questo modo: creo una %griglia 2x3 e muovendomi da sinistra a destra assegno le rispettive %posizioni (numerate) ai cinque sottografici: %Sottografico #1, rappresenta il segnale acustico nel dominio del tempo, campionato tra gli istanti t1 e t2. figure; subplot(2,3,1) plot(t,y, 'r'); axis([t1 t2 -2 2]); title ('Segnale nel tempo'); xlabel('t(s)'); ylabel('segnale acustico'); %Sottografico #2, rappresenta il modulo della fft del segnale acustico subplot(2,3,2) plot(f,abs(Y), 'g'); axis([f1 f2 -10 100]); title('Modulo'); xlabel('f(Hz)'); ylabel('modulo'); %Sottografico #5, infatti, come illustrato prima io mi muovo da sinistra a %destra e non da sopra a sotto e quindi questo grafico, che rappresenta la %fase della fft del segnale, si trova in posizione 5 nella griglia. subplot(2,3,5) plot(f,angle (Y), 'g'); axis([f1 f2 -20 20]); title('Fase'); xlabel('f(Hz)'); ylabel('fase'); %Sottografico #3, rappresenta la parte reale della fft, infatti la fft è %sempre un segnale complesso, dotato di parte reale e parte immaginaria, %che rappresento nel grafico #6 subplot(2,3,3) plot(f,real(Y), 'c'); axis([f1 f2 -100 100]); title('Parte reale'); xlabel('f(Hz)'); ylabel('[Re]'); subplot(2,3,6) plot(f,imag(Y), 'c'); axis([f1 f2 -100 100]); title('Parte immaginaria'); xlabel('f(Hz)'); ylabel('[Im]'); %Ho abbellito tutti i grafici con titoli, etichette agli assi e colori. %Mediante la funzione saveas salvo il grafico ottenuto nella cartella %MATLAB.mat nella quale sto lavorando, in particolare la funzione richiede %tre input che sono: l' identità del file dal salvare a cui io ho assegnato % gcf che sta per "get current figure". La seconda è il nome che le assegno % e la terza è il formato. saveas(gcf, 'contrabbasso','fig'); end Grafici ottenuti per ∆t=5s Grafici ottenuti per tutta la durata del segnale Commenti: Come si vede dai grafici, l' analisi di Fourier presenta alcune incongruenze grafiche. Perché l' analisi di Fourier mediante FFT sia accurata il segnale deve rispettare le condizioni di: Stazionarietà Linearità Periodicità o comunque essere composizione di funzioni sinusoidali. Raramente i segnali (sia provenienti da fenomeni naturali che da sorgenti artificiali) soddisfano queste condizioni, essendo spesso risultato di modulazioni di frequenza o ampiezza. Inoltre i sistemi di acquisizione dati possono introdurre non linearità nel rilevare un fenomeno che invece lo è, complicando ulteriormente cose. Talvolta, per ovviare a questi problemi, si fanno approssimazioni per poter applicare metodi di analisi che appunto richiedono queste caratteristiche. Per queste ragioni il campo d'applicazione dell'analisi di Fourier è limitato. E il suo utilizzo incondizionato per processi che non soddisfano le condizioni di linearità e stazionarietà può dare risultati fuorvianti. Ad esempio l'introduzione di molte componenti armoniche per rappresentare set dati non stazionari, quindi non uniformi globalmente. Il fenomeno dell' Aliasing Teorema del campionamento o di Shannon Un' altra fonte di anomalie e distorsioni è dovuta al fatto che il segnale analogico musicale è stato campionato con una certa frequenza Fs, estratta dalla funzione audioread. Il teorema di Shannon afferma che durante il campionamento di un segnale, perchè questo sia fatto correttamente, tale Fs deve essere almeno il doppio della massima frequenza del segnale. Se ciò non è verificato e quindi si ha un sottocampionamento nel tempo, in frequenza si ha l' aggiunta di componenti non proprie del segnale originario e quindi la sua ricostruzione risulta ad esso non fedele.
© Copyright 2024 Paperzz