FFT e zero-padding - TF, TFtd e asse delle pulsazioni
In questa pagina 10
Una domanda di calcolo numerico compare in ogni tema d'esame di Segnali e Sistemi: scrivere uno script che calcoli la trasformata di Fourier di un segnale campionato con la FFT, con l'asse delle pulsazioni corretto e un "opportuno zero-padding". Questa nota spiega perché si fa così, ed è corredata da codice Python eseguito (equivalente al Matlab degli esami: vedi la tabella in Segnali e sistemi in Python - campioni, convoluzione e filtriAl calcolatore un segnale continuo è un vettore di campioni con un asse dei tempi. Con numpy si definiscono i segnali, si approssimano area ed energia con somme moltiplicate per il passo, si calcola la convoluzione continua con np.convolve(x, y)*dt (asse = somma degli istanti iniziali), si simulano filtri con equazioni alle differenze e si verificano numericamente linearità e tempo-invarianza.Segnali e sistemi in Python - campioni, convoluzione e filtri →).
Dal segnale continuo alla FFT
Sia un segnale continuo, nullo fuori da un intervallo (o trascurabile fuori), campionato con passo negli istanti , , con campioni . Si approssima l'integrale della TF con la somma rettangolare: L'ultima somma è la TFtd della sequenza dei campioni calcolata in (Trasformata di Fourier a tempo discreto (TFtd)La TFtd di una sequenza è $X(\omega)=\sum_nx(n)e^{-j\omega n}$, funzione continua e periodica di periodo $2\pi$; si inverte con $x(n)=\frac1{2\pi}\int_{-\pi}^{\pi}X(\omega)e^{j\omega n}d\omega$. Ha le stesse proprietà della TF continua (la convoluzione diventa prodotto, $n,x(n)\leftrightarrow jX'$). È la risposta in frequenza dei sistemi discreti; con la TFD e lo zero-padding se ne ottengono campioni arbitrariamente fitti.Trasformata di Fourier a tempo discreto (TFtd) →): . Quindi La somma è anche il campionamento di visto in Campionamento e formula di PoissonCampionare un segnale continuo $x(t)$ con passo $T_c$ dà la sequenza $x(nT_c)$. La formula di Poisson lega gli spettri: $\hat W(\omega)=\frac1{T_c}\sum_kX\left(\frac{\omega+2\pi k}{T_c}\right)$, cioè lo spettro del segnale campionato è la ripetizione periodica (di periodo $2\pi/T_c$ in pulsazione analogica) dello spettro originale, riscalata. Se le repliche si sovrappongono si ha aliasing.Campionamento e formula di Poisson → (la TFtd dei campioni è la ripetizione periodica di riscalata: ), quindi l'approssimazione è buona se l'aliasing è trascurabile (lo spettro è piccolo oltre ) e se il segnale è davvero nullo fuori dall'intervallo osservato.
Cosa calcola la FFT
np.fft.fft(x, M) ( fft(x,M) in Matlab) calcola la TFD (Trasformata di Fourier discreta (TFD)La TFD è la serie di Fourier dei segnali discreti periodici di periodo $N$: servono solo $N$ armoniche, $X(k)=\frac1N\sum_{n=0}^{N-1}x(n)e^{-j2\pi kn/N}$ e $x(n)=\sum_{k=0}^{N-1}X(k)e^{j2\pi kn/N}$. È un prodotto matrice-vettore in $\mathbb{C}^N$ (la matrice di Fourier); la convoluzione circolare diventa prodotto, $N X(k)Y(k)$. La FFT la calcola in $O(N\log N)$.Trasformata di Fourier discreta (TFD) →) di punti del vettore completato con zeri. Con la convenzione della libreria, senza il fattore :
Sono campioni equispaziati della TFtd nel periodo , ai valori . Con () si ottengono le pulsazioni:
Il passo in pulsazione è e il massimo valore rappresentabile è (metà della pulsazione di campionamento ): oltre c'è aliasing.
Frequenze negative. Gli indici corrispondono, per periodicità, a pulsazioni negative: . Per avere l'asse centrato in zero si riordina con fftshift e si costruisce l'asse da a :
M = 2**(nextpow2(N) + 3) # zero-padding
X = np.fft.fftshift(Tc*np.fft.fft(x, M))
w = 2*np.pi*np.arange(-M/2, M/2)/(M*Tc) # asse delle pulsazioni [rad/s](in Matlab: w = -pi/Tc : 2*pi/(M*Tc) : pi/Tc - 2*pi/(M*Tc)). Con nextpow2 che è : nextpow2 = lambda N: int(np.ceil(np.log2(N))).
Fattore di fase. Se l'asse dei tempi parte da lo spettro calcolato dalla FFT è quello del segnale traslato a partire da : il modulo è identico (un ritardo non lo cambia) e la fase differisce per . Nei temi d'esame si traccia quasi sempre il solo , quindi non serve.
Se serve una frequenza in Hz (e non una pulsazione): con , (tema d'esame febbraio 2024: "attenzione, le ascisse sono frequenze, non pulsazioni").
Esempio: impulso modulato con la FFT
Segnale con , , (cioè un coseno di durata s tra e ), calcolato in con (tema d'esame gennaio 2025). Teoricamente con , e con un picco di modulo in (le due copie sono ben separate).
A, T, w0, Tc = 2.0, 10.0, 3.0, 1e-3
t = np.arange(-2, 30 + Tc/2, Tc)
x = A*np.cos(w0*t) * (np.abs((t - T)/(2*T)) < 0.5)
N = len(t); M = 2**(3 + nextpow2(N))
X = Tc * np.fft.fft(x, M)
w = 2*np.pi*np.arange(M)/(M*Tc)Risultati (, ): il picco di vale in , e in tre punti prossimi al picco la FFT e la formula esatta danno contro , contro , contro (ottimo accordo).
Esempio: confronto con lo spettro teorico
osservato in con (tema d'esame febbraio 2026). Teoria: . Il segnale non è a banda limitata, ma decade come e :
Tc = 1e-3; t = np.arange(0, 20 + Tc/2, Tc); x = 2*np.exp(-3*t)
N = len(t); M = 2**(nextpow2(N) + 3)
X = np.fft.fftshift(Tc*np.fft.fft(x, M))
w = 2*np.pi*np.arange(-M/2, M/2)/(M*Tc)
Xe = 2/(3 + 1j*w)Per l'errore massimo è , contro un picco : errore relativo . La parte principale è dovuta al valore del primo campione: con la convenzione dell'emivalore il primo campione dovrebbe pesare (errore , esattamente lo scarto trovato). L'aliasing contribuisce molto meno ( per la prima replica a , Conversione A-D e campionamento di segnali non limitati in bandaUn convertitore A/D è la catena filtro anti-aliasing passa-basso, campionatore, quantizzatore a $B$ bit. Nessun segnale reale è a banda esattamente limitata: si sceglie la banda essenziale (che contiene quasi tutta l'energia) e un passo $T_c$ tale che le repliche aliasing siano trascurabili. La quantizzazione introduce un errore con potenza $\Delta^2/12$ e un rapporto segnale-rumore di circa $6{,}02B+1{,}76$ dB.Conversione A-D e campionamento di segnali non limitati in banda →).
Zero-padding: cosa fa e cosa non fa
Zero-padding significa passare da a punti aggiungendo zeri in coda. Poiché il segnale è nullo comunque fuori da , la TFtd non cambia: cambia solo il numero di punti in cui viene campionata, con passo . Dimostrazione (Trasformata di Fourier a tempo discreto (TFtd)La TFtd di una sequenza è $X(\omega)=\sum_nx(n)e^{-j\omega n}$, funzione continua e periodica di periodo $2\pi$; si inverte con $x(n)=\frac1{2\pi}\int_{-\pi}^{\pi}X(\omega)e^{j\omega n}d\omega$. Ha le stesse proprietà della TF continua (la convoluzione diventa prodotto, $n,x(n)\leftrightarrow jX'$). È la risposta in frequenza dei sistemi discreti; con la TFD e lo zero-padding se ne ottengono campioni arbitrariamente fitti.Trasformata di Fourier a tempo discreto (TFtd) →): per a supporto in , la TFD della ripetizione periodica di periodo vale , quindi scegliendo grande a piacere la risoluzione con cui si "disegna" è arbitrariamente fine (tema d'esame ricorrente: mostrare che con la TFD e lo zero-padding si ottiene una rappresentazione di con risoluzione arbitrariamente fine).
- Serve a: disegnare una curva liscia (senza lo zero-padding pochi punti nascondono i lobi del sinc), trovare con precisione la posizione di un picco, avere una potenza di 2 per la FFT.
- Non serve a: distinguere due frequenze vicine. La risoluzione (capacità di separare due righe) dipende dalla durata osservata : due sinusoidi a distanza si separano solo se , perché il segnale è moltiplicato per una finestra rettangolare lunga , che nello spettro è un sinc con lobo principale largo Hz.
Verifica numerica. Due coseni a Hz e Hz ( Hz), :
| picchi trovati (con ) | ||
|---|---|---|
| s | Hz | uno solo, a Hz (le due righe sono fuse) |
| s | Hz | due, a e Hz |
| s | Hz | due, a e Hz |
Con s nessuno zero-padding separa le righe; aumentando il tempo osservato appaiono. (Le posizioni dei massimi sono leggermente alterate dalla sovrapposizione dei due lobi.)
Simmetria dello spettro di un segnale reale
Per un segnale reale è pari (Proprietà della trasformata di FourierCon le proprietà (linearità, simmetrie, ritardo $\leftrightarrow e^{-j\omega t_0}$, modulazione $\leftrightarrow$ traslazione in frequenza, scala, dualità, convoluzione $\leftrightarrow$ prodotto, Parseval $E=\frac1{2\pi}\int|X|^2$, derivata $\leftrightarrow j\omega$, moltiplicazione per $t\leftrightarrow j,d/d\omega$, integrazione) quasi tutte le trasformate si ottengono da poche coppie base senza integrare.Proprietà della trasformata di Fourier →) e quindi, per i campioni, per (indici da ). In Matlab (indici da ): . Esempio d'esame (febbraio 2023): "se il massimo di è nel 350-esimo campione, dove ci si aspetta un altro picco?". Risposta: nel campione (accettata anche ), perché l'indice (da 1) corrisponde a e è l'indice . Con indici da (Python) la corrispondenza è (verificata numericamente per un segnale reale casuale con , ).
Dall'antitrasformata: da a
Il procedimento inverso (Trasformata di Fourier discreta (TFD)La TFD è la serie di Fourier dei segnali discreti periodici di periodo $N$: servono solo $N$ armoniche, $X(k)=\frac1N\sum_{n=0}^{N-1}x(n)e^{-j2\pi kn/N}$ e $x(n)=\sum_{k=0}^{N-1}X(k)e^{j2\pi kn/N}$. È un prodotto matrice-vettore in $\mathbb{C}^N$ (la matrice di Fourier); la convoluzione circolare diventa prodotto, $N X(k)Y(k)$. La FFT la calcola in $O(N\log N)$.Trasformata di Fourier discreta (TFD) →): se X contiene i campioni di sulle pulsazioni (con pari), il passo temporale è e il segnale è x = ifft(ifftshift(X))/Tc con tempi t = (0:N-1)*Tc (compito del canale Ing. Biomedica). Controllato: partendo da un esponenziale campionato, fft fftshift ifftshift ifft restituisce esattamente il segnale (True, con ).
Prove al calcolatore: tre compiti tipici
Oltre alla domanda dello scritto, il corso prevede una prova al calcolatore facoltativa (punti bonus). I compiti dei due ultimi anni sono di tre tipi.
1. Somma parziale della serie di Fourier di un'onda quadra (prova del 2023). Si traccia l'onda quadra (con ) in , dove coincide con , e la somma parziale con un ciclo for che aggiunge una armonica per volta, inizializzando alla costante . Il codice Python è nella nota Segnali e sistemi in Python - campioni, convoluzione e filtriAl calcolatore un segnale continuo è un vettore di campioni con un asse dei tempi. Con numpy si definiscono i segnali, si approssimano area ed energia con somme moltiplicate per il passo, si calcola la convoluzione continua con np.convolve(x, y)*dt (asse = somma degli istanti iniziali), si simulano filtri con equazioni alle differenze e si verificano numericamente linearità e tempo-invarianza.Segnali e sistemi in Python - campioni, convoluzione e filtri → (somme parziali e fenomeno di Gibbs): le armoniche sono quelle dispari di coefficiente (Serie di Fourier - analisi e sintesiUn segnale periodico di periodo $T$ si scrive come somma di esponenziali in relazione armonica, $x(t)=\sum_ka_ke^{jk\omega_0t}$ con $\omega_0=2\pi/T$, e i coefficienti si ottengono per proiezione, $a_k=\frac1T\int_Tx(t)e^{-jk\omega_0t}dt$. L'ortogonalità degli esponenziali dà la formula; la convergenza è in media quadratica (Riesz-Fischer), con il fenomeno di Gibbs nei salti.Serie di Fourier - analisi e sintesi →).
2. Spettro di un segnale audio e frequenza principale (prova del 2024). Dati i campioni y e la frequenza di campionamento (): zero-padding (cioè ), Y = Ts*fft(y, M), asse delle frequenze positive F = np.arange(M//2)*Fs/M (passo , fino a ), grafico di in funzione di , di e in scala logaritmica ( o semilogy), e frequenza principale F[np.argmax(np.abs(Y[:M//2]))] in Hz. Prova su un tono sintetico ( Hz con smorzamento e rumore, Hz, 2 s, ): il massimo cade a Hz, entro il passo di griglia Hz.
3. Stima della frequenza di un esponenziale complesso e risoluzione (prova del 2026). Si genera con , campioni, si calcola fft(x, M) con zero-padding e si stima con l'indice del massimo, . Per un segnale complesso lo spettro non è pari e va guardato l'intero intervallo (con fftshift). L'errore è al più mezzo passo di griglia, : con si trova (errore ); con solo (errore ); con l'errore scende a : lo zero-padding affina la stima del picco di un tono isolato, perché la forma del lobo è nota e liscia. Poi si aggiunge una seconda componente a con e ampiezza e ci si chiede con quanti campioni si distinguono i due picchi: la finestra rettangolare ha lobo principale con zeri a , quindi serve circa (criterio di Rayleigh, ); la soluzione del corso è più prudente (, ). Numericamente: con si vede un picco, con due (, soglia del massimo). Lo zero-padding, anche enorme, non separa i picchi se è troppo piccolo: conta la durata osservata.
Procedura per l'esame
- Definisci
Tc, l'asset, il segnalex(conrect = lambda t: abs(t)<0.5). N = len(t);M = 2**(nextpow2(N)+3)(potenza di due, almeno ; l'esame accetta – o "opportuno").X = Tc*fft(x, M)(il fattore è essenziale per un segnale continuo).- Asse:
w = 2*pi*(0:M-1)/(M*Tc)oppure, confftshift, da a con passo . Etichetta in rad/s (o in Hz dividendo per ). - Grafico del modulo
abs(X)e limiti d'asse conxlim.
Errori comuni
- Dimenticare il fattore (lo spettro risulta volte più grande).
- Dimenticare che
fftnon ha il fattore (e sbagliare il confronto con la TFD "con " di Trasformata di Fourier discreta (TFD)La TFD è la serie di Fourier dei segnali discreti periodici di periodo $N$: servono solo $N$ armoniche, $X(k)=\frac1N\sum_{n=0}^{N-1}x(n)e^{-j2\pi kn/N}$ e $x(n)=\sum_{k=0}^{N-1}X(k)e^{j2\pi kn/N}$. È un prodotto matrice-vettore in $\mathbb{C}^N$ (la matrice di Fourier); la convoluzione circolare diventa prodotto, $N X(k)Y(k)$. La FFT la calcola in $O(N\log N)$.Trasformata di Fourier discreta (TFD) →). - Costruire l'asse con invece di (si dimentica il passo di campionamento e lo zero-padding).
- Non usare
fftshifte disegnare lo spettro "con le frequenze negative a destra". - Credere che lo zero-padding migliori la risoluzione: aumenta solo il numero di punti.
Versione ripasso
- Approssimazione: (aliasing trascurabile, segnale nullo fuori da ).
- FFT: (senza ). Asse: , ; = frequenze negative; con
fftshiftda a , . ; non dipende da . - Esempio , : picco ( numerico in ). : errore rispetto a ( dall'emivalore).
- Zero-padding: non cambia , la campiona più fitto ( per la TFD); non migliora la risoluzione, fissata da (). 10 Hz e 10,5 Hz: un picco con s, due con s e s.
- Reale: (indici da 0); Matlab ; picco in .
- Inversa:
x = ifft(ifftshift(X))/Tc,t = (0:N-1)*Tc. - Procedura:
Tc,t,x;M = 2**(nextpow2(N)+3);X = Tc*fft(x,M); asse ;abs(X). - Errori: dimenticato; ; asse ; niente
fftshift; zero-padding risoluzione. Vedi Segnali e sistemi in Python - campioni, convoluzione e filtriAl calcolatore un segnale continuo è un vettore di campioni con un asse dei tempi. Con numpy si definiscono i segnali, si approssimano area ed energia con somme moltiplicate per il passo, si calcola la convoluzione continua con np.convolve(x, y)*dt (asse = somma degli istanti iniziali), si simulano filtri con equazioni alle differenze e si verificano numericamente linearità e tempo-invarianza.Segnali e sistemi in Python - campioni, convoluzione e filtri →.
Esercizi su questo argomento
Teoria collegata
- Conversione A-D e campionamento di segnali non limitati in banda
- Domande di teoria ricorrenti - enunciati e dimostrazioni
- Formulario - trasformate notevoli e proprietà
- Segnali e sistemi in Python - campioni, convoluzione e filtri
- Trasformata di Fourier a tempo discreto (TFtd)
- Trasformata di Fourier discreta (TFD)