Algoritmi e Calcolo Parallelo 2012/2013 - Tecniche di Analisi
GNU Octave: esempi di Digital Signal Processing
1. GNU Octave: esempi di Digital Signal Processing
Ing. Andrea Spadaccini
a.spadaccini@diit.unict.it
Dipartimento di Ingegneria Informatica e delle Telecomunicazioni
Universit` di Catania
a
20 Maggio 2009
2. Sommario
Elaborazioni nel dominio del tempo
Esempio di analisi in frequenza
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
3. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
Parte I
Elaborazioni nel dominio del tempo
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
4. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
La funzione buffer
Suddivisione in trame
Spesso, per elaborare un segnale pu` essere utile suddividerlo in trame,
o
eventualmente sovrapponendo parte del segnale.
In GNU Octave, questo si ottiene con la funzione buffer, presente nel
package Signal Processing.
Sintassi di buffer
buffer(signal, frame-size, overlap)
signal il segnale da suddividere in trame
frame-size dimensione della trama
overlap numero di campioni della trama precedente da riportare (o
da saltare, se negativo)
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
5. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
buffer: Esempio
>> s = 1:20;
>> b = buffer(s, 4)
b =
1 5 9 13 17
2 6 10 14 18
3 7 11 15 19
4 8 12 16 20
>> b = buffer(s, 4, 1)
b =
0 3 6 9 12 15 18
1 4 7 10 13 16 19
2 5 8 11 14 17 20
3 6 9 12 15 18 0
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
6. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
buffer: Esempio con overlap negativo
>> s = 1:20;
>> b = buffer(s, 4, -1)
b =
1 6 11 16
2 7 12 17
3 8 13 18
4 9 14 19
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
7. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
Funzioni finestra
Scopo
Per evitare problemi come la perdita spettrale (spectral leakage) a volte
si ricorre all’applicazioni di finestre differenti dalla semplice finestra
rettangolare.
Esempi di finestra
Entrambe le funzioni richiedono come parametro solo il numero di punti.
Hamming
Hann (o Hanning)
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
8. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
Plot delle due finestre
>> figure;
>> subplot(311);
>> plot(hamming(100));
>> subplot(312);
>> plot(hanning(100));
>> subplot(313);
>> plot(hamming(100) - hanning(100));
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
9. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
Ricampionamento (resampling)
Scopo
L’idea alla base del ricampionamento (resampling) ` quella di variare la
e
frequenza di campionamento di un segnale, generalmente
sottocampionandolo per elaborazioni successive.
La funzione resample
Sintassi: y = resample(x, p, q)
x ` il segnale da ricampionare
e
p e q costituiscono il numero p/q, ovvero il fattore da utilizzare per
variare la frequenza di campionamento.
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
10. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
Esempio di ricampionamento
>> Fs = 100;
>> Fo = 4;
>> Ts = 1 / Fs;
>> t = 0 : Ts : 1 - Ts;
>> y = sin(2 * pi * Fo * t);
>> plot(t, y)
>> rs_y = resample(y, 1, 2);
>> new_t = 0 : 2 * Ts : 1 - Ts
>> figure
>> subplot(211)
>> plot(t, y)
>> subplot(212)
>> plot(new_t, rs_y);
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
11. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
Cross-correlazione (I)
Un pizzico di teoria
Autocorrelazione di due segnali discreti x ed y al variare dell’intervallo
(lag) k:
N−k
1
xi yi−k k ≥ 0
Rxy (k) = N −k (1)
i=1
Ryx (−k) k ≤0
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
12. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
Cross-correlazione (II)
La funzione xcorr
La funzione xcorr consente di computare la cross-correlazione di due
segnali. Sintassi:
[R, lag] = xcorr(X[, Y] [, maxlag] [, scale]).
X ` il primo segnale
e
Y, se presente, ` il secondo segnale
e
maxlag, se presente, imposta l’intervallo di variazione di lag a
[−maxlag:maxlag] (altrimenti maxlag = max(length(X),
length(Y)) - 1)
scale, se presente, definisce la tipologia di normalizzazione della
somma. Utilizzare ’coeff’ per normalizzare con Rxy (0) (ovvero il
massimo).
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
13. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
Esempio: periodo di un segnale periodico (I)
Autocorrelazione e segnali periodici
Nel caso di segnali reali periodici (infiniti!), il lag del primo massimo
positivo dell’autocorrelazione corrisponde al periodo del segnale.
Implementeremo qualcosa di simile, anche se non possiamo generare
segnali periodici.
>> T = 10; % periodo desiderato: 10 secondi
>> Fs = 1000;
>> Ts = 1 / Fs;
>> t = 1 : Ts : 100 - Ts;
>> y = sin(2 * pi * (1/T) * t);
>> [R, lag] = xcorr(y);
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
14. Suddivisione in trame Funzioni finestra Ricampionamento Cross-correlazione
Esempio: periodo di un segnale periodico (II)
>> mid = ceil(length(R) / 2);
>> [min_val, min_idx] = min(R(mid:end));
>> [max_val, max_idx] = max(R(mid + min_idx:end));
>> idx = mid + min_idx + max_idx;
>> lag(idx) * Ts
ans = 9.9910
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
15. FFT di una cosinusoide
Parte II
Esempio di analisi in frequenza
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
16. FFT di una cosinusoide
Trasformata di Fourier di un coseno
Un pizzico di teoria (di nuovo?)
Trasformata di Fourier di un coseno:
1 1
F [cos(2πf0 t)] = δ(f + f0 ) + δ(f − f0 )
2 2
FT, DFT, FFT
La normale Trasformata di Fourier (FT) si applica a segnali continui.
La DFT (Discrete Fourier Transform) ` la FT per segnali discreti.
e
La FFT (Fast Fourier Transform) ` un’implementazione (veloce!) di
e
DFT. Variante pi` utilizzata: FFTW (Fastest Fourier Transform in
u
the West).
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
17. FFT di una cosinusoide
Primi passi
La funzione fft
Prende in input un vettore (o una matrice), e restituisce un vettore
contenente il risultato dell’esecuzione dell’algoritmo FFT.
>> Fs = 100;
>> Ts = 1 / Fs;
>> F0 = 4;
>> t = 0 : Ts : 1 - Ts;
>> y = sin(2*pi*F0*t);
>> plot(t, y);
>> Fy = fft(f);
>> plot(abs(Fy)); % difficile da comprendere
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
18. FFT di una cosinusoide
Il giusto ordine
La funzione fftswitch
Manipola il risultato di fft in modo da avvicinare le frequenze basse al
centro del vettore (in sostanza effettua il flipping delle due met` del
a
risultato di fft)
>> Fy = abs(fftswitch(Fy));
>> plot(Fy)
>> stem(Fy) % tipo di grafico pi` indicativo
u
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
19. FFT di una cosinusoide
Le giuste proporzioni
L’asse delle frequenze
Ciascun elemento del vettore FFT non rappresenta una frequenza, ma un
insieme (bin) di frequenze. Dobbiamo generare un asse delle frequenze in
funzione della frequenza di campionamento.
>> n = length(Fy);
>> f = -n/2 : n/2 - 1;
>> f = f * (Fs / n);
>> Fy = Fy / n; % normalizzazione valori FFT
>> stem(f, Fy) % tipo di grafico pi` indicativo
u
>> xlabel(’Frequency bins (Hz)’)
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
20. Riferimenti
Sito ufficiale di GNU Octave
http://www.octave.org
Documentazione
John W. Eaton et al. GNU Octave Manual -
http://www.gnu.org/software/octave/doc/interpreter/
http://en.wikipedia.org/wiki/Window function
http://blinkdagger.com/matlab/matlab-introductory-fft-tutorial
http://fftw.org
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing
21. Licenza
Licenza Creative Commons
Questo lavoro ` rilasciato sotto licenza Creative Commons
e
Attribution-Share Alike 2.5 Italy
(http://creativecommons.org/licenses/by-sa/2.5/it/)
Significato della licenza
La presentazione ` liberamente scaricabile e redistribuibile per
e
qualsiasi fine
`
E necessario citare l’autore
`
E necessario redistribuire secondo gli stessi termini eventuali lavori
derivati da questa presentazione
Ing. Andrea Spadaccini DIIT - Universit` degli Studi di Catania
a
GNU Octave: esempi di Digital Signal Processing