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.