Salta al contenuto
Note per Studenti Trasformata di Fourier a tempo breve e spettrogramma

Trasformata di Fourier a tempo breve e spettrogramma

In questa pagina 5

La DFT (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 →) dà lo spettro globale di un segnale finito: dice quali frequenze ci sono ma non quando. Un segnale audio, una voce, un fischio che si sposta, hanno un contenuto in frequenza che cambia nel tempo. Calcolare una DFT enorme su tutto il segnale richiederebbe di aspettare tutti i campioni e di fare un calcolo gigantesco, inaccettabile per l'elaborazione in tempo reale. La soluzione è vedere il segnale lungo come la concatenazione di tanti segnali brevi e calcolare molte DFT brevi: la trasformata di Fourier a tempo breve (short-time Fourier transform, STFT, o short-time DFT, STDFT; nelle slide anche time-dependent DFT), la cui rappresentazione grafica è lo spettrogramma (spectrogram).

Definizione

Definizione (STFT, "DFT dipendente dal tempo"). Sia x[n]x[n] una sequenza lunga e w[n]w[n] una finestra di analisi (analysis window, per esempio di Hann) diversa da zero solo per n=0,…,L−1n=0,\dots,L-1, con LL molto minore della lunghezza di xx. Per ogni istante di analisi ℓ\ell si definisce X[k,ℓ]=∑n=0L−1w[n] x[ℓ+n] e−j2πkn/N,k=0,1,…,N−1,N≥L.X[k,\ell]=\sum_{n=0}^{L-1}w[n]\,x[\ell+n]\,e^{-j2\pi kn/N},\qquad k=0,1,\dots,N-1,\quad N\ge L.

Contiene due passi:

  1. Finestratura: w[n]x[ℓ+n]w[n]x[\ell+n] preleva dal segnale il tratto lungo LL che comincia in ℓ\ell (frame, segmento) e lo pesa. Cambiando ℓ\ell si sposta la finestra sul segnale.
  2. DFT breve: la DFT a NN punti di quel frame (N>LN>L con zero-padding se si vuole una griglia di frequenze più fitta, 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 →) dà lo spettro locale.

Il parametro kk è la frequenza: ω^k=2πk/N\hat\omega_k=2\pi k/N, cioè fk=kFs/Nf_k=kF_s/N. Il parametro ℓ\ell è il tempo. L'istante ℓ\ell si muove a salti di RR campioni (hop size), ℓ=mR\ell=mR con m=0,1,2,…m=0,1,2,\dots, con 1≤R<L1\le R<L. Se R<LR<L i frame si sovrappongono e ogni campione cade in almeno una finestra; la scelta comune è R=L/2R=L/2 (sovrapposizione del 50%50\%). Il numero di frame per un segnale di lunghezza DD è ⌊(D−L)/R⌋+1\lfloor(D-L)/R\rfloor+1.

Esempio. Un segnale di D=10 000D=10\,000 campioni, finestra L=301L=301, passo R=30R=30 (≈0.1L\approx0.1L) e N=1024N=1024: ⌊(10000−301)/30⌋+1=324\lfloor(10000-301)/30\rfloor+1=324 frame; per un segnale reale bastano i bin k=0,…,512k=0,\dots,512 (N/2+1=513N/2+1=513 valori) per la simmetria coniugata. Con L=75L=75 e R=8R=8: 12411241 frame. Il numero di valori calcolati è 324×513324\times513, circa 1.7⋅1051.7\cdot10^5: ogni frame costa una FFT a N=1024N=1024 punti (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 →).

Lo spettrogramma

X[k,ℓ]X[k,\ell] è una funzione di due variabili: per ogni istante c'è un diverso spettro locale. Il modo di rappresentarla è lo spettrogramma: un'immagine in cui l'asse orizzontale è il tempo (ℓ=mR\ell=mR), l'asse verticale è la frequenza (ω^k\hat\omega_k in rad/campione, ω^/π∈[0,1]\hat\omega/\pi\in[0,1], oppure Hz) e il livello di grigio (o di colore) è proporzionale a ∣X[k,ℓ]∣\lvert X[k,\ell]\rvert oppure a 20log⁡10∣X[k,ℓ]∣20\log_{10}\lvert X[k,\ell]\rvert (scala in dB, che mostra anche le componenti deboli) o a ∣X∣2\lvert X\rvert^2 (densità di potenza). Un'orizzontale chiara indica un tono stabile; una linea inclinata una frequenza che cresce o decresce; un trattino verticale un impulso (che ha spettro piatto).

