Salta al contenuto
Note per Studenti FFT e zero-padding - TF, TFtd e asse delle pulsazioni

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 x(t)x(t) un segnale continuo, nullo fuori da un intervallo [t0,t0+Tobs][t_0,t_0+T_{obs}] (o trascurabile fuori), campionato con passo TcT_c negli istanti tn=t0+nTct_n=t_0+nT_c, n=0,…,N−1n=0,\ldots,N-1, con campioni xnx_n. Si approssima l'integrale della TF con la somma rettangolare: X(ω)=∫x(t)e−jωtdt≈Tc∑n=0N−1xn e−jωtn=Tc e−jωt0∑n=0N−1xn e−jωnTc.X(\omega)=\int x(t)e^{-j\omega t}dt\approx T_c\sum_{n=0}^{N-1}x_n\,e^{-j\omega t_n}=T_c\,e^{-j\omega t_0}\sum_{n=0}^{N-1}x_n\,e^{-j\omega nT_c}. L'ultima somma è la TFtd della sequenza dei campioni calcolata in θ=ωTc\theta=\omega T_c (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) →): X^(θ)=∑xne−jθn\hat X(\theta)=\sum x_ne^{-j\theta n}. Quindi X(ω)≈Tc e−jωt0 X^(ωTc)\boxed{X(\omega)\approx T_c\,e^{-j\omega t_0}\,\hat X(\omega T_c)} La somma è anche il campionamento di XX 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 XX riscalata: X^(θ)=1Tc∑kX(θ+2πkTc)\hat X(\theta)=\frac1{T_c}\sum_kX\left(\frac{\theta+2\pi k}{T_c}\right)), quindi l'approssimazione è buona se l'aliasing è trascurabile (lo spettro è piccolo oltre πTc\frac\pi{T_c}) 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 MM punti del vettore completato con M−NM-N zeri. Con la convenzione della libreria, senza il fattore 1M\frac1M: fft(x,M)[k]=∑n=0N−1xn e−j2πMkn=X^(2πkM),k=0,…,M−1.\mathtt{fft}(x,M)[k]=\sum_{n=0}^{N-1}x_n\,e^{-j\frac{2\pi}{M}kn}=\hat X\left(\frac{2\pi k}M\right),\qquad k=0,\ldots,M-1. Sono MM campioni equispaziati della TFtd X^(θ)\hat X(\theta) nel periodo [0,2π)[0,2\pi), ai valori θk=2πkM\theta_k=\frac{2\pi k}M. Con θ=ωTc\theta=\omega T_c (ωk=θkTc\omega_k=\frac{\theta_k}{T_c}) si ottengono le pulsazioni:

ωk=2πkM Tc,fk=kM Tc,X(ωk)≈Tc e−jωkt0 fft(x,M)[k].\omega_k=\frac{2\pi k}{M\,T_c},\qquad f_k=\frac{k}{M\,T_c},\qquad X(\omega_k)\approx T_c\,e^{-j\omega_kt_0}\,\mathtt{fft}(x,M)[k].

Il passo in pulsazione è Δω=2πMTc\Delta\omega=\frac{2\pi}{MT_c} e il massimo valore rappresentabile è ωc2=πTc\frac{\omega_c}2=\frac\pi{T_c} (metà della pulsazione di campionamento ωc=2πTc\omega_c=\frac{2\pi}{T_c}): oltre c'è aliasing.

Frequenze negative. Gli indici k>M/2k>M/2 corrispondono, per periodicità, a pulsazioni negative: ωk≡ωk−2πTc\omega_k\equiv\omega_k-\frac{2\pi}{T_c}. Per avere l'asse centrato in zero si riordina con fftshift e si costruisce l'asse da −πTc-\frac\pi{T_c} a πTc−Δω\frac\pi{T_c}-\Delta\omega:

python
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 è ⌈log⁡2N⌉\lceil\log_2N\rceil: nextpow2 = lambda N: int(np.ceil(np.log2(N))).

