Esercizio 26trasformata di Fourier con FFT e zero-padding (temi d'esame gennaio 2025 e febbraio 2026)
In questa pagina 4
Due domande di "Matlab" dagli esami, risolte in Python (numpy). L'esame le prevede in Matlab; la traduzione delle funzioni è nella tabella di 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 →.
Testo A (tema d'esame gennaio 2025, domanda di Matlab, 3 punti). Si consideri il segnale . Scrivere uno script che:
- calcoli nell'intervallo campionato a passo , con , , ;
- tracci in una figura l'andamento di nell'intervallo;
- tracci in una figura, usando la FFT, l'andamento del modulo della TFtc di solo per frequenze positive. È importante identificare correttamente la scala delle frequenze. Per il calcolo della FFT usare un opportuno zero-padding.
Testo B (tema d'esame febbraio 2026, domanda di Matlab, 3 punti). Si consideri il segnale . Scrivere uno script che:
- calcoli nell'intervallo campionato a passo , con , ;
- tracci in una figura l'andamento di ;
- tracci in una seconda figura l'andamento del modulo di , la TFtc di , usando la FFT con un opportuno zero-padding (attenzione alla denominazione dell'asse delle ascisse);
- tracci nella stessa figura l'andamento teorico di (da calcolare analiticamente, non nello script).
Teoria usata: FFT e zero-padding - TF, TFtd e asse delle pulsazioniLa FFT dei campioni di un segnale a durata finita, moltiplicata per il passo $T_c$, approssima la trasformata di Fourier: $X(\omega_k)\approx T_c,\mathtt{fft}(x,M)[k]$ con $\omega_k=\frac{2\pi k}{MT_c}$ (e fattore di fase $e^{-j\omega t_0}$ se l'asse parte da $t_0$). Lo zero-padding ($M>N$) infittisce i punti della stessa TFtd senza aggiungere informazione; la risoluzione dipende dalla durata osservata. Per un segnale reale $|X|$ è simmetrico: il picco in $k$ ha un gemello in $M-k$.FFT e zero-padding - TF, TFtd e asse delle pulsazioni →, 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) →, 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 →, 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 →.
Il metodo (richiamo)
Per campioni si ha con , (indici ; per sono le frequenze negative). Per il modulo, non conta (FFT e zero-padding - TF, TFtd e asse delle pulsazioniLa FFT dei campioni di un segnale a durata finita, moltiplicata per il passo $T_c$, approssima la trasformata di Fourier: $X(\omega_k)\approx T_c,\mathtt{fft}(x,M)[k]$ con $\omega_k=\frac{2\pi k}{MT_c}$ (e fattore di fase $e^{-j\omega t_0}$ se l'asse parte da $t_0$). Lo zero-padding ($M>N$) infittisce i punti della stessa TFtd senza aggiungere informazione; la risoluzione dipende dalla durata osservata. Per un segnale reale $|X|$ è simmetrico: il picco in $k$ ha un gemello in $M-k$.FFT e zero-padding - TF, TFtd e asse delle pulsazioni →). Lo zero-padding si ottiene con np.fft.fft(x, M), scegliendo potenza di due maggiore di (qui ).
Soluzione del testo A
Passo 1: il segnale. vale per , cioè : il coseno è "acceso" tra e s (in c'è quindi un tratto nullo prima e uno dopo). Si usa un indicatore booleano.
import numpy as np
nextpow2 = lambda N: int(np.ceil(np.log2(N)))
A, T, w0, Tc = 2.0, 10.0, 3.0, 1e-3
t = np.arange(-2, 30 + Tc/2, Tc) # (-2, 30) a passo Tc
x = A*np.cos(w0*t) * (np.abs((t - T)/(2*T)) < 0.5) # A cos(w t) rect((t-T)/(2T))
# plt.plot(t, x) -> figura 1Passo 2: lo spettro con la FFT. campioni; (zero-padding di un fattore ).
N = len(t); M = 2**(3 + nextpow2(N))
X = Tc*np.abs(np.fft.fft(x, M)) # |X| = Tc |fft| (modulo: t0 non conta)
Fc = 1/Tc
f = np.arange(M//2 + 1) * Fc / M # frequenze POSITIVE in Hz: 0, Fc/M, ..., Fc/2
# plt.plot(f, X[:M//2+1]); plt.xlim(0, 3*w0/(2*np.pi)) -> figura 2Scala delle frequenze. I campioni della FFT hanno passo Hz e coprono ; le frequenze positive fino a Hz sono i primi campioni. Si disegna l'ascissa in Hz perché il testo chiede "frequenze" (per le pulsazioni ).
Cosa si osserva. Il modulo ha un picco di a Hz (campione più vicino a Hz): l'impulso è una sinusoide a limitata nel tempo a una finestra lunga s, quindi lo spettro è un centrato in con altezza e lobo principale con gli zeri a Hz dal centro (largo Hz in totale) (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 →: , ). Il valore (e non ) include il contributo della replica a frequenza negativa , che a vale poco più dell'. In tre punti vicini al picco, la FFT dà , , (con in rad/s) in accordo con la formula esatta.
Perché lo zero-padding. Senza zero-padding () il passo in frequenza sarebbe Hz; con è Hz e il lobo principale (largo Hz) è disegnato con circa punti (senza zero-padding ne basterebbero ) (FFT e zero-padding - TF, TFtd e asse delle pulsazioniLa FFT dei campioni di un segnale a durata finita, moltiplicata per il passo $T_c$, approssima la trasformata di Fourier: $X(\omega_k)\approx T_c,\mathtt{fft}(x,M)[k]$ con $\omega_k=\frac{2\pi k}{MT_c}$ (e fattore di fase $e^{-j\omega t_0}$ se l'asse parte da $t_0$). Lo zero-padding ($M>N$) infittisce i punti della stessa TFtd senza aggiungere informazione; la risoluzione dipende dalla durata osservata. Per un segnale reale $|X|$ è simmetrico: il picco in $k$ ha un gemello in $M-k$.FFT e zero-padding - TF, TFtd e asse delle pulsazioni →).
Soluzione del testo B
A, Tc, T = 2.0, 1e-3, 20.0
t = np.arange(0, T + Tc/2, Tc)
x = A*np.exp(-3*t) # per t >= 0 il gradino vale 1
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) # asse delle PULSAZIONI [rad/s]
Xe = A/np.sqrt(9 + w**2) # |X| teorico
# plt.plot(w, np.abs(X)); plt.plot(w, Xe); plt.xlim(-20, 20)Lo spettro teorico. , con modulo . Per : , e in (taglio a dB).
Asse delle ascisse. Le ascisse sono pulsazioni in rad/s (testo: "attenzione alla denominazione dell'asse"): da a rad/s, passo rad/s. Si fa uno zoom con xlim(-20, 20) per vedere il picco.
Confronto numerico. Per l'errore massimo tra la FFT (moltiplicata per ) e la formula è ( del picco ): le due curve sono praticamente sovrapposte. L'accordo non è perfetto per due motivi.
- Primo campione. La FFT calcola (somma rettangolare), che dà pieno peso; il segnale in ha però un salto da a e, con la convenzione dell'emivalore, vale . L'errore è proprio . Correggendo con (regola dei trapezi) l'errore massimo scende a .
- Aliasing e troncamento. Il segnale non è a banda limitata: come e la frequenza massima rappresentabile è rad/s, quindi la prima replica aggiunge in , trascurabile rispetto alla scala del grafico (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 →). Il troncamento a s è irrilevante: .
Errori comuni
- Dimenticare il fattore (lo spettro verrebbe volte troppo grande).
- Costruire l'asse delle frequenze con
np.arange(M)/M(frequenza normalizzata) invece di (in Hz) o (in rad/s); oppure dimenticare di passare da Hz a rad/s quando il testo chiede la pulsazione. - Disegnare tutto il vettore della FFT quando si chiedono solo le frequenze positive: occorre fermarsi a .
- Non usare lo zero-padding e disegnare una curva "a scalini" con pochi punti.
- Usare
np.fft.fft(x, N)senza argomento : lo zero-padding si ottiene solo passando .
Versione ripasso
Testo. (A, gennaio 2025) , , , in , : grafico di e di con FFT (solo ). (B, febbraio 2026) , , : , da FFT e teorico (febbraio 2026).
- Formula (FFT e zero-padding - TF, TFtd e asse delle pulsazioniLa FFT dei campioni di un segnale a durata finita, moltiplicata per il passo $T_c$, approssima la trasformata di Fourier: $X(\omega_k)\approx T_c,\mathtt{fft}(x,M)[k]$ con $\omega_k=\frac{2\pi k}{MT_c}$ (e fattore di fase $e^{-j\omega t_0}$ se l'asse parte da $t_0$). Lo zero-padding ($M>N$) infittisce i punti della stessa TFtd senza aggiungere informazione; la risoluzione dipende dalla durata osservata. Per un segnale reale $|X|$ è simmetrico: il picco in $k$ ha un gemello in $M-k$.FFT e zero-padding - TF, TFtd e asse delle pulsazioni →): , , ;
M = 2**(nextpow2(N)+3). - A:
x = A*np.cos(w0*t)*(np.abs((t-T)/(2*T))<0.5);X = Tc*np.abs(np.fft.fft(x,M));f = np.arange(M//2+1)*Fc/M(). Picco a Hz (); sinc con zeri a Hz dal centro. - B: asse
w = 2*np.pi*np.arange(-M/2,M/2)/(M*Tc)confftshift; teorico ( in ). Errore ( dal primo campione; con : ); aliasing . - Errori: dimenticato; asse ; tutto il vettore invece di ; niente zero-padding. Vedi 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 →.