Esempio (come nel laboratorio 2). scipy.signal.spectrogram con finestra di Hamming di 256256 campioni, nfft=256 e noverlap=128: R=128R=128, risoluzione in frequenza Fs/256F_s/256 e per un segnale di 10 00010\,000 campioni si hanno ⌊(10000−256)/128⌋+1=77\lfloor(10000-256)/128\rfloor+1=77 frame e 129129 bin; l'asse delle frequenze si normalizza dividendo per Fs/2F_s/2 per leggere ω^/π\hat\omega/\pi. I toni si vedono come righe orizzontali, da cui si ricavano le ω^0\hat\omega_0 per i filtri notch (Filtri notch e applicazioni dei filtri FIRUno zero di H(z) sulla circonferenza unitaria in z0 = e^{j w0} annulla (a regime) le sinusoidi alla pulsazione w0. Per eliminare un coseno servono i due zeri coniugati: H(z) = (1 - e^{jw0} z^-1)(1 - e^{-jw0} z^-1) = 1 - 2 cos(w0) z^-1 + z^-2, cioè h = {1, -2cos w0, 1}, un FIR simmetrico di tipo I (ritardo 1). Si normalizza dividendo per 2 - 2cos(w0) per avere guadagno 1 in continua; più toni si eliminano mettendo in cascata (convoluzione) un filtro per ogni tono. Segue una panoramica delle applicazioni dei FIR (equalizzazione audio), vantaggi (fase lineare, stabilità) e costo (N moltiplicazioni per campione, molte più di un IIR).Filtri notch e applicazioni dei filtri FIR →).

Il compromesso tra tempo e frequenza

La scelta più importante è la lunghezza LL della finestra, perché agisce in due modi opposti.

Risoluzione in frequenza (frequency resolution). Ogni riga spettrale compare nello spettrogramma come il lobo principale della trasformata della finestra, la cui larghezza è inversamente proporzionale a LL: Δω^≃c 2πL\Delta\hat\omega\simeq c\,\dfrac{2\pi}{L}, con cc costante che dipende dalla finestra (lobo principale 4π/L4\pi/L rettangolare, 8π/L8\pi/L per Hann e Hamming, 12π/L12\pi/L Blackman). Due frequenze che distano meno di circa la mezza larghezza del lobo si fondono. Per separare righe vicine serve una finestra lunga: serve tempo per vedere che le due sinusoidi hanno periodi diversi. Una finestra più corta di un periodo del segnale non dà alcuna informazione sulla periodicità.

Risoluzione nel tempo (time resolution). Il frame [ℓ,ℓ+L−1][\ell,\ell+L-1] vede un tratto lungo LL: un cambiamento improvviso del segnale (per esempio una frequenza che parte di colpo) comparirà sfocato su un intervallo di durata confrontabile con LL. Per localizzare con precisione i cambiamenti serve una finestra corta.

Compromesso (time-frequency trade-off). La finestra deve essere corta per seguire i cambiamenti nel tempo e lunga per risolvere frequenze vicine: i due requisiti sono opposti e non si possono soddisfare insieme. Per un segnale sconosciuto si calcolano spettrogrammi con lunghezze diverse: ciò che è evidente in uno può essere nascosto in un altro.

Esempio: due toni vicini e una transizione