Fattore di fase. Se l'asse dei tempi parte da t0≠0t_0\ne0 lo spettro calcolato dalla FFT è quello del segnale traslato a partire da 00: il modulo ∣X∣|X| è identico (un ritardo non lo cambia) e la fase differisce per e−jωt0e^{-j\omega t_0}. Nei temi d'esame si traccia quasi sempre il solo ∣X∣|X|, quindi non serve.

Se serve una frequenza in Hz (e non una pulsazione): fk=kMTcf_k=\frac{k}{MT_c} con f∈[−Fc2,Fc2)f\in\left[-\frac{F_c}2,\frac{F_c}2\right), Fc=1TcF_c=\frac1{T_c} (tema d'esame febbraio 2024: "attenzione, le ascisse sono frequenze, non pulsazioni").

Esempio: impulso modulato con la FFT

Segnale x(t)=Acos⁡(ω0t)rect⁡(t−T2T)x(t)=A\cos(\omega_0t)\operatorname{rect}\left(\frac{t-T}{2T}\right) con A=2A=2, T=10T=10, ω0=3\omega_0=3 (cioè un coseno di durata 2020 s tra 00 e 2020), calcolato in (−2,30)(-2,30) con Tc=10−3T_c=10^{-3} (tema d'esame gennaio 2025). Teoricamente x=Acos⁡(ω0t)w(t)x=A\cos(\omega_0t)w(t) con w=rect⁡(t−T2T)w=\operatorname{rect}\left(\frac{t-T}{2T}\right), W(ω)=2Tsinc⁡(ωTπ)e−jωTW(\omega)=2T\operatorname{sinc}\left(\frac{\omega T}\pi\right)e^{-j\omega T} e X(ω)=A2[W(ω−ω0)+W(ω+ω0)],X(\omega)=\frac A2\left[W(\omega-\omega_0)+W(\omega+\omega_0)\right], con un picco di modulo ≈A2⋅2T=AT=20\approx\frac A2\cdot2T=AT=20 in ω=±3\omega=\pm3 (le due copie sono ben separate).

python
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 (N=32001N=32001, M=262144M=262144): il picco di ∣X∣|X| vale 20,0820{,}08 in ω=2,996\omega=2{,}996, e in tre punti prossimi al picco la FFT e la formula esatta danno ∣X(2,5)∣=3,345|X(2{,}5)|=3{,}345 contro 3,3453{,}345, ∣X(3)∣=20,080|X(3)|=20{,}080 contro 20,08020{,}080, ∣X(3,5)∣=4,091|X(3{,}5)|=4{,}091 contro 4,0914{,}091 (ottimo accordo).

Esempio: confronto con lo spettro teorico

x(t)=2e−3tu(t)x(t)=2e^{-3t}u(t) osservato in [0,20][0,20] con Tc=10−3T_c=10^{-3} (tema d'esame febbraio 2026). Teoria: X(ω)=23+jωX(\omega)=\frac{2}{3+j\omega}. Il segnale non è a banda limitata, ma decade come 1∣ω∣\frac1{|\omega|} e πTc≈3142≫3\frac{\pi}{T_c}\approx3142\gg3:

python
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 ∣ω∣<20|\omega|<20 l'errore massimo ∣XFFT−Xesatta∣|X_{\text{FFT}}-X_{\text{esatta}}| è 1,0⋅10−31{,}0\cdot10^{-3}, contro un picco ∣X(0)∣=23|X(0)|=\frac23: errore relativo 0,15%0{,}15\%. La parte principale è dovuta al valore x(0)=2x(0)=2 del primo campione: con la convenzione dell'emivalore il primo campione dovrebbe pesare 12\frac12 (errore ≈Tc2⋅2=10−3\approx\frac{T_c}{2}\cdot2=10^{-3}, esattamente lo scarto trovato). L'aliasing contribuisce molto meno (≈26283\approx\frac{2}{6283} per la prima replica a ω=0\omega=0, 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 NN a M>NM>N punti aggiungendo M−NM-N zeri in coda. Poiché il segnale è nullo comunque fuori da [t0,t0+Tobs][t_0,t_0+T_{obs}], la TFtd X^(θ)\hat X(\theta) non cambia: cambia solo il numero di punti MM in cui viene campionata, con passo 2πM\frac{2\pi}M. 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 xx a supporto in {0,…,N−1}\{0,\ldots,N-1\}, la TFD della ripetizione periodica di periodo M≥NM\ge N vale 1MX^(2πkM)\frac1M\hat X\left(\frac{2\pi k}M\right), quindi scegliendo MM grande a piacere la risoluzione con cui si "disegna" X^\hat X è arbitrariamente fine (tema d'esame ricorrente: mostrare che con la TFD e lo zero-padding si ottiene una rappresentazione di X^\hat X con risoluzione arbitrariamente fine).

  • Serve a: disegnare una curva liscia (senza lo zero-padding M=NM=N 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 Tobs=NTcT_{obs}=NT_c: due sinusoidi a distanza Δf\Delta f si separano solo se Δf≳1Tobs\Delta f\gtrsim\frac1{T_{obs}}, perché il segnale è moltiplicato per una finestra rettangolare lunga TobsT_{obs}, che nello spettro è un sinc con lobo principale largo ∼2Tobs\sim\frac{2}{T_{obs}} Hz.

Verifica numerica. Due coseni a 1010 Hz e 10,510{,}5 Hz (Δf=0,5\Delta f=0{,}5 Hz), Tc=10−3T_c=10^{-3}:

TobsT_{obs} 1Tobs\frac1{T_{obs}} picchi trovati (con M=220M=2^{20})
11 s 11 Hz uno solo, a ≈10,26\approx10{,}26 Hz (le due righe sono fuse)
22 s 0,50{,}5 Hz due, a ≈9,9\approx9{,}9 e 10,610{,}6 Hz
44 s 0,250{,}25 Hz due, a ≈10,0\approx10{,}0 e 10,510{,}5 Hz

Con Tobs=1T_{obs}=1 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 ∣X(ω)∣|X(\omega)| è 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, ∣fft(x,M)[k]∣=∣fft(x,M)[M−k]∣|\mathtt{fft}(x,M)[k]|=|\mathtt{fft}(x,M)[M-k]| per k=1,…,M−1k=1,\ldots,M-1 (indici da 00). In Matlab (indici da 11): ∣X(k)∣=∣X(M−k+2)∣|X(k)|=|X(M-k+2)|. Esempio d'esame (febbraio 2023): "se il massimo di ∣X∣|X| è nel 350-esimo campione, dove ci si aspetta un altro picco?". Risposta: nel campione M−350+2=M−348M-350+2=M-348 (accettata anche M−350M-350), perché l'indice kk (da 1) corrisponde a ω=(k−1)2πMTc\omega=(k-1)\frac{2\pi}{MT_c} e −ω≡ωc−ω-\omega\equiv\omega_c-\omega è l'indice M−k+2M-k+2. Con indici da 00 (Python) la corrispondenza è p↔M−pp\leftrightarrow M-p (verificata numericamente per un segnale reale casuale con p=350p=350, M=4096M=4096).

Dall'antitrasformata: da XX a xx

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 X(ω)X(\omega) sulle pulsazioni ω0⋅(−N2:N2−1)\omega_0\cdot(-\frac N2:\frac N2-1) (con NN pari), il passo temporale è Tc=2πNω0T_c=\frac{2\pi}{N\omega_0} 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 →\to fftshift →\to ifftshift →\to ifft restituisce esattamente il segnale (True, con N=2000N=2000).

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 x(t)=∑krect⁡(t−kTT/2)x(t)=\sum_k\operatorname{rect}\left(\frac{t-kT}{T/2}\right) (con T=1T=1) in (−12,12)\left(-\frac12,\frac12\right), dove coincide con rect⁡(2t)\operatorname{rect}(2t), e la somma parziale xM(t)=12+2π∑m=0M−1(−1)m2m+1cos⁡[(2m+1)ω0t]x_M(t)=\frac12+\frac2\pi\sum_{m=0}^{M-1}\frac{(-1)^m}{2m+1}\cos\left[(2m+1)\omega_0t\right] con un ciclo for che aggiunge una armonica per volta, inizializzando xMx_M alla costante 12\frac12. 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 ak=sin⁡(kπ/2)kπa_k=\frac{\sin(k\pi/2)}{k\pi} (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 FsF_s (Ts=1FsT_s=\frac1{F_s}): zero-padding M=2nextpow2(N)+2M=2^{\text{nextpow2}(N)+2} (cioè M≥4NM\ge4N), Y = Ts*fft(y, M), asse delle frequenze positive F = np.arange(M//2)*Fs/M (passo FsM\frac{F_s}{M}, fino a Fs2\frac{F_s}2), grafico di ∣Y(ω)∣|Y(\omega)| in funzione di ω=2πf\omega=2\pi f, di ∣Y(f)∣|Y(f)| e in scala logaritmica (10log⁡10∣Y∣10\log_{10}|Y| o semilogy), e frequenza principale F[np.argmax(np.abs(Y[:M//2]))] in Hz. Prova su un tono sintetico (440,3440{,}3 Hz con smorzamento e rumore, Fs=8192F_s=8192 Hz, 2 s, M=65536M=65536): il massimo cade a 440,25440{,}25 Hz, entro il passo di griglia FsM=0,125\frac{F_s}M=0{,}125 Hz.

3. Stima della frequenza di un esponenziale complesso e risoluzione (prova del 2026). Si genera x(n)=ej2πνnx(n)=e^{j2\pi\nu n} con ν=0,1234567\nu=0{,}1234567, N=64N=64 campioni, si calcola fft(x, M) con zero-padding e si stima ν\nu con l'indice del massimo, ν^=kmax⁡M\hat\nu=\frac{k_{\max}}M. Per un segnale complesso lo spettro non è pari e va guardato l'intero intervallo (−12,12)\left(-\frac12,\frac12\right) (con fftshift). L'errore è al più mezzo passo di griglia, 12M\frac1{2M}: con M=2048M=2048 si trova ν^=0,123535\hat\nu=0{,}123535 (errore 7,8⋅10−5≤2,4⋅10−47{,}8\cdot10^{-5}\le2{,}4\cdot10^{-4}); con M=N=64M=N=64 solo ν^=0,125\hat\nu=0{,}125 (errore 1,5⋅10−3≤7,8⋅10−31{,}5\cdot10^{-3}\le7{,}8\cdot10^{-3}); con M=16384M=16384 l'errore scende a 1,7⋅10−51{,}7\cdot10^{-5}: 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 ν+Δν\nu+\Delta\nu con Δν=0,015\Delta\nu=0{,}015 e ampiezza 12\frac12 e ci si chiede con quanti campioni N1N_1 si distinguono i due picchi: la finestra rettangolare ha lobo principale con zeri a ±1N\pm\frac1{N}, quindi serve circa Δν≳1N1\Delta\nu\gtrsim\frac1{N_1} (criterio di Rayleigh, N1≳67N_1\gtrsim67); la soluzione del corso è più prudente (2N1<Δν\frac2{N_1}<\Delta\nu, N1>134N_1>134). Numericamente: con N1=32N_1=32 si vede un picco, con N1≥48N_1\ge48 due (M=214M=2^{14}, soglia 0,350{,}35 del massimo). Lo zero-padding, anche enorme, non separa i picchi se N1N_1 è troppo piccolo: conta la durata osservata.

Procedura per l'esame

  1. Definisci Tc, l'asse t, il segnale x (con rect = lambda t: abs(t)<0.5).
  2. N = len(t); M = 2**(nextpow2(N)+3) (potenza di due, almeno 8N8N; l'esame accetta 2N2N–4N4N o "opportuno").
  3. X = Tc*fft(x, M) (il fattore TcT_c è essenziale per un segnale continuo).
  4. Asse: w = 2*pi*(0:M-1)/(M*Tc) oppure, con fftshift, da −π/Tc-\pi/T_c a π/Tc\pi/T_c con passo 2πMTc\frac{2\pi}{MT_c}. Etichetta in rad/s (o in Hz dividendo per 2π2\pi).
  5. Grafico del modulo abs(X) e limiti d'asse con xlim.

Errori comuni

Versione ripasso

Esercizi su questo argomento

Teoria collegata