Esercizio - Laboratorio 3, DFT e analisi spettrale
Testo (laboratorio 3 del corso Multimedia Signal Processing, UniPD; lezione 19). Il laboratorio studia i compromessi tra risoluzione in frequenza e leakage.
Parte 1. Il segnale con , , è osservato per con .
- (a) Plottare per , .
- (b) Calcolare la DFT a punti e plottarne il modulo per .
- (c) Calcolare l'IDFT a punti e verificare il recupero del segnale (più gli zeri di padding).
- (d) Finestrare con una finestra di Hamming di lunghezza e plottare.
- (e) Ripetere (b) per il segnale finestrato; che cosa si osserva?
- (f) Ripetere (b) ed (e) per : effetti della lunghezza.
Parte 2. con , , e . Il tono centrale è più debole degli altri. (g) Confrontare finestra rettangolare, di Hamming e di Kaiser per rivelarlo, con (margine di ), larghezza di transizione , e lunghezza della finestra di Kaiser dalle formule con la DTFT calcolata in frequenze equispaziate in , normalizzata a nel massimo.
Teoria usata: Analisi spettrale con la DFT - finestre e leakageAnalizzare lo spettro di un segnale con la DFT vuol dire osservarne solo L campioni (finestra rettangolare) e campionare in frequenza la DTFT. Una sinusoide non dà una riga ma il nucleo di Dirichlet della finestra centrato in w0: lobo principale largo 4pi/L e lobi laterali (il primo a -13.3 dB). Due toni più vicini della mezza larghezza del lobo non si separano (risoluzione, che dipende solo da L), e i lobi laterali di un tono mascherano i toni deboli (leakage). La DFT campiona la DTFT a 2pi k/N: l'ampiezza è corretta solo se il tono cade su un bin (periodi interi nella finestra), altrimenti si perde fino a 3.9 dB; lo zero-padding infittisce i campioni ma non migliora la risoluzione. Le finestre rastremate (Hann, Hamming, Blackman) abbassano i lobi laterali (-31, -42, -58 dB) a prezzo di un lobo principale più largo.Analisi spettrale con la DFT - finestre e leakage →, Trasformata di Fourier discreta (DFT) e convoluzione circolareLa DFT di N campioni x[0..N-1] è X[k] = sum x[n] e^{-j2pi kn/N}, k = 0..N-1 (IDFT: x[n] = (1/N) sum X[k] e^{j2pi kn/N}); vede il segnale come periodico di periodo N e dà N campioni equispaziati della DTFT, cioè X(z) valutata sulle radici N-esime dell'unità. Se x ha durata M <= N non c'è aliasing temporale e lo zero-padding (N > M) infittisce solo i campioni della stessa DTFT. Proprietà: traslazione circolare, simmetria coniugata X[k] = X*[N-k], prodotto = convoluzione circolare. La convoluzione circolare coincide con la lineare solo se N >= Dx + M - 1; altrimenti la coda si ripiega sull'inizio. La FFT calcola la DFT con (N/2) log2 N moltiplicazioni invece di N^2.Trasformata di Fourier discreta (DFT) e convoluzione circolare →, Trasformata di Fourier a tempo discretoLa trasformata di Fourier di un segnale discreto è $S(f)=\sum_nT,s(nT),e^{-i2\pi fnT}$: una funzione continua e periodica in $f$ di periodo $F_p=1/T$. L'antitrasformata è l'integrale su un periodo, $s(nT)=\int_0^{F_p}S(f)e^{i2\pi fnT}df$. Le regole sono quelle del caso continuo (traslazione, convoluzione $\leftrightarrow$ prodotto, Parseval $\sum T|s|^2=\int_0^{F_p}|S|^2$), con incremento e somma corrente al posto di derivata e integrale. Per segnali reali $S(f)=S^*(-f)$, quindi basta $[0,F_p/2]$. Esempi: $\delta\to1$, $1\to\delta_{F_p}$, rect $\to$ sinc periodico, $a^n\mathbf 1_0\to\frac T{1-ae^{-i2\pi fT}}$.Trasformata di Fourier a tempo discreto →.
Il codice
import numpy as np
from scipy.signal import find_peaks
# ---- parti a-f
fs = 20e3
f1, f2, f3 = 4e3, 5e3, 6e3
def segnale(L):
t = np.arange(L) / fs
return np.cos(2*np.pi*f1*t) + np.cos(2*np.pi*f2*t) + np.cos(2*np.pi*f3*t)
L = 100
x = segnale(L) # a) 100 campioni = 5 ms
X = np.fft.fft(x, 256) # b) DFT a 256 punti (zero-padding automatico)
f_norm = np.arange(256) / 256 # asse f/fs; plt.plot(f_norm, np.abs(X))
xr = np.fft.ifft(X) # c) x seguito da 156 zeri
xw = x * np.hamming(L) # d) finestra di Hamming
Xw = np.fft.fft(xw, 256) # e)
def picchi(L, finestra): # f) quante righe si distinguono
x = segnale(L) * finestra(L)
M = np.abs(np.fft.fft(x, 256))[:129]
p, _ = find_peaks(M, height=0.2 * M.max())
return np.round(np.arange(129)[p] * fs / 256 / 1e3, 2)
# ---- parte g
fs = 10e3
f1, f2, f3 = 1.5e3, 2.5e3, 3.5e3
A_dB, df = 70, 0.2e3
beta = 0.1102 * (A_dB - 8.7)
L = int(np.ceil((A_dB - 8) * fs / (14.36 * df) + 1))
n = np.arange(L)
x = np.cos(2*np.pi*f1/fs*n) + 1e-3*np.cos(2*np.pi*f2/fs*n) + np.cos(2*np.pi*f3/fs*n)
f = np.linspace(0, 5e3, 2000)
E = np.exp(-2j*np.pi*np.outer(f/fs, n)) # DTFT in 2000 frequenze
for nome, w in (("rettangolare", np.ones(L)), ("Hamming", np.hamming(L)), ("Kaiser", np.kaiser(L, beta))):
Xd = np.abs(E @ (x * w))
dB = 20*np.log10(Xd / Xd.max()) # plt.plot(f, dB)Risultati (eseguendo il codice) e commenti
Parte 1.
- (a) Con , danno campioni; le pulsazioni sono , , (somma di tre coseni con ampiezza massima nell'origine).
- (b) I bin sono distanti ; i toni cadono alle posizioni , , (frazionarie tranne la centrale). I tre toni hanno , e periodi interi in campioni: una DFT a punti darebbe tre righe pure di altezza . Con i bin non coincidono con i vertici né con gli zeri della finestra: il modulo mostra tre picchi di altezza , , (vicini a , alterati dalla somma dei lobi dei toni vicini) e, attorno, i lobi laterali della finestra rettangolare, che a danno picchi spuri a e di altezza .
- (c) L'IDFT restituisce nei primi campioni con errore e zeri (errore ) nei successivi : la DFT con zero-padding è invertibile.
- (d)-(e) Con la finestra di Hamming i lobi laterali spariscono: restano tre picchi puliti a , , (altezza , circa metà del caso rettangolare perché la finestra ha somma ); il prezzo è un lobo principale più largo (circa il doppio).
- (f) Effetto della lunghezza (picchi trovati con soglia del massimo):
| rettangolare | Hamming | |
|---|---|---|
| 100 | ||
| 50 | ||
| 25 | (spostati, centro debole) | |
| 10 | (spurio) | (un picco unico largo) |
Più è corto, più i lobi principali si allargano (, risoluzione per la rettangolare): la distanza tra i toni è , quindi la rettangolare li separa fino a () ma non per ; l'Hamming (lobo largo il doppio) li separa bene fino a e a già li sposta e li fonde parzialmente. Con restano solo picchi ampi (rettangolare: due picchi spuri a e per interferenza dei lobi; Hamming: uno solo a ). Con la rettangolare, inoltre, i picchi spuri dei lobi laterali compaiono già a .
Parte 2 (g). Con e : e , quindi . Livelli normalizzati nell'intorno di :
| finestra | massimo attorno a | leakage nelle zone vicine (- e -) | tono debole visibile? |
|---|---|---|---|
| rettangolare | no | ||
| Hamming | no | ||
| Kaiser () | sì |
Il tono debole sta a : emerge solo se i lobi laterali dei due toni forti stanno sotto quel livello. Rettangolare () e Hamming () lasciano leakage sopra attorno a e lo coprono; la finestra di Kaiser, progettata per attenuare i lobi laterali di , porta il leakage a e il picco del tono, a , è chiaramente visibile (valori calcolati con Python).
Versione ripasso
Parte 1 - DFT di tre coseni. , , kHz, kHz, campioni ( ms). Con la DFT ha bin distanti Hz, e i toni cadono fra i bin.
- Senza finestra: picchi a , , e lobi laterali a e kHz di altezza .
- Con l'IDFT a punti si recupera nei primi campioni, con zeri nei restanti (errore ).
- Con Hamming di lunghezza : spariscono i lobi laterali, restano tre picchi puliti a , , kHz, con altezza circa metà e lobo principale circa doppio.
Effetto di . La risoluzione è : , , , Hz. La rettangolare separa i toni da kHz fino a ; l'Hamming fino a . Con restano picchi spuri o un picco unico largo.
Parte 2 - tono debole a dB. , , kHz, kHz. Kaiser con : , .
- Rettangolare: leakage a dB attorno a kHz, il tono debole non si vede.
- Hamming: leakage a dB, non si vede.
- Kaiser: leakage a dB, il picco del tono a dB è visibile.
Teoria: Analisi spettrale con la DFT - finestre e leakageAnalizzare lo spettro di un segnale con la DFT vuol dire osservarne solo L campioni (finestra rettangolare) e campionare in frequenza la DTFT. Una sinusoide non dà una riga ma il nucleo di Dirichlet della finestra centrato in w0: lobo principale largo 4pi/L e lobi laterali (il primo a -13.3 dB). Due toni più vicini della mezza larghezza del lobo non si separano (risoluzione, che dipende solo da L), e i lobi laterali di un tono mascherano i toni deboli (leakage). La DFT campiona la DTFT a 2pi k/N: l'ampiezza è corretta solo se il tono cade su un bin (periodi interi nella finestra), altrimenti si perde fino a 3.9 dB; lo zero-padding infittisce i campioni ma non migliora la risoluzione. Le finestre rastremate (Hann, Hamming, Blackman) abbassano i lobi laterali (-31, -42, -58 dB) a prezzo di un lobo principale più largo.Analisi spettrale con la DFT - finestre e leakage →, Trasformata di Fourier discreta (DFT) e convoluzione circolareLa DFT di N campioni x[0..N-1] è X[k] = sum x[n] e^{-j2pi kn/N}, k = 0..N-1 (IDFT: x[n] = (1/N) sum X[k] e^{j2pi kn/N}); vede il segnale come periodico di periodo N e dà N campioni equispaziati della DTFT, cioè X(z) valutata sulle radici N-esime dell'unità. Se x ha durata M <= N non c'è aliasing temporale e lo zero-padding (N > M) infittisce solo i campioni della stessa DTFT. Proprietà: traslazione circolare, simmetria coniugata X[k] = X*[N-k], prodotto = convoluzione circolare. La convoluzione circolare coincide con la lineare solo se N >= Dx + M - 1; altrimenti la coda si ripiega sull'inizio. La FFT calcola la DFT con (N/2) log2 N moltiplicazioni invece di N^2.Trasformata di Fourier discreta (DFT) e convoluzione circolare →, Trasformata di Fourier a tempo discretoLa trasformata di Fourier di un segnale discreto è $S(f)=\sum_nT,s(nT),e^{-i2\pi fnT}$: una funzione continua e periodica in $f$ di periodo $F_p=1/T$. L'antitrasformata è l'integrale su un periodo, $s(nT)=\int_0^{F_p}S(f)e^{i2\pi fnT}df$. Le regole sono quelle del caso continuo (traslazione, convoluzione $\leftrightarrow$ prodotto, Parseval $\sum T|s|^2=\int_0^{F_p}|S|^2$), con incremento e somma corrente al posto di derivata e integrale. Per segnali reali $S(f)=S^*(-f)$, quindi basta $[0,F_p/2]$. Esempi: $\delta\to1$, $1\to\delta_{F_p}$, rect $\to$ sinc periodico, $a^n\mathbf 1_0\to\frac T{1-ae^{-i2\pi fT}}$.Trasformata di Fourier a tempo discreto →.
Errori tipici:
- Leggere i picchi come coseni puri: con i toni non cadono sui bin.
- Confondere la risoluzione con la spaziatura dei bin : il padding non migliora la risoluzione.
- Usare come altezza attesa senza considerare la somma dei lobi e la finestra.
- Calcolare con senza il margine di dB richiesto.