Salta al contenuto
Note per Studenti Esercizio - Laboratorio 3, DFT e analisi spettrale

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 x(t)=cos⁡(2πf1t)+cos⁡(2πf2t)+cos⁡(2πf3t)x(t)=\cos(2\pi f_1t)+\cos(2\pi f_2t)+\cos(2\pi f_3t) con f1=4f_1=4, f2=5f_2=5, f3=6 kHzf_3=6\ \mathrm{kHz} è osservato per 5 ms5\ \mathrm{ms} con Fs=20 kHzF_s=20\ \mathrm{kHz}.

  • (a) Plottare x[n]x[n] per 0≤n≤L−10\le n\le L-1, L=100L=100.
  • (b) Calcolare la DFT a 256256 punti e plottarne il modulo per 0≤f/Fs≤10\le f/F_s\le1.
  • (c) Calcolare l'IDFT a 256256 punti e verificare il recupero del segnale (più gli zeri di padding).
  • (d) Finestrare con una finestra di Hamming di lunghezza LL e plottare.
  • (e) Ripetere (b) per il segnale finestrato; che cosa si osserva?
  • (f) Ripetere (b) ed (e) per L=50,25,10L=50,25,10: effetti della lunghezza.

Parte 2. x(t)=cos⁡(2πf1t)+10−3cos⁡(2πf2t)+cos⁡(2πf3t)x(t)=\cos(2\pi f_1t)+10^{-3}\cos(2\pi f_2t)+\cos(2\pi f_3t) con f1=1.5f_1=1.5, f2=2.5f_2=2.5, f3=3.5 kHzf_3=3.5\ \mathrm{kHz} e Fs=10 kHzF_s=10\ \mathrm{kHz}. Il tono centrale è 60 dB60\ \mathrm{dB} più debole degli altri. (g) Confrontare finestra rettangolare, di Hamming e di Kaiser per rivelarlo, con AdB=60+10=70 dBA_{dB}=60+10=70\ \mathrm{dB} (margine di 10 dB10\ \mathrm{dB}), larghezza di transizione Δf=0.2 kHz\Delta f=0.2\ \mathrm{kHz}, β\beta e lunghezza della finestra di Kaiser dalle formule β=0.1102(AdB−8.7) (AdB>50),L≥AdB−814.36 ΔfFs+1,\beta=0.1102(A_{dB}-8.7)\ (A_{dB}>50),\qquad L\ge\frac{A_{dB}-8}{14.36\,\Delta f}F_s+1, con la DTFT calcolata in 20002000 frequenze equispaziate in [0,5] kHz[0,5]\ \mathrm{kHz}, normalizzata a 0 dB0\ \mathrm{dB} 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