Il segnale di prova delle slide (lunghezza 10 00010\,000) è x[n]={cos⁡(0.2πn)+1.5cos⁡(0.227πn)0≤n<5000cos⁡(0.2πn)5000≤n<7000cos⁡(0.6πn)+cos⁡(0.7πn)7000≤n<10000.x[n]=\begin{cases}\cos(0.2\pi n)+1.5\cos(0.227\pi n)&0\le n<5000\\ \cos(0.2\pi n)&5000\le n<7000\\ \cos(0.6\pi n)+\cos(0.7\pi n)&7000\le n<10000.\end{cases} Si calcola la STFT con finestra di Hann, N=1024N=1024, in tre istanti (finestra centrata nell'istante indicato; valori calcolati con Python).

istante nn contenuto vero L=301L=301 L=75L=75
20002000 toni a 0.2π0.2\pi e 0.227π0.227\pi due picchi: 0.200π0.200\pi (74.474.4) e 0.227π0.227\pi (112.2112.2) un solo picco a 0.217π0.217\pi (39.339.3)
60006000 un tono a 0.2π0.2\pi un picco a 0.199π0.199\pi un picco a 0.199π0.199\pi (largo)
80008000 toni a 0.6π0.6\pi e 0.7π0.7\pi due picchi 0.600π0.600\pi, 0.699π0.699\pi due picchi 0.600π0.600\pi, 0.699π0.699\pi (larghi)

I toni a 0.2π0.2\pi e 0.227π0.227\pi distano 0.027π0.027\pi. Con L=301L=301 la mezza larghezza del lobo di Hann è 4π/301=0.0133π4\pi/301=0.0133\pi, quindi li risolve; con L=75L=75 vale 4π/75=0.053π4\pi/75=0.053\pi, quindi li fonde. Quelli a 0.6π0.6\pi e 0.7π0.7\pi distano 0.1π0.1\pi e si separano anche con L=75L=75.

Il costo nel tempo. Nell'istante n=7000n=7000 il tono a 0.6π0.6\pi compare di colpo. Misurando l'ampiezza della riga a 0.6π0.6\pi nei frame, la salita dal 10%10\% al 90%90\% del massimo avviene in ≈145\approx145 campioni per L=301L=301 e in ≈38\approx38 per L=75L=75: la finestra lunga sfoca la transizione di circa L/2L/2 campioni, quella corta la localizza bene. Un modello: per una finestra di Hann centrata in tt, con u=(t−7000)/Lu=(t-7000)/L limitato in [−12,12][-\tfrac12,\tfrac12], la riga ha ampiezza relativa 12+u+sin⁡2πu2π\tfrac12+u+\tfrac{\sin2\pi u}{2\pi} (è l'area della finestra che cade dopo l'istante 70007000); in t=7000t=7000 vale 0.50.5 (con Python 0.510.51).

Grafico interattivo: Ampiezza relativa della riga a 0,6π nei frame centrati in t, finestra di Hann: la transizione che avviene in n = 7000 è sfocata su circa 0,5 L campioni (L = 301 contro L = 75)

Questa relazione è un esempio del principio generale: finestra lunga ⇒\Rightarrow risoluzione in frequenza ∝1/L\propto1/L e sfocatura temporale ∝L\propto L; il prodotto delle due incertezze resta costante.

Grafico interattivo: Mezza larghezza del lobo principale della finestra di Hann, 4π/L (in unità di π), contro L: sotto la separazione 0,027π dei due toni (linea) servono L > 148 campioni

Come scegliere i parametri

Il codice Python è in Esercizio - Spettrogramma e finestra di analisi.

Domande d'esame

  1. Definire la STFT e lo spettrogramma. Perché si usano tante DFT brevi invece di una sola lunga? Traccia: X[k,ℓ]=∑w[n]x[ℓ+n]e−j2πkn/NX[k,\ell]=\sum w[n]x[\ell+n]e^{-j2\pi kn/N}, finestra, passo R<LR<L (tipicamente L/2L/2), frame; segnale non stazionario; calcolo di una DFT enorme e impossibilità del tempo reale; rappresentazione in dB come immagine tempo-frequenza; numero di frame.
  2. Spiegare il compromesso tra risoluzione in tempo e in frequenza nello spettrogramma. Traccia: Δω^≃c 2π/L\Delta\hat\omega\simeq c\,2\pi/L (lobo della finestra); due toni più vicini della mezza larghezza si fondono; finestra corta per transizioni brevi (sfocatura ∼L\sim L); esempio con 0.2π0.2\pi e 0.227π0.227\pi (L=301L=301 risolve, L=75L=75 no); strategia di più lunghezze.
  3. Come si sceglie la lunghezza della finestra per risolvere due toni a distanza Δω^\Delta\hat\omega? Traccia: mezza larghezza del lobo principale <Δω^<\Delta\hat\omega: L>8π/(2Δω^)L>8\pi/(2\Delta\hat\omega) per Hann (con Δω^=0.027π\Delta\hat\omega=0.027\pi si ricava L>148L>148).

Versione ripasso

  • STFT. X[k,ℓ]=∑n=0L−1w[n] x[ℓ+n] e−j2πkn/NX[k,\ell]=\sum_{n=0}^{L-1}w[n]\,x[\ell+n]\,e^{-j2\pi kn/N}, con N≥LN\ge L, ℓ=mR\ell=mR e 1≤R<L1\le R<L (di solito R=L/2R=L/2). Frequenza fk=kFs/Nf_k=kF_s/N. Numero di frame per un segnale di lunghezza DD: ⌊(D−L)/R⌋+1\lfloor(D-L)/R\rfloor+1.
  • Due passi. Finestratura del frame w[n]x[ℓ+n]w[n]x[\ell+n], poi DFT breve a NN punti dello spettro locale.
  • Esempio di conteggio. D=10 000D=10\,000, L=301L=301, R=30R=30, N=1024N=1024: 324324 frame, 513513 bin utili per un segnale reale. Con L=75L=75, R=8R=8: 12411241 frame.
  • Spettrogramma. Immagine con tempo in ascissa, frequenza in ordinata, livello proporzionale a ∣X∣\lvert X\rvert, a 20log⁡10∣X∣20\log_{10}\lvert X\rvert (dB, mostra le componenti deboli) o a ∣X∣2\lvert X\rvert^2. Riga orizzontale = tono stabile; riga inclinata = frequenza variabile; trattino verticale = impulso.
  • Esempio di laboratorio. spectrogram con Hamming di 256256 campioni, nfft=256, noverlap=128: R=128R=128, 7777 frame, 129129 bin su 10 00010\,000 campioni.
  • Compromesso. Lobo principale della finestra circa c 2π/Lc\,2\pi/L (c=4c=4 rettangolare, 88 Hann e Hamming, 1212 Blackman): finestra lunga = buona risoluzione in frequenza, ma sfocatura temporale di circa L/2L/2. Finestra corta = buona localizzazione nel tempo, ma righe vicine fuse. Si provano più lunghezze.
  • Esempio del segnale di prova. cos⁡(0,2πn)+1,5cos⁡(0,227πn)\cos(0{,}2\pi n)+1{,}5\cos(0{,}227\pi n) per n<5000n<5000; cos⁡(0,2πn)\cos(0{,}2\pi n) fino a 70007000; cos⁡(0,6πn)+cos⁡(0,7πn)\cos(0{,}6\pi n)+\cos(0{,}7\pi n) fino a 10 00010\,000. A n=2000n=2000: con L=301L=301 due picchi a 0,200π0{,}200\pi e 0,227π0{,}227\pi; con L=75L=75 un solo picco a 0,217π0{,}217\pi.
  • Transizione. Il tono a 0,6π0{,}6\pi compare in n=7000n=7000: la salita dal 10%10\% al 90%90\% dura circa 145145 campioni con L=301L=301 e 3838 con L=75L=75.
  • Tabella dei tre istanti. n=6000n=6000: un tono a 0,2π0{,}2\pi, picco a 0,199π0{,}199\pi con entrambe le lunghezze, largo con L=75L=75. n=8000n=8000: toni a 0,6π0{,}6\pi e 0,7π0{,}7\pi, due picchi 0,600π0{,}600\pi e 0,699π0{,}699\pi con entrambe le lunghezze, larghi con L=75L=75.
  • Modello della transizione. Per una finestra di Hann centrata in tt e u=(t−7000)/Lu=(t-7000)/L limitato in [−12,12][-\tfrac12,\tfrac12], la riga a 0,6π0{,}6\pi ha ampiezza relativa 12+u+sin⁡2πu2π\tfrac12+u+\dfrac{\sin2\pi u}{2\pi}; in t=7000t=7000 vale 0,50{,}5.
  • Soglia per i due toni. Mezza larghezza di Hann 4π/L4\pi/L sotto la separazione 0,027π0{,}027\pi richiede L>148L>148. Toni a 0,6π0{,}6\pi e 0,7π0{,}7\pi, distanti 0,1π0{,}1\pi, si separano già con L=75L=75.
  • Principio. Finestra lunga: risoluzione in frequenza proporzionale a 1/L1/L, sfocatura temporale proporzionale a LL; il prodotto delle due incertezze resta circa costante.
  • Scelta dei parametri. L≥c⋅2π/Δω^L\ge c\cdot2\pi/\Delta\hat\omega con c≃2c\simeq2 per Hann e Hamming, LL non più lunga dell'evento; R=L/2R=L/2 come predefinito; N≥LN\ge L potenza di due.
  • Errore tipico. Pensare che lo zero-padding migliori la risoluzione temporale o frequenziale: infittisce soltanto i campioni.

Esercizi su questo argomento

Teoria collegata