Esercizio - DFT di un segnale discreto periodico
In questa pagina 8
Testo (dispense del corso Teoria dei Segnali, UniPD, §6.5 e §8.4; argomento della lezione 12). Un segnale discreto periodico di periodo è assegnato dai suoi valori in un periodo. Si svolgono:
- (a) la DFT a mano per e per (matrice di Fourier, valori di ), con l'inversione e la forma unitaria;
- (b) la DFT di un coseno campionato che ha un numero intero di periodi nella finestra e di uno che ne ha un numero non intero (perdita spettrale, leakage), con
np.fft.ffte la convenzione del corso; - (c) la relazione tra la DFT e i coefficienti della serie di Fourier di un segnale continuo periodico campionato (aliasing), con l'esempio dell'onda quadra;
- (d) il teorema di Parseval nella forma ;
- (e) il legame con la trasformata di un segnale discreto a durata limitata (zero padding).
Teoria usata: Trasformata di Fourier discreta (DFT) e FFTUn segnale discreto periodico di periodo $NT$ ha una trasformata discreta e periodica, la DFT: $S(kF)=\sum_{n=0}^{N-1}T,s(nT)e^{-i2\pi kn/N}$, con $F=1/(NT)$, e $s(nT)=\sum_{k=0}^{N-1}F,S(kF)e^{i2\pi kn/N}$. Dipende da soli $N$ numeri, si calcola senza approssimazioni e con la FFT costa $N\log_2N$ invece di $N^2$. I coefficienti di Fourier del segnale periodico sono $S_k=F,S(kF)$. La DFT dà anche campioni della trasformata di un segnale discreto o continuo a durata limitata (con zero-padding), ma la scalatura $T$ e l'asse delle frequenze vanno gestiti con cura.Trasformata di Fourier discreta (DFT) e FFT →, 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 →, Serie di FourierUn segnale periodico di periodo $T_p$ si scrive come somma di esponenziali alle frequenze multiple della fondamentale $F=1/T_p$: $s(t)=\sum_nS_ne^{i2\pi nFt}$, con $S_n=\frac1{T_p}\int_{T_p}s(t)e^{-i2\pi nFt}dt$. Si basa sull'ortogonalità degli esponenziali su un periodo. $S_0$ è il valor medio; per segnali reali $S_{-n}=S_n^$ e si passa alla forma con coseni e seni; vale il teorema di Parseval $P=\sum|S_n|^2$. La convoluzione ciclica diventa il prodotto $T_pX_nY_n$ dei coefficienti. Le somme troncate presentano il fenomeno di Gibbs vicino ai salti.Serie di Fourier →, Campionamento e ricostruzioneIl campionamento $s_c(nT)=s(nT)$ trasforma un segnale continuo in uno discreto e, in frequenza, ripete lo spettro con periodo $F_c=1/T$: $S_c(f)=\sum_kS(f-kF_c)$. Se le repliche si sovrappongono si ha aliasing e il segnale non è recuperabile. Un interpolatore $\mathbb Z(T)\to\mathbb R$ con risposta impulsiva $g$ produce $\tilde s(t)=\sum_nT g(t-nT)s(nT)$ e $\tilde S=G,S_c$. Teorema del campionamento: se $s$ ha banda $B$ e $F_c\ge2B$, l'interpolatore ideale $G=\operatorname{rect}(f/F_c)$ ricostruisce esattamente $s(t)=\sum s(nT)\operatorname{sinc}(F_c(t-nT))$. Se le ipotesi non valgono c'è un errore, in banda e fuori banda, riducibile con un prefiltro anti-aliasing.Campionamento e ricostruzione →, Numeri complessiI numeri complessi estendono i reali introducendo l'unità immaginaria $i$ ($i^2 = -1$) e possono essere rappresentati in forma algebrica, trigonometrica o polare. Tramite la formula di Eulero e le proprietà del modulo e dell'argomento, è possibile calcolare agilmente prodotti, potenze e radici ennesime.Numeri complessi →, SommatorieIl simbolo di sommatoria, le sue proprietà (linearità, additività, cambio di indice) e le somme notevoli di Gauss e geometrica.Sommatorie →.
La DFT con la convenzione del corso
Sia periodico di periodo (cioè campioni per periodo). Si pongono
(Nel §6.5 del testo il simbolo è usato anche per ; qui si tiene per come nel §8.4.) La trasformata e la sua inversa (8.27) sono
(si è usato ). Sono entrambe periodiche di periodo : e , perché . Quindi è una sequenza di valori (alle frequenze ) e occupa un periodo .
Perché l'inversa torna. Si sostituisce nella seconda formula: La somma interna è geometrica (SommatorieIl simbolo di sommatoria, le sue proprietà (linearità, additività, cambio di indice) e le somme notevoli di Gauss e geometrica.Sommatorie →) di ragione : vale se (con , ) e altrimenti (perché , ). Resta , essendo . ✓
Come si calcola con NumPy. np.fft.fft(s) calcola (niente , niente ). Quindi, con la convenzione del corso:
I coefficienti del §6.5. La trasformata ordinaria del segnale periodico è un treno di impulsi alle frequenze ; l'area dell'impulso in è e si ha : sono i coefficienti della serie di Fourier discreta (, valor medio , ampiezza della componente a frequenza ). Attenzione a una discrepanza del testo: la (6.21) scrive con un fattore in più. Nella derivazione si moltiplica per che già contiene : . Prova: per l'impulso di in deve avere area (la trasformata del segnale costante è , (6.14)) e la formula con la darebbe . Qui si usa la forma corretta , coerente con la (8.27) e con la (8.24).
Forma matriciale e forma unitaria. Con (radice -esima dell'unità, ) si mettano i campioni in un vettore e i valori di in . Allora
( è la trasposta coniugata, con elementi .) La matrice è unitaria: (è proprio l'ortogonalità ). Se si rinormalizzano i vettori, e , la trasformata diventa la rotazione (infatti ). Una matrice unitaria conserva la norma: , cioè il teorema di Parseval (si veda (d)).
(a) DFT a mano
, ,
Dati. , Hz, Hz. Le frequenze sono Hz.
La matrice. . Le potenze si ripetono con periodo : , , , , . L'elemento è :
Il calcolo riga per riga (con ):
- ;
- ;
- ;
- .
Perciò e, moltiplicando per ,
Il segnale è reale, quindi () e , sono reali: bastano . è l'area di un periodo: ✓.
Inversione, , cioè (perché ). Per : ✓. Per (i fattori sono ): ✓. Anche (): ✓ e : ✓.
Parseval. e ✓ (con ).
I coefficienti : è il valor medio .
, ,
Dati. s, Hz, Hz. Il segnale vale per mezzo periodo e per l'altro mezzo (un'onda quadra campionata).
Le potenze di :
con .
Il calcolo. Solo hanno , quindi (somma geometrica: con , quindi per pari non nullo e per dispari).
- .
- (dove ).
- , e anche , .
- (con ).
- Per simmetria hermitiana: , .
Controllo. ; nelle unità del corso e () ✓. Le armoniche pari mancano, come in ogni onda quadra a metà periodo.
Grafico interattivo: Modulo di X_k per N = 8, s = (1,1,1,1,0,0,0,0): 4 per k = 0, nullo per k pari, 2,613 e 1,082 per k = 1,7 e 3,5 (cioè 4·|sinc(k/2)/sinc(k/8)|)
(b) Un coseno campionato: periodo intero e non intero
Dati. s ( Hz), campioni, quindi s e Hz. Il segnale è , , in due casi:
- caso A: Hz: nella finestra ci sono esattamente periodi del coseno, il segnale è periodico di periodo (e la finestra è un periodo del segnale);
- caso B: Hz: nella finestra ci sono periodi. Il segnale discreto è periodico di periodo ma non di periodo : ripetere la finestra di campioni crea uno scalino tra l'ultimo campione e il successivo.
Caso A. Per Eulero . Per l'ortogonalità (la somma geometrica di sopra) tutto si concentra in e (la frequenza ripiegata):
Con la convenzione del corso (che è ), mentre i coefficienti sono : i due coefficienti del coseno (), come nella serie di Fourier di un coseno continuo. Tutta la potenza (, cioè ) è nei due bin.
Grafico interattivo: Caso A, f0 = 4F (4 periodi interi nella finestra di 32 campioni): |S_h| vale 1/2 in h = 4 e h = 28 e zero altrove
Caso B. Ora non coincide con nessun bin ( intero). La DFT assume che i campioni siano un periodo; il segnale effettivamente periodico è la ripetizione della finestra, che non è il coseno originale. Il coseno "vero" spaccato in due esponenziali ha nel mezzo dei bin e : ognuno dei due esponenziali dà un contributo che, nel bin , ha modulo (è la funzione della (6.16)), che per vale circa e non , e decade lentamente (come ) lontano. I numeri ottenuti con np.fft.fft:
e la stessa cosa è simmetrica per (segnale reale). Il massimo è invece di (ampiezza sottostimata di circa un terzo), e nei quattro bin centrali c'è solo l' della potenza (nel caso A il ). La parte restante sbava su tutti i bin: è la perdita spettrale (leakage). La somma dei quadrati resta (Parseval vale sempre, vedi (d)): la potenza si ridistribuisce, non si perde.
Grafico interattivo: Caso B, f0 = 4,5 F (4,5 periodi nella finestra): |S_h| = X_h/N per N = 32. La frequenza cade a metà tra i bin 4 e 5, il picco scende a 0,33 e la potenza si spande su tutti i bin
Morale. La risoluzione in frequenza è : la si migliora osservando più a lungo (più campioni a parità di ), non campionando più in fretta. E se la finestra non contiene un numero intero di periodi la frequenza non è "su un bin" e compare il leakage (in pratica si attenua con una finestra di pesatura, argomento oltre questo esercizio).
(c) DFT e serie di Fourier di un segnale continuo periodico campionato
Il fatto generale. Sia continuo e periodico di periodo , con serie di Fourier , (Serie di FourierUn segnale periodico di periodo $T_p$ si scrive come somma di esponenziali alle frequenze multiple della fondamentale $F=1/T_p$: $s(t)=\sum_nS_ne^{i2\pi nFt}$, con $S_n=\frac1{T_p}\int_{T_p}s(t)e^{-i2\pi nFt}dt$. Si basa sull'ortogonalità degli esponenziali su un periodo. $S_0$ è il valor medio; per segnali reali $S_{-n}=S_n^*$ e si passa alla forma con coseni e seni; vale il teorema di Parseval $P=\sum|S_n|^2$. La convoluzione ciclica diventa il prodotto $T_pX_nY_n$ dei coefficienti. Le somme troncate presentano il fenomeno di Gibbs vicino ai salti.Serie di Fourier →). Lo si campiona con (esattamente campioni per periodo): , perché . Gli esponenziali con che differisce per un multiplo di coincidono sui campioni (). Si raggruppano gli indici , , :
perché i coefficienti della rappresentazione di con esponenziali sono unici. I coefficienti della versione campionata (cioè ) sono la somma dei coefficienti del continuo a distanza : le armoniche alte del continuo si "ripiegano" sulle basse. È lo stesso fenomeno del Teorema 6.1, di uno spettro a righe. Se ha banda limitata, per , le righe non si sovrappongono e per (): nessun aliasing (è la condizione di Nyquist ).
Esempio: onda quadra. per e per , ripetuta con periodo . Coefficienti: e, per ,
cioè , , , e per pari. Decadono come (il segnale ha salti): l'aliasing sarà importante.
Grafico interattivo: Coefficienti di Fourier X_h dell'onda quadra pari ±1: 2/π in h = ±1, -2/(3π) in h = ±3, e così via (decadono come 1/h); X_0 = 0
Campionamento con . I campioni cadono in per (cioè ): i salti stanno in campioni, tra due campioni, quindi non si campiona mai su un salto. I valori sono (: ; : , vale ; e : ). Il segnale è pari, quindi la DFT è reale:
Valori: : ; : ; : ; : ; poi , . Confronto con le armoniche del continuo:
| (continuo) | (campionato) | |||
|---|---|---|---|---|
| valore |
Non sono uguali: , e . I termini decadono come e la serie converge lentamente: a milioni di termini la somma è per e per , uguali alla DFT (verificato nel Controllo).
Grafico interattivo: DFT con N = 6 dell'onda quadra campionata: S_r = (0, 2/3, 0, -1/3, 0, 2/3) = somma dei X_{r+6k}; l'aliasing alza i coefficienti rispetto al continuo (2/π = 0,637 e -0,212)
Più campioni, meno aliasing. L'errore decade come (le armoniche ripiegate partono da e i coefficienti scendono come ):
(per nessun campione cade su un salto). Con una forma d'onda continua senza salti i coefficienti scendono molto più in fretta e l'aliasing con pochi campioni è già trascurabile.
(d) Parseval nella forma
Enunciato (8.29 per segnali discreti periodici, , ):
Dimostrazione con la forma unitaria. Se e , allora con unitaria, quindi . I due membri sono proprio e . In termini di : .
In termini di coefficienti. Con si ha . Dividendo per : la potenza è (Parseval della serie di Fourier, ).
Verifiche sugli esempi precedenti.
- , : e . In potenza: e ✓ (con ).
- : (visto sopra).
- Coseno, caso A: e ✓; . Caso B: stessa energia (calcolata in entrambi i modi), anche se distribuita su tutti i bin.
- Onda quadra, : ✓. Il continuo ha la stessa potenza (): l'aliasing non cambia la potenza, la ridistribuisce spostando le righe alte sulle basse.
(e) Segnale a durata limitata: la DFT campiona la trasformata
Se un segnale aperiodico (per esempio i tre campioni in dell'Es. 6.3A, ) si estende per campioni, lo si "periodicizza" con periodo (aggiungendo zeri, zero padding) e si calcola la DFT: è esattamente la somma che definisce la trasformata valutata in , perché per si ha . Quindi la DFT dà i campioni della trasformata aperiodica nei punti , e aumentare con zeri infittisce i punti. (Per i campioni in basta ricordare che l'indice equivale a per la periodicità.) Lo si vede nel Controllo con e .
Controllo
import numpy as np
np.set_printoptions(precision=4, suppress=True, linewidth=120)
# Convenzione del corso per N campioni su un periodo Tp = N T:
# S(kF) = somma_{n=0}^{N-1} T s(nT) e^{-i 2 pi k n/N} = T * np.fft.fft(s)[k]
# s(nT) = somma_{k=0}^{N-1} F S(kF) e^{+i 2 pi k n/N} (F = 1/(N T), F T = 1/N)
def dft_corso(s, T):
return T * np.fft.fft(s)
def idft_corso(S, T):
N = len(S); F = 1 / (N * T)
n = np.arange(N); k = np.arange(N)
return np.array([np.sum(F * S * np.exp(2j * np.pi * k * m / N)) for m in n])
# ---------- (a) N = 4, T = 1/2, s = (1, 2, 0, -1)
T, N = 0.5, 4
F = 1 / (N * T)
s = np.array([1, 2, 0, -1.0])
W = np.exp(-2j * np.pi / N) # = -i
M = np.array([[W**(k * n) for n in range(N)] for k in range(N)])
print(np.round(M, 3))
X = M @ s # DFT "senza T"
S = T * X
print("X =", X, " S(kF) =", S)
print("uguale a T*fft:", np.allclose(S, dft_corso(s, T)), " inversa:", np.allclose(idft_corso(S, T), s))
print("Parseval:", np.sum(T * abs(s)**2), np.sum(F * abs(S)**2))
U = M / np.sqrt(N)
print("U unitaria:", np.allclose(U.conj().T @ U, np.eye(N)), " S_norm = U s_norm:", np.allclose(U @ (np.sqrt(T) * s), np.sqrt(F) * S))
# N = 8, T = 1/8, s = (1,1,1,1,0,0,0,0)
T, N = 1 / 8, 8
s = np.array([1, 1, 1, 1, 0, 0, 0, 0.0])
W = np.exp(-2j * np.pi / N)
X = np.array([sum(W**(k * n) for n in range(4)) for k in range(N)])
print("N=8: X =", X)
print("uguale a fft:", np.allclose(X, np.fft.fft(s)), " sum|X|^2 =", np.sum(abs(X)**2), " N sum|s|^2 =", N * np.sum(s**2))
# ---------- (b) coseno campionato: periodo intero / non intero di campioni
T, N = 0.01, 32
F = 1 / (N * T) # 3.125 Hz; Fp = 100 Hz
n = np.arange(N)
for rapporto in (4.0, 4.5): # f0 = rapporto * F
f0 = rapporto * F
s = np.cos(2 * np.pi * f0 * n * T)
X = np.fft.fft(s)
Sh = X / N # coefficienti S_h = F S(hF)
S = T * X # S(kF), convenzione del corso
p = abs(Sh)**2
vicini = sorted({int(np.floor(rapporto)), int(np.ceil(rapporto)), N - int(np.floor(rapporto)), N - int(np.ceil(rapporto))})
print("f0 = %.4f Hz (%.1f F) max|S_h| = %.4f max|S(kF)| = %.4f" % (f0, rapporto, abs(Sh).max(), abs(S).max()),
" potenza nei bin", vicini, "= %.1f%%" % (100 * p[vicini].sum() / p.sum()),
" Parseval:", np.sum(T * s**2), np.sum(F * abs(S)**2))
# ---------- (c) onda quadra campionata: S_r = somma dei coefficienti X_{r+kN} (aliasing)
def X_quadra(h): # onda +-1, pari, +1 per |t| < Tp/4
h = np.asarray(h, float); out = np.zeros_like(h); nz = h != 0
out[nz] = 2 * np.sin(np.pi * h[nz] / 2) / (np.pi * h[nz]); return out
for N in (6, 10, 18, 34): # N = 2 mod 4: nessun campione cade su un salto
t = np.arange(N) / N # tempo in unita' di Tp
tt = (t + 0.5) % 1 - 0.5
s = np.where(np.abs(tt) < 0.25, 1.0, -1.0)
Sh = np.fft.fft(s) / N
K = np.arange(-2_000_000, 2_000_001) # serie dell'aliasing, troncata
alias = [np.sum(X_quadra(r + K * N)) for r in (1, 3)]
print("N = %2d S_1 = %.5f (alias %.5f, X_1 = %.5f) S_3 = %.5f (alias %.5f, X_3 = %.5f) potenza = %.4f"
% (N, Sh[1].real, alias[0], X_quadra([1])[0], Sh[3].real, alias[1], X_quadra([3])[0], np.sum(abs(Sh)**2)))
# ---------- (e) segnale finito: la DFT campiona la trasformata a tempo discreto
T, A0 = 0.5, 2.0
for N in (8, 32):
s = np.zeros(N); s[[0, 1, N - 1]] = A0 # tre campioni in n = -1, 0, 1
F = 1 / (N * T); k = np.arange(N)
print("N =", N, " DFT = S2(kF):", np.allclose(T * np.fft.fft(s), A0 * T * (1 + 2 * np.cos(2 * np.pi * k * F * T))))Risultati ottenuti eseguendolo: (a) , , inversa e Parseval vere (), unitaria; per , e . (b) caso A: massimo , , della potenza nei bin e ; caso B: massimo , , nei quattro bin centrali; Parseval in entrambi. (c) e per , uguali alle somme di aliasing; potenza . (e) la DFT coincide con per e .
Errori comuni
- Scambiare la DFT di NumPy con quella del corso: manca il fattore () e, per i coefficienti, il fattore ().
- Dimenticare che dipende dalla durata della finestra, non dalla velocità: aumentare a parità di migliora la risoluzione.
- Credere che i coefficienti della versione campionata di un segnale continuo siano uguali a quelli del continuo: sono la somma (aliasing).
- Concludere che un coseno a frequenza non multipla di "ha la DFT sbagliata": la DFT è corretta per il segnale periodico che ripete la finestra; il leakage dipende dalla scelta della finestra.
- Dimenticare che l'ultima metà dei () rappresenta le frequenze negative: per segnali reali.
Versione ripasso
Testo. Segnale periodico : DFT a mano (, ), coseno con periodo intero/non intero di campioni, legame con la serie di Fourier del continuo campionato (aliasing), Parseval (Trasformata di Fourier discreta (DFT) e FFTUn segnale discreto periodico di periodo $NT$ ha una trasformata discreta e periodica, la DFT: $S(kF)=\sum_{n=0}^{N-1}T,s(nT)e^{-i2\pi kn/N}$, con $F=1/(NT)$, e $s(nT)=\sum_{k=0}^{N-1}F,S(kF)e^{i2\pi kn/N}$. Dipende da soli $N$ numeri, si calcola senza approssimazioni e con la FFT costa $N\log_2N$ invece di $N^2$. I coefficienti di Fourier del segnale periodico sono $S_k=F,S(kF)$. La DFT dà anche campioni della trasformata di un segnale discreto o continuo a durata limitata (con zero-padding), ma la scalatura $T$ e l'asse delle frequenze vanno gestiti con cura.Trasformata di Fourier discreta (DFT) e FFT →).
- Convenzione: , , , ; -periodica; (il di (6.21) è di troppo). Matrice , ; unitaria con , .
- (a) , , : , . , : , , pari nulli.
- (b) coseno a (): due righe ; a : leakage, picco , della potenza nei 4 bin centrali.
- (c) campionando con campioni per periodo: (aliasing). Onda quadra, : contro ; l'errore va come .
- (d) (unitarietà), cioè .
- Errori: e dimenticati rispetto a
fft; coefficienti del campionato quelli del continuo; sono frequenze negative.