python
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 Fs=20 kHzF_s=20\ \mathrm{kHz}, 5 ms5\ \mathrm{ms} danno 100100 campioni; le pulsazioni sono 0.4π0.4\pi, 0.5π0.5\pi, 0.6π0.6\pi (somma di tre coseni con ampiezza massima 33 nell'origine).
  • (b) I bin sono distanti Fs/256=78.125 HzF_s/256=78.125\ \mathrm{Hz}; i toni cadono alle posizioni 51.251.2, 6464, 76.876.8 (frazionarie tranne la centrale). I tre toni hanno 2020, 2525 e 3030 periodi interi in 100100 campioni: una DFT a 100100 punti darebbe tre righe pure di altezza L/2=50L/2=50. Con N=256N=256 i bin non coincidono con i vertici né con gli zeri della finestra: il modulo mostra tre picchi di altezza 50.650.6, 50.050.0, 50.650.6 (vicini a L/2L/2, alterati dalla somma dei lobi dei toni vicini) e, attorno, i lobi laterali della finestra rettangolare, che a −13 dB-13\ \mathrm{dB} danno picchi spuri a 3.673.67 e 6.33 kHz6.33\ \mathrm{kHz} di altezza 12.112.1.
  • (c) L'IDFT restituisce xx nei primi 100100 campioni con errore 6⋅10−166\cdot10^{-16} e zeri (errore 6⋅10−166\cdot10^{-16}) nei successivi 156156: la DFT con zero-padding è invertibile.
  • (d)-(e) Con la finestra di Hamming i lobi laterali spariscono: restano tre picchi puliti a 3.983.98, 5.005.00, 6.02 kHz6.02\ \mathrm{kHz} (altezza ≈26.7\approx26.7, circa metà del caso rettangolare perché la finestra ha somma ≈0.54L\approx0.54L); il prezzo è un lobo principale più largo (circa il doppio).
  • (f) Effetto della lunghezza (picchi trovati con soglia 20%20\% del massimo):
LL rettangolare Hamming
100 3.67, 3.98, 5.00, 6.02, 6.333.67,\ 3.98,\ 5.00,\ 6.02,\ 6.33 3.98, 5.00, 6.023.98,\ 5.00,\ 6.02
50 3.44, 3.98, 4.45, 5.00, 5.55, 6.02, 6.563.44,\ 3.98,\ 4.45,\ 5.00,\ 5.55,\ 6.02,\ 6.56 3.98, 5.00, 6.023.98,\ 5.00,\ 6.02
25 3.05, 3.98, 5.00, 6.02, 6.953.05,\ 3.98,\ 5.00,\ 6.02,\ 6.95 3.83, 5.00, 6.173.83,\ 5.00,\ 6.17 (spostati, centro debole)
10 1.09, 4.77, 5.23, 8.911.09,\ 4.77,\ 5.23,\ 8.91 (spurio) 5.005.00 (un picco unico largo)

Più LL è corto, più i lobi principali si allargano (∝1/L\propto1/L, risoluzione Fs/L=200, 400, 800, 2000 HzF_s/L=200,\ 400,\ 800,\ 2000\ \mathrm{Hz} per la rettangolare): la distanza tra i toni è 1 kHz1\ \mathrm{kHz}, quindi la rettangolare li separa fino a L=25L=25 (Fs/L=800 Hz<1 kHzF_s/L=800\ \mathrm{Hz}<1\ \mathrm{kHz}) ma non per L=10L=10; l'Hamming (lobo largo il doppio) li separa bene fino a L=50L=50 e a L=25L=25 già li sposta e li fonde parzialmente. Con L=10L=10 restano solo picchi ampi (rettangolare: due picchi spuri a 4.774.77 e 5.23 kHz5.23\ \mathrm{kHz} per interferenza dei lobi; Hamming: uno solo a 5 kHz5\ \mathrm{kHz}). Con la rettangolare, inoltre, i picchi spuri dei lobi laterali compaiono già a L=100L=100.

Parte 2 (g). Con AdB=70A_{dB}=70 e Δf=0.2 kHz\Delta f=0.2\ \mathrm{kHz}: β=0.1102⋅61.3=6.755\beta=0.1102\cdot61.3=6.755 e L≥6214.36⋅0.2⋅10+1=216.9L\ge\frac{62}{14.36\cdot0.2}\cdot10+1=216.9, quindi L=217L=217. Livelli normalizzati nell'intorno di 2.5 kHz2.5\ \mathrm{kHz}:

finestra massimo attorno a 2.5 kHz2.5\ \mathrm{kHz} leakage nelle zone vicine (1.91.9-2.32.3 e 2.72.7-3.1 kHz3.1\ \mathrm{kHz}) tono debole visibile?
rettangolare −32.5 dB-32.5\ \mathrm{dB} −28.5 dB-28.5\ \mathrm{dB} no
Hamming −48.7 dB-48.7\ \mathrm{dB} −45.4 dB-45.4\ \mathrm{dB} no
Kaiser (β=6.755\beta=6.755) −60.9 dB-60.9\ \mathrm{dB} −67.4 dB-67.4\ \mathrm{dB} sì

Il tono debole sta a −60 dB-60\ \mathrm{dB}: emerge solo se i lobi laterali dei due toni forti stanno sotto quel livello. Rettangolare (−13 dB-13\ \mathrm{dB}) e Hamming (−42 dB-42\ \mathrm{dB}) lasciano leakage sopra −60 dB-60\ \mathrm{dB} attorno a 2.5 kHz2.5\ \mathrm{kHz} e lo coprono; la finestra di Kaiser, progettata per attenuare i lobi laterali di 70 dB70\ \mathrm{dB}, porta il leakage a −67.4 dB-67.4\ \mathrm{dB} e il picco del tono, a −60.9 dB-60.9\ \mathrm{dB}, è chiaramente visibile (valori calcolati con Python).

Versione ripasso

Parte 1 - DFT di tre coseni. f1=4f_1=4, f2=5f_2=5, f3=6f_3=6 kHz, Fs=20F_s=20 kHz, L=100L=100 campioni (55 ms). Con N=256N=256 la DFT ha bin distanti Fs/256=78,125F_s/256=78{,}125 Hz, e i toni cadono fra i bin.

  • Senza finestra: picchi a 50,650{,}6, 50,050{,}0, 50,650{,}6 e lobi laterali a 3,673{,}67 e 6,336{,}33 kHz di altezza 12,112{,}1.
  • Con l'IDFT a 256256 punti si recupera xx nei primi 100100 campioni, con zeri nei restanti 156156 (errore 6⋅10−166\cdot10^{-16}).
  • Con Hamming di lunghezza LL: spariscono i lobi laterali, restano tre picchi puliti a 3,983{,}98, 5,005{,}00, 6,026{,}02 kHz, con altezza circa metà e lobo principale circa doppio.

Effetto di LL. La risoluzione è Fs/LF_s/L: 200200, 400400, 800800, 20002000 Hz. La rettangolare separa i toni da 11 kHz fino a L=25L=25; l'Hamming fino a L=50L=50. Con L=10L=10 restano picchi spuri o un picco unico largo.

Parte 2 - tono debole a −60-60 dB. f1=1,5f_1=1{,}5, f2=2,5f_2=2{,}5, f3=3,5f_3=3{,}5 kHz, Fs=10F_s=10 kHz. Kaiser con AdB=70A_{dB}=70: β=0,1102⋅61,3=6,755\beta=0{,}1102\cdot61{,}3=6{,}755, L=217L=217.

  • Rettangolare: leakage a −28,5-28{,}5 dB attorno a 2,52{,}5 kHz, il tono debole non si vede.
  • Hamming: leakage a −45,4-45{,}4 dB, non si vede.
  • Kaiser: leakage a −67,4-67{,}4 dB, il picco del tono a −60,9-60{,}9 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 N=256N=256 i toni non cadono sui bin.
  • Confondere la risoluzione Fs/LF_s/L con la spaziatura dei bin Fs/NF_s/N: il padding non migliora la risoluzione.
  • Usare L/2L/2 come altezza attesa senza considerare la somma dei lobi e la finestra.
  • Calcolare β\beta con AdBA_{dB} senza il margine di 1010 dB richiesto.

Teoria collegata