Un grafico più fitto non contiene nuove misure
Un sensore registra vibrazioni per un decimo di secondo. Nel grafico vediamo un picco largo e vorremmo distinguere due oscillazioni vicine. Aggiungiamo zeri al segnale prima della trasformata: il grafico diventa liscio e mostra molti più punti. Abbiamo aumentato davvero la capacità di separare le frequenze? La domanda riguarda l’informazione osservata, non la qualità estetica del disegno. Costruiamo due toni sintetici a 100 e 103 hertz e confrontiamo aggiunta di zeri e acquisizione più lunga.
Prima distinguiamo tre quantità
La frequenza di campionamento f_s=1000 Hz significa mille misure al secondo; N=100 campioni corrispondono a una finestra T=N/f_s=0,1 s. Le due sinusoidi hanno ampiezza uno in unità arbitrarie, nessun rumore e fase iniziale zero. La trasformata discreta di Fourier, DFT, confronta questi campioni con oscillazioni complesse. FFT è un algoritmo per calcolarla, non una nuova sorgente di misure. Separiamo frequenza di campionamento, durata osservata e distanza tra i punti del grafico.
Se calcoliamo N punti di DFT, le frequenze sono k f_s/N. Il passo vale 10 Hz: nessun punto cade a 103 Hz. Una componente fra due punti può apparire con ampiezza inferiore e distribuita su punti vicini. Questo fenomeno non autorizza a interpretare il massimo campionato come l’unica frequenza presente. Per capire che cosa fa il padding, scriviamo la stessa somma anche per una frequenza f non vincolata alla griglia.
Aggiungere zeri cambia dove valutiamo la somma
Appendiamo zeri fino a M=1600 campioni, senza modificare i primi cento. I termini aggiunti alla somma sono zero: X(f) resta la stessa funzione del segnale osservato. Cambiano i punti f=k f_s/M, ora distanti 0,625 Hz. Non abbiamo osservato altri 1,5 secondi di vibrazione; abbiamo scelto più frequenze a cui valutare i cento campioni originali. Questa distinzione vale anche se il software chiama il risultato “risoluzione FFT”.
Lo script verifica un’identità utile: con M=16N, un punto ogni sedici della DFT lunga coincide, entro la tolleranza numerica dichiarata, con la DFT originale. È lo stesso spettro campionato più densamente. Il padding può quindi migliorare la lettura del massimo di una componente già distinguibile e ridurre l’errore della griglia; non aggiunge equazioni indipendenti sul segnale sconosciuto. Il beneficio pratico dell’interpolazione non va confuso con nuove informazioni.
La finestra osservata determina la larghezza del lobo
Per un’esponenziale complessa isolata di frequenza f_0, la finestra rettangolare di N campioni genera una somma geometrica. Il suo modulo è |sin(πNδ/f_s)/sin(πδ/f_s)|, con δ=f−f_0, e limite N per δ=0. I primi zeri vicini al centro sono a δ=±f_s/N: il lobo principale ha larghezza fra gli zeri 2f_s/N. Sono proprietà della finestra, non del numero M di punti usati per disegnarla. Per una sinusoide reale esiste anche la componente a frequenza negativa.
Con T=0,1 s i primi zeri distano 10 Hz dal centro, mentre i toni distano solo 3 Hz. Aumentando M non stringiamo quei lobi. Acquisendo invece N=1000 campioni allo stesso f_s osserviamo un secondo: i primi zeri scendono a 1 Hz. Il confronto ora cambia davvero i dati disponibili. Il grafico sovrappone il segnale breve con padding e quello lungo con padding; la normalizzazione usa sempre i campioni realmente osservati, non M, per non abbassare artificialmente le ampiezze.
| N | M | T (s) | Passo (Hz) |
|---|---|---|---|
| 100 | 100 | 0.1 | 10 |
| 100 | 1600 | 0.1 | 0.625 |
| 1000 | 16000 | 1 | 0.0625 |

Che cosa non dimostra questo confronto
La larghezza del lobo non è una barriera universale per ogni stimatore: metodi parametrici con ipotesi forti possono stimare frequenze più vicine, ma rumore, ordine del modello e identificabilità diventano decisivi. Qui confrontiamo soltanto DFT di segnali deterministici, non un algoritmo di super-risoluzione. Anche scegliere una finestra diversa cambia il compromesso fra larghezza del lobo e lobi laterali. Un picco separato non certifica da solo due guasti o due sorgenti fisiche.
Il codice usa NumPy 2.5.3, salva campioni spettrali e versioni e non misura dispositivi. Una FFT più lunga richiede più lavoro e memoria; il padding non è gratuito, mentre attendere più dati introduce una latenza di acquisizione diversa dalla latenza di calcolo. La conclusione operativa è scegliere prima quanto tempo possiamo osservare e quale dettaglio dobbiamo distinguere. Gli zeri rendono più leggibile ciò che abbiamo già visto; non prolungano il tempo in cui abbiamo guardato.
SciPy 1.18.0 — Spectral analysis and zero-padding.
import numpy as np
import json,sys
from pathlib import Path
fs=1000.;runs=[]
for n in [100,1000]:
t=np.arange(n)/fs;x=np.cos(2*np.pi*100*t)+np.cos(2*np.pi*103*t)
small=np.fft.rfft(x);m=16*n;large=np.fft.rfft(x,n=m)
assert np.allclose(large[::16],small,rtol=1e-12,atol=1e-10)
f=np.fft.rfftfreq(m,1/fs);sel=(f>=80)&(f<=125)
runs.append(dict(n=n,padded=m,duration=n/fs,spacing=fs/n,paddedSpacing=fs/m,frequency=f[sel].tolist(),amplitude=(2*np.abs(large[sel])/n).tolist()))
r=dict(python=sys.version.split()[0],numpy=np.__version__,seed=None,scope='Synthetic two-tone signals, not sensor or hardware measurements',fsHz=fs,tonesHz=[100,103],runs=runs)
Path(__file__).with_name('results.json').write_text(json.dumps(r,indent=2),encoding='utf8')
Codice, dati e istruzioni · JSON. Calcoli didattici eseguiti con Python 3.14.0; figure con Matplotlib 3.11.2. Analisi con assistenza AI, senza dichiarare peer review o revisione umana. Copertina originale ImageGen, illustrativa: non documenta persone, sedi o installazioni EL-AI. Fonti consultate il 25 ottobre 2026.

