Salta al contenuto
Note per Studenti Esercizio - DFT di un segnale discreto periodico

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 s(nT)s(nT) periodico di periodo Tp=NTT_p=NT è assegnato dai suoi NN valori in un periodo. Si svolgono:

  • (a) la DFT a mano per N=4N=4 e per N=8N=8 (matrice di Fourier, valori di e−i2π/Ne^{-i2\pi/N}), 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.fft e 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 ∑T∣s∣2=∑F∣S∣2\sum T|s|^2=\sum F|S|^2;
  • (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 s(nT)s(nT) periodico di periodo Tp=NTT_p=NT (cioè NN campioni per periodo). Si pongono

F=1Tp=1NT  (quanto in frequenza),Fp=1T=NF  (periodo in frequenza),FT=1N.F=\frac1{T_p}=\frac1{NT}\ \ (\text{quanto in frequenza}),\qquad F_p=\frac1T=NF\ \ (\text{periodo in frequenza}),\qquad FT=\frac1N .

(Nel §6.5 del testo il simbolo FpF_p è usato anche per 1NT\frac1{NT}; qui si tiene FF per 1Tp\frac1{T_p} come nel §8.4.) La trasformata e la sua inversa (8.27) sono

S(kF)=∑n=0N−1T s(nT) e−i2πkn/N,s(nT)=∑k=0N−1F S(kF) ei2πkn/N\boxed{S(kF)=\sum_{n=0}^{N-1}T\,s(nT)\,e^{-i2\pi kn/N},\qquad s(nT)=\sum_{k=0}^{N-1}F\,S(kF)\,e^{i2\pi kn/N}}

(si è usato kFnT=knNkFnT=\frac{kn}N). Sono entrambe periodiche di periodo NN: S((k+N)F)=S(kF)S((k+N)F)=S(kF) e s((n+N)T)=s(nT)s((n+N)T)=s(nT), perché e±i2πNn/N=1e^{\pm i2\pi N n/N}=1. Quindi SS è una sequenza di NN valori (alle frequenze 0,F,…,(N−1)F0,F,\dots,(N-1)F) e occupa un periodo Fp=NFF_p=NF.

Perché l'inversa torna. Si sostituisce S(kF)S(kF) nella seconda formula: ∑kF∑mT s(mT)e−i2πk(m−n)/N=FT∑ms(mT)∑k=0N−1e−i2πk(m−n)/N.\sum_kF\sum_mT\,s(mT)e^{-i2\pi k(m-n)/N}=FT\sum_m s(mT)\sum_{k=0}^{N-1}e^{-i2\pi k(m-n)/N}. 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 z=e−i2π(m−n)/Nz=e^{-i2\pi(m-n)/N}: vale NN se m=nm=n (con m,n∈{0,…,N−1}m,n\in\{0,\dots,N-1\}, z=1z=1) e 1−zN1−z=0\frac{1-z^N}{1-z}=0 altrimenti (perché zN=1z^N=1, z≠1z\ne1). Resta FT⋅N s(nT)=s(nT)FT\cdot N\,s(nT)=s(nT), essendo FT N=1FT\,N=1. ✓

Come si calcola con NumPy. np.fft.fft(s) calcola Xk=∑ns[n]e−i2πkn/NX_k=\sum_ns[n]e^{-i2\pi kn/N} (niente TT, niente 1N\frac1N). Quindi, con la convenzione del corso:

S(kF)=T⋅Xk=T⋅np.fft.fft(s)[k],Sh=F S(hF)=XhN.S(kF)=T\cdot X_k=T\cdot\texttt{np.fft.fft(s)}[k],\qquad S_h=F\,S(hF)=\frac{X_h}N .

I coefficienti ShS_h del §6.5. La trasformata ordinaria S(f)S(f) del segnale periodico è un treno di impulsi alle frequenze hFhF; l'area dell'impulso in hFhF è Sh=F S(hF)S_h=F\,S(hF) e si ha s(nT)=∑h=0N−1Sh ei2πhn/Ns(nT)=\sum_{h=0}^{N-1}S_h\,e^{i2\pi hn/N}: sono i coefficienti della serie di Fourier discreta (Sh=1Tp∑nT s(nT)e−i2πhn/N=1N∑ns(nT)e−i2πhn/NS_h=\frac1{T_p}\sum_nT\,s(nT)e^{-i2\pi hn/N}=\frac1N\sum_ns(nT)e^{-i2\pi hn/N}, valor medio S0S_0, ampiezza della componente a frequenza hFhF). Attenzione a una discrepanza del testo: la (6.21) scrive Sh=1N∑kT s(kT)e−i2πhk/NS_h=\frac1N\sum_{k}T\,s(kT)e^{-i2\pi hk/N} con un fattore TT in più. Nella derivazione si moltiplica per Fp=1NTF_p=\frac1{NT} che già contiene 1T\frac1T: Fp T s=sNF_p\,T\,s=\frac sN. Prova: per s(nT)≡1s(nT)\equiv1 l'impulso di S(f)S(f) in 00 deve avere area 11 (la trasformata del segnale costante è δFp(f)\delta_{F_p}(f), (6.14)) e la formula con la TT darebbe TT. Qui si usa la forma corretta Sh=F S(hF)=1N∑ns(nT)e−i2πhn/NS_h=F\,S(hF)=\frac1N\sum_n s(nT)e^{-i2\pi hn/N}, coerente con la (8.27) e con la (8.24).

Forma matriciale e forma unitaria. Con W=e−i2π/NW=e^{-i2\pi/N} (radice NN-esima dell'unità, WN=1W^N=1) si mettano i campioni in un vettore s=(s(0),…,s((N−1)T))T\mathbf s=(s(0),\dots,s((N-1)T))^T e i valori di SS in S\mathbf S. Allora

S=T W s,W=[Wkn]k,n=0N−1(matrice di Fourier),s=F WHS.\mathbf S=T\,\mathbf W\,\mathbf s,\qquad \mathbf W=[W^{kn}]_{k,n=0}^{N-1}\quad(\text{matrice di Fourier}),\qquad \mathbf s=F\,\mathbf W^H\mathbf S .

(WH\mathbf W^H è la trasposta coniugata, con elementi W−knW^{-kn}.) La matrice U=1NW\mathbf U=\frac1{\sqrt N}\mathbf W è unitaria: UHU=I\mathbf U^H\mathbf U=I (è proprio l'ortogonalità ∑ke−i2πk(m−n)/N=Nδmn\sum_ke^{-i2\pi k(m-n)/N}=N\delta_{mn}). Se si rinormalizzano i vettori, s^=T s\hat{\mathbf s}=\sqrt T\,\mathbf s e S^=F S\hat{\mathbf S}=\sqrt F\,\mathbf S, la trasformata diventa la rotazione S^=Us^\hat{\mathbf S}=\mathbf U\hat{\mathbf s} (infatti F T Ws=FT W s^=1NWs^\sqrt F\,T\,\mathbf W\mathbf s=\sqrt{FT}\,\mathbf W\,\hat{\mathbf s}=\frac1{\sqrt N}\mathbf W\hat{\mathbf s}). Una matrice unitaria conserva la norma: ∥S^∥=∥s^∥\|\hat{\mathbf S}\|=\|\hat{\mathbf s}\|, cioè il teorema di Parseval (si veda (d)).

(a) DFT a mano

N=4N=4, T=12T=\frac12, s=(1, 2, 0, −1)s=(1,\ 2,\ 0,\ -1)

Dati. Tp=NT=2T_p=NT=2, F=1Tp=12F=\frac1{T_p}=\frac12 Hz, Fp=NF=2F_p=NF=2 Hz. Le frequenze sono 0, 0,5, 1, 1,50,\ 0{,}5,\ 1,\ 1{,}5 Hz.

La matrice. W=e−i2π/4=e−iπ/2=−iW=e^{-i2\pi/4}=e^{-i\pi/2}=-i. Le potenze si ripetono con periodo 44: W0=1W^0=1, W1=−iW^1=-i, W2=−1W^2=-1, W3=iW^3=i, W4=1W^4=1. L'elemento (k,n)(k,n) è Wkn mod 4W^{kn\bmod4}:

W=(11111−i−1i1−11−11i−1−i).\mathbf W=\begin{pmatrix}1&1&1&1\\1&-i&-1&i\\1&-1&1&-1\\1&i&-1&-i\end{pmatrix}.

Il calcolo X=WsX=\mathbf W\mathbf s riga per riga (con s=(1,2,0,−1)T\mathbf s=(1,2,0,-1)^T):

  • X0=1+2+0−1=2X_0=1+2+0-1=2;
  • X1=1⋅1+(−i)⋅2+(−1)⋅0+i⋅(−1)=1−2i−i=1−3iX_1=1\cdot1+(-i)\cdot2+(-1)\cdot0+i\cdot(-1)=1-2i-i=1-3i;
  • X2=1−2+0+1=0X_2=1-2+0+1=0;
  • X3=1+i⋅2+(−1)⋅0+(−i)⋅(−1)=1+2i+i=1+3iX_3=1+i\cdot2+(-1)\cdot0+(-i)\cdot(-1)=1+2i+i=1+3i.

Perciò X=(2, 1−3i, 0, 1+3i)X=(2,\ 1-3i,\ 0,\ 1+3i) e, moltiplicando per T=12T=\frac12,

S(kF)=(1, 12−32i, 0, 12+32i).S(kF)=\left(1,\ \tfrac12-\tfrac32i,\ 0,\ \tfrac12+\tfrac32i\right).

Il segnale è reale, quindi XN−k=Xk‾X_{N-k}=\overline{X_k} (X3=X1‾X_3=\overline{X_1}) e X0X_0, X2X_2 sono reali: bastano X0,X1,X2X_0,X_1,X_2. S(0)=1S(0)=1 è l'area di un periodo: ∑nT s=12⋅2=1\sum_nT\,s=\frac12\cdot2=1 ✓.

Inversione, s(nT)=∑kF S(kF) ei2πkn/4s(nT)=\sum_kF\,S(kF)\,e^{i2\pi kn/4}, cioè s=14∑kXkikns=\frac14\sum_kX_ki^{kn} (perché FT=1N=14FT=\frac1N=\frac14). Per n=0n=0: 14(2+1−3i+0+1+3i)=44=1\frac14(2+1-3i+0+1+3i)=\frac44=1 ✓. Per n=1n=1 (i fattori sono ik=1,i,−1,−ii^k=1,i,-1,-i): 14[2+(1−3i)i+0+(1+3i)(−i)]=14[2+(i+3)+(−i+3)]=84=2\frac14[2+(1-3i)i+0+(1+3i)(-i)]=\frac14[2+(i+3)+(-i+3)]=\frac84=2 ✓. Anche n=2n=2 (i2k=1,−1,1,−1i^{2k}=1,-1,1,-1): 14[2−(1−3i)+0−(1+3i)]=04=0\frac14[2-(1-3i)+0-(1+3i)]=\frac04=0 ✓ e n=3n=3: −1-1 ✓.

Parseval. ∑T∣s∣2=12(1+4+0+1)=3\sum T|s|^2=\frac12(1+4+0+1)=3 e ∑F∣S∣2=12(1+52+0+52)=3\sum F|S|^2=\frac12\left(1+\frac52+0+\frac52\right)=3 ✓ (con ∣12−32i∣2=14+94=52\left|\frac12-\frac32i\right|^2=\frac14+\frac94=\frac52).

I coefficienti ShS_h =XhN=(12, 14−34i, 0, 14+34i)=\frac{X_h}N=\left(\frac12,\ \frac14-\frac34i,\ 0,\ \frac14+\frac34i\right): S0=12S_0=\frac12 è il valor medio 1+2+0−14\frac{1+2+0-1}4.

N=8N=8, T=18T=\frac18, s=(1,1,1,1,0,0,0,0)s=(1,1,1,1,0,0,0,0)

Dati. Tp=1T_p=1 s, F=1F=1 Hz, Fp=8F_p=8 Hz. Il segnale vale 11 per mezzo periodo e 00 per l'altro mezzo (un'onda quadra campionata).

Le potenze di W=e−i2π/8=e−iπ/4=1−i2W=e^{-i2\pi/8}=e^{-i\pi/4}=\frac{1-i}{\sqrt2}:

kk 00 11 22 33 44 55 66 77
WkW^k 11 1−i2\frac{1-i}{\sqrt2} −i-i −1−i2\frac{-1-i}{\sqrt2} −1-1 −1+i2\frac{-1+i}{\sqrt2} ii 1+i2\frac{1+i}{\sqrt2}

con 12=0,7071\frac1{\sqrt2}=0{,}7071.

Il calcolo. Solo n=0,…,3n=0,\dots,3 hanno s=1s=1, quindi Xk=1+Wk+W2k+W3kX_k=1+W^k+W^{2k}+W^{3k} (somma geometrica: 1−W4k1−Wk\frac{1-W^{4k}}{1-W^k} con W4k=(−1)kW^{4k}=(-1)^k, quindi Xk=0X_k=0 per kk pari non nullo e Xk=21−WkX_k=\frac2{1-W^k} per kk dispari).

  • X0=4X_0=4.
  • X1=1+(0,7071−0,7071i)+(−i)+(−0,7071−0,7071i)=1−2,4142 iX_1=1+(0{,}7071-0{,}7071i)+(-i)+(-0{,}7071-0{,}7071i)=1-2{,}4142\,i (dove 2,4142=1+22{,}4142=1+\sqrt2).
  • X2=1+(−i)+(−1)+(i)=0X_2=1+(-i)+(-1)+(i)=0, e anche X4=1−1+1−1=0X_4=1-1+1-1=0, X6=0X_6=0.
  • X3=1+W3+W6+W9=1+(−0,7071−0,7071i)+i+(0,7071−0,7071i)=1−0,4142 iX_3=1+W^3+W^6+W^9=1+(-0{,}7071-0{,}7071i)+i+(0{,}7071-0{,}7071i)=1-0{,}4142\,i (con W9=WW^9=W).
  • Per simmetria hermitiana: X5=X3‾=1+0,4142iX_5=\overline{X_3}=1+0{,}4142i, X7=X1‾=1+2,4142iX_7=\overline{X_1}=1+2{,}4142i.

Controllo. ∑∣Xk∣2=16+2⋅(1+5,8284)+2⋅(1+0,1716)=32=N∑∣s∣2=8⋅4\sum|X_k|^2=16+2\cdot(1+5{,}8284)+2\cdot(1+0{,}1716)=32=N\sum|s|^2=8\cdot4; nelle unità del corso ∑T∣s∣2=48=12\sum T|s|^2=\frac48=\frac12 e ∑F∣S∣2=3264=12\sum F|S|^2=\frac{32}{64}=\frac12 (S(kF)=Xk8S(kF)=\frac{X_k}8) ✓. 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. T=0,01T=0{,}01 s (Fp=100F_p=100 Hz), N=32N=32 campioni, quindi Tp=0,32T_p=0{,}32 s e F=1Tp=3,125F=\frac1{T_p}=3{,}125 Hz. Il segnale è s(nT)=cos⁡(2πf0nT)s(nT)=\cos(2\pi f_0nT), n=0,…,31n=0,\dots,31, in due casi:

  • caso A: f0=4F=12,5f_0=4F=12{,}5 Hz: nella finestra ci sono esattamente 44 periodi del coseno, il segnale è periodico di periodo NTNT (e la finestra è un periodo del segnale);
  • caso B: f0=4,5F=14,0625f_0=4{,}5F=14{,}0625 Hz: nella finestra ci sono 4,54{,}5 periodi. Il segnale discreto cos⁡(2πf0nT)\cos(2\pi f_0nT) è periodico di periodo 2NT2NT ma non di periodo NTNT: ripetere la finestra di 3232 campioni crea uno scalino tra l'ultimo campione e il successivo.

Caso A. Per Eulero s=12ei2π⋅4n/N+12e−i2π⋅4n/Ns=\frac12e^{i2\pi\cdot4n/N}+\frac12e^{-i2\pi\cdot4n/N}. Per l'ortogonalità (la somma geometrica di sopra) tutto si concentra in k=4k=4 e k=N−4=28k=N-4=28 (la frequenza −4F-4F ripiegata):

X4=X28=N2=16,Xk=0 altrove.X_4=X_{28}=\frac N2=16,\qquad X_k=0\ \text{altrove}.

Con la convenzione del corso S(4F)=S(28F)=TN2=0,16S(4F)=S(28F)=T\frac N2=0{,}16 (che è Tp2\frac{T_p}2), mentre i coefficienti sono S4=S28=X4N=12S_4=S_{28}=\frac{X_4}N=\frac12: i due coefficienti 12\frac12 del coseno (cos⁡=12e++12e−\cos=\frac12e^{+}+\frac12e^{-}), come nella serie di Fourier di un coseno continuo. Tutta la potenza (12\frac12, cioè 14+14\frac14+\frac14) è 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 f0=4,5Ff_0=4{,}5F non coincide con nessun bin (kk intero). La DFT assume che i 3232 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 ν=4,5\nu=4{,}5 nel mezzo dei bin 44 e 55: ognuno dei due esponenziali dà un contributo che, nel bin hh, ha modulo 12∣sin⁡π(h−ν)Nsin⁡(π(h−ν)/N)∣\frac12\left|\frac{\sin\pi(h-\nu)}{N\sin(\pi(h-\nu)/N)}\right| (è la funzione sinc⁡N\operatorname{sinc}_N della (6.16)), che per h−ν=±12h-\nu=\pm\frac12 vale circa 1π=0,318\frac1\pi=0{,}318 e non 12\frac12, e decade lentamente (come 1∣h−ν∣\frac1{|h-\nu|}) lontano. I numeri ottenuti con np.fft.fft:

hh 00 22 33 44 55 66 77 1616
∣Sh∣\lvert S_h\rvert 0,0310{,}031 0,0520{,}052 0,0940{,}094 0,3060{,}306 0,3310{,}331 0,1190{,}119 0,0760{,}076 0,0310{,}031

e la stessa cosa è simmetrica per h→N−hh\to N-h (segnale reale). Il massimo ∣Sh∣|S_h| è 0,3310{,}331 invece di 0,50{,}5 (ampiezza sottostimata di circa un terzo), e nei quattro bin centrali 4,5,27,284,5,27,28 c'è solo l'81,2%81{,}2\% della potenza (nel caso A il 100%100\%). La parte restante sbava su tutti i bin: è la perdita spettrale (leakage). La somma dei quadrati resta 12\frac12 (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 è F=1NTF=\frac1{NT}: la si migliora osservando più a lungo (più campioni a parità di TT), 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 x(t)x(t) continuo e periodico di periodo TpT_p, con serie di Fourier x(t)=∑h∈ZXh ei2πhFtx(t)=\sum_{h\in\mathbb Z}X_h\,e^{i2\pi hFt}, F=1TpF=\frac1{T_p} (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 T=TpNT=\frac{T_p}N (esattamente NN campioni per periodo): s(nT)=x(nT)=∑hXh ei2πhn/Ns(nT)=x(nT)=\sum_hX_h\,e^{i2\pi hn/N}, perché FnT=nNFnT=\frac nN. Gli esponenziali ei2πhn/Ne^{i2\pi hn/N} con hh che differisce per un multiplo di NN coincidono sui campioni (ei2πkNn/N=1e^{i2\pi kN n/N}=1). Si raggruppano gli indici h=r+kNh=r+kN, r=0,…,N−1r=0,\dots,N-1, k∈Zk\in\mathbb Z:

s(nT)=∑r=0N−1(∑k=−∞+∞Xr+kN)ei2πrn/N⟹Sr=∑k=−∞+∞Xr+kNs(nT)=\sum_{r=0}^{N-1}\left(\sum_{k=-\infty}^{+\infty}X_{r+kN}\right)e^{i2\pi rn/N}\qquad\Longrightarrow\qquad\boxed{S_r=\sum_{k=-\infty}^{+\infty}X_{r+kN}}

perché i coefficienti della rappresentazione di ss con NN esponenziali sono unici. I coefficienti della versione campionata (cioè XrDFTN\frac{X^{\text{DFT}}_r}N) sono la somma dei coefficienti del continuo a distanza NN: le armoniche alte del continuo si "ripiegano" sulle basse. È lo stesso fenomeno del Teorema 6.1, rep⁡Fp\operatorname{rep}_{F_p} di uno spettro a righe. Se xx ha banda limitata, Xh=0X_h=0 per ∣h∣≥N/2|h|\ge N/2, le righe non si sovrappongono e Sr=XrS_r=X_r per 0≤r<N/20\le r<N/2 (SN−r=X−rS_{N-r}=X_{-r}): nessun aliasing (è la condizione di Nyquist N>2hmax⁡N>2h_{\max}).

Esempio: onda quadra. x(t)=+1x(t)=+1 per ∣t∣<Tp4|t|<\frac{T_p}4 e −1-1 per Tp4<∣t∣≤Tp2\frac{T_p}4<|t|\le\frac{T_p}2, ripetuta con periodo TpT_p. Coefficienti: X0=0X_0=0 e, per h≠0h\ne0,

Xh=1Tp∫−Tp/4Tp/4e−i2πhFtdt−1Tp∫Tp/4<∣t∣<Tp/2e−i2πhFtdt=2sin⁡(πh/2)πh=sinc⁡(h2),X_h=\frac1{T_p}\int_{-T_p/4}^{T_p/4}e^{-i2\pi hFt}dt-\frac1{T_p}\int_{T_p/4<|t|<T_p/2}e^{-i2\pi hFt}dt=\frac{2\sin(\pi h/2)}{\pi h}=\operatorname{sinc}\left(\frac h2\right),

cioè X±1=2π=0,6366X_{\pm1}=\frac2\pi=0{,}6366, X±3=−23π=−0,2122X_{\pm3}=-\frac2{3\pi}=-0{,}2122, X±5=25πX_{\pm5}=\frac2{5\pi}, e Xh=0X_h=0 per hh pari. Decadono come 1h\frac1h (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 N=6N=6. I campioni cadono in t=n6Tpt=\frac{n}{6}T_p per n=0,…,5n=0,\dots,5 (cioè n=−2,…,3n=-2,\dots,3): i salti stanno in t=±Tp4=±1,5t=\pm\frac{T_p}4=\pm1{,}5 campioni, tra due campioni, quindi non si campiona mai su un salto. I valori sono s=(1, 1, −1, −1, −1, 1)s=(1,\ 1,\ -1,\ -1,\ -1,\ 1) (n=0n=0: t=0t=0; n=±1n=\pm1: Tp6<Tp4\frac{T_p}6<\frac{T_p}4, vale +1+1; n=±2n=\pm2 e n=3n=3: −1-1). Il segnale è pari, quindi la DFT è reale:

Sr=16[s0+2s1cos⁡2πr6+2s2cos⁡4πr6+s3cos⁡πr]=16[1+2cos⁡πr3−2cos⁡2πr3−(−1)r].S_r=\frac16\Bigl[s_0+2s_1\cos\tfrac{2\pi r}6+2s_2\cos\tfrac{4\pi r}6+s_3\cos\pi r\Bigr]=\frac16\Bigl[1+2\cos\tfrac{\pi r}3-2\cos\tfrac{2\pi r}3-(-1)^r\Bigr].

Valori: r=0r=0: 16(1+2−2−1)=0\frac16(1+2-2-1)=0; r=1r=1: 16(1+1+1+1)=23\frac16(1+1+1+1)=\frac23; r=2r=2: 16(1−1+1−1)=0\frac16(1-1+1-1)=0; r=3r=3: 16(1−2−2+1)=−13\frac16(1-2-2+1)=-\frac13; poi S4=S2=0S_4=S_2=0, S5=S1=23S_5=S_1=\frac23. Confronto con le armoniche del continuo:

X1X_1 (continuo) S1S_1 (campionato) X3X_3 S3S_3
valore 0,63660{,}6366 0,66670{,}6667 −0,2122-0{,}2122 −0,3333-0{,}3333

Non sono uguali: S1=X1+X−5+X7+X−11+X13+⋯=0,6366+0,1273−0,0909−0,0579+0,0490+…S_1=X_1+X_{-5}+X_7+X_{-11}+X_{13}+\dots=0{,}6366+0{,}1273-0{,}0909-0{,}0579+0{,}0490+\dots, e S3=X3+X−3+X9+X−9+⋯=−0,2122−0,2122+0,0707+0,0707−…S_3=X_3+X_{-3}+X_9+X_{-9}+\dots=-0{,}2122-0{,}2122+0{,}0707+0{,}0707-\dots. I termini decadono come 1h\frac1h e la serie converge lentamente: a 44 milioni di termini la somma è 0,666670{,}66667 per S1S_1 e −0,33333-0{,}33333 per S3S_3, 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 1N2\frac1{N^2} (le armoniche ripiegate partono da h=N±rh=N\pm r e i coefficienti scendono come 1h\frac1h):

NN 66 1010 1818 3434
S1S_1 0,666670{,}66667 0,647210{,}64721 0,639860{,}63986 0,637530{,}63753
S1−X1S_1-X_1 0,03000{,}0300 0,01060{,}0106 0,00320{,}0032 0,00090{,}0009

(per N≡2(mod4)N\equiv2\pmod4 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 ∑T∣s∣2=∑F∣S∣2\sum T|s|^2=\sum F|S|^2

Enunciato (8.29 per segnali discreti periodici, Tp=NTT_p=NT, F=1TpF=\frac1{T_p}):

∑n=0N−1T ∣s(nT)∣2=∑k=0N−1F ∣S(kF)∣2.\sum_{n=0}^{N-1}T\,|s(nT)|^2=\sum_{k=0}^{N-1}F\,|S(kF)|^2 .

Dimostrazione con la forma unitaria. Se s^=T s\hat{\mathbf s}=\sqrt T\,\mathbf s e S^=F S\hat{\mathbf S}=\sqrt F\,\mathbf S, allora S^=Us^\hat{\mathbf S}=\mathbf U\hat{\mathbf s} con U\mathbf U unitaria, quindi ∥S^∥2=s^HUHUs^=∥s^∥2\|\hat{\mathbf S}\|^2=\hat{\mathbf s}^H\mathbf U^H\mathbf U\hat{\mathbf s}=\|\hat{\mathbf s}\|^2. I due membri sono proprio ∥s^∥2\|\hat{\mathbf s}\|^2 e ∥S^∥2\|\hat{\mathbf S}\|^2. In termini di XX: ∑∣Xk∣2=N∑∣s∣2\sum|X_k|^2=N\sum|s|^2.

In termini di coefficienti. Con S(kF)=T N SkS(kF)=T\,N\,S_k si ha F∣S(kF)∣2=1NTT2N2∣Sk∣2=TN∣Sk∣2=Tp∣Sk∣2F|S(kF)|^2=\frac1{NT}T^2N^2|S_k|^2=TN|S_k|^2=T_p|S_k|^2. Dividendo per TpT_p: la potenza P=1Tp∑nT∣s∣2=1N∑n∣s∣2P=\frac1{T_p}\sum_nT|s|^2=\frac1N\sum_n|s|^2 è ∑k∣Sk∣2\sum_k|S_k|^2 (Parseval della serie di Fourier, P=∑∣Sk∣2P=\sum|S_k|^2).

Verifiche sugli esempi precedenti.

  • N=4N=4, T=12T=\frac12: ∑T∣s∣2=3\sum T|s|^2=3 e ∑F∣S∣2=3\sum F|S|^2=3. In potenza: P=3Tp=1,5P=\frac3{T_p}=1{,}5 e ∑∣Sh∣2=14+58+0+58=1,5\sum|S_h|^2=\frac14+\frac58+0+\frac58=1{,}5 ✓ (con ∣S1∣2=116+916=58|S_1|^2=\frac1{16}+\frac9{16}=\frac58).
  • N=8N=8: 12=12\frac12=\frac12 (visto sopra).
  • Coseno, caso A: ∑T∣s∣2=TN2=0,16\sum T|s|^2=T\frac N2=0{,}16 e ∑F∣S∣2=2⋅F⋅0,162=2⋅3,125⋅0,0256=0,16\sum F|S|^2=2\cdot F\cdot0{,}16^2=2\cdot3{,}125\cdot0{,}0256=0{,}16 ✓; P=0,160,32=12=(12)2+(12)2P=\frac{0{,}16}{0{,}32}=\frac12=\left(\frac12\right)^2+\left(\frac12\right)^2. Caso B: stessa energia 0,160{,}16 (calcolata in entrambi i modi), anche se distribuita su tutti i bin.
  • Onda quadra, N=6N=6: P=16∑1=1=49+19+49P=\frac16\sum1=1=\frac49+\frac19+\frac49 ✓. Il continuo ha la stessa potenza (P=1=∑∣Xh∣2P=1=\sum|X_h|^2): 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 s2s_2 (per esempio i tre campioni A0A_0 in n=−1,0,1n=-1,0,1 dell'Es. 6.3A, S2(f)=A0T[1+2cos⁡(2πfT)]S_2(f)=A_0T[1+2\cos(2\pi fT)]) si estende per L≤NL\le N campioni, lo si "periodicizza" con periodo NTNT (aggiungendo N−LN-L zeri, zero padding) e si calcola la DFT: S(kF)=∑nT s(nT)e−i2πkn/NS(kF)=\sum_{n}T\,s(nT)e^{-i2\pi kn/N} è esattamente la somma che definisce la trasformata S2(f)S_2(f) valutata in f=kFf=kF, perché per f=kFf=kF si ha e−i2πfnT=e−i2πkn/Ne^{-i2\pi fnT}=e^{-i2\pi kn/N}. Quindi la DFT dà i campioni della trasformata aperiodica nei punti kF=kNTkF=\frac k{NT}, e aumentare NN con zeri infittisce i punti. (Per i campioni in n=−1,0,1n=-1,0,1 basta ricordare che l'indice n=−1n=-1 equivale a n=N−1n=N-1 per la periodicità.) Lo si vede nel Controllo con N=8N=8 e N=32N=32.

Controllo

python
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) X=(2, 1−3i, 0, 1+3i)X=(2,\,1-3i,\,0,\,1+3i), S(kF)=(1, 0,5−1,5i, 0, 0,5+1,5i)S(kF)=(1,\,0{,}5-1{,}5i,\,0,\,0{,}5+1{,}5i), inversa e Parseval vere (3=33=3), U\mathbf U unitaria; per N=8N=8, X=(4, 1−2,4142i, 0, 1−0,4142i, 0, 1+0,4142i, 0, 1+2,4142i)X=(4,\,1-2{,}4142i,\,0,\,1-0{,}4142i,\,0,\,1+0{,}4142i,\,0,\,1+2{,}4142i) e ∑∣X∣2=32\sum|X|^2=32. (b) caso A: massimo ∣Sh∣=0,5|S_h|=0{,}5, ∣S(kF)∣=0,16|S(kF)|=0{,}16, 100%100\% della potenza nei bin 44 e 2828; caso B: massimo 0,33110{,}3311, ∣S(kF)∣≤0,106|S(kF)|\le0{,}106, 81,2%81{,}2\% nei quattro bin centrali; Parseval 0,16=0,160{,}16=0{,}16 in entrambi. (c) S1=0,66667, 0,64721, 0,63986, 0,63753S_1=0{,}66667,\ 0{,}64721,\ 0{,}63986,\ 0{,}63753 e S3=−0,33333, −0,24721, −0,22222, −0,21495S_3=-0{,}33333,\ -0{,}24721,\ -0{,}22222,\ -0{,}21495 per N=6,10,18,34N=6,10,18,34, uguali alle somme di aliasing; potenza 11. (e) la DFT coincide con S2(kF)S_2(kF) per N=8N=8 e N=32N=32.

Errori comuni

  • Scambiare la DFT di NumPy con quella del corso: manca il fattore TT (S(kF)=T fftS(kF)=T\,\texttt{fft}) e, per i coefficienti, il fattore 1N\frac1N (Sh=fft/NS_h=\texttt{fft}/N).
  • Dimenticare che F=1NTF=\frac1{NT} dipende dalla durata della finestra, non dalla velocità: aumentare NN a parità di TT migliora la risoluzione.
  • Credere che i coefficienti della versione campionata di un segnale continuo siano uguali a quelli del continuo: sono la somma ∑kXr+kN\sum_kX_{r+kN} (aliasing).
  • Concludere che un coseno a frequenza non multipla di FF "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 kk (k>N/2k>N/2) rappresenta le frequenze negative: XN−k=Xk‾X_{N-k}=\overline{X_k} per segnali reali.

Versione ripasso

Testo. Segnale periodico Tp=NTT_p=NT: DFT a mano (N=4N=4, N=8N=8), 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: F=1NTF=\frac1{NT}, FT=1NFT=\frac1N, S(kF)=∑n=0N−1T s(nT)e−i2πkn/N=T⋅fftS(kF)=\sum_{n=0}^{N-1}T\,s(nT)e^{-i2\pi kn/N}=T\cdot\texttt{fft}, s(nT)=∑kF S(kF)ei2πkn/Ns(nT)=\sum_kF\,S(kF)e^{i2\pi kn/N}; NN-periodica; Sh=F S(hF)=fft/NS_h=F\,S(hF)=\texttt{fft}/N (il TT di (6.21) è di troppo). Matrice [Wkn][W^{kn}], W=e−i2π/NW=e^{-i2\pi/N}; 1N[Wkn]\frac1{\sqrt N}[W^{kn}] unitaria con s^=T s\hat s=\sqrt T\,s, S^=F S\hat S=\sqrt F\,S.
  • (a) N=4N=4, T=12T=\frac12, s=(1,2,0,−1)s=(1,2,0,-1): X=(2,1−3i,0,1+3i)X=(2,1-3i,0,1+3i), S(kF)=X2S(kF)=\frac X2. N=8N=8, s=(1,1,1,1,0,0,0,0)s=(1,1,1,1,0,0,0,0): X1=1−2,414iX_1=1-2{,}414i, X3=1−0,414iX_3=1-0{,}414i, pari nulli.
  • (b) coseno a 4F4F (N=32N=32): due righe Sh=12S_h=\frac12; a 4,5F4{,}5F: leakage, picco 0,330{,}33, 81%81\% della potenza nei 4 bin centrali.
  • (c) campionando x(t)=∑Xhei2πhFtx(t)=\sum X_he^{i2\pi hFt} con NN campioni per periodo: Sr=∑kXr+kNS_r=\sum_kX_{r+kN} (aliasing). Onda quadra, N=6N=6: S1=23S_1=\frac23 contro X1=2πX_1=\frac2\pi; l'errore va come 1N2\frac1{N^2}.
  • (d) ∑T∣s∣2=∑F∣S∣2\sum T|s|^2=\sum F|S|^2 (unitarietà), cioè P=∑∣Sh∣2P=\sum|S_h|^2.
  • Errori: TT e 1N\frac1N dimenticati rispetto a fft; coefficienti del campionato == quelli del continuo; k>N/2k>N/2 sono frequenze negative.

Teoria collegata