Calcolatore per Elaborazione Numerica dei Segnali
Inserisci i parametri del segnale per analisi numerica, visualizzazione e calcoli avanzati
Guida Completa all’Elaborazione Numerica dei Segnali: Teoria, Esercizi e Esempi Pratici
L’elaborazione numerica dei segnali (Digital Signal Processing, DSP) è una disciplina fondamentale nell’ingegneria elettronica e informatica che si occupa dell’analisi, modificazione e sintesi di segnali nel dominio digitale. Questo campo trova applicazione in numerosi settori, dall’audio digitale alle telecomunicazioni, dall’imaging medico alla robotica.
Fondamenti Teorici
I principi base del DSP includono:
- Campionamento: Conversione di un segnale continuo nel tempo in una sequenza discreta (teorema del campionamento di Nyquist-Shannon)
- Quantizzazione: Rappresentazione dei campioni con un numero finito di bit
- Trasformate: FFT (Fast Fourier Transform) per l’analisi in frequenza
- Filtraggio digitale: FIR (Finite Impulse Response) e IIR (Infinite Impulse Response)
- Convoluzione: Operazione fondamentale per la risposta all’impulso dei sistemi
Applicazioni Pratiche
Alcune applicazioni concrete del DSP includono:
- Elaborazione audio: Compressione (MP3, AAC), equalizzatori, effetti sonori
- Telecomunicazioni: Modulazione/demodulazione, correzione errori, 5G
- Imaging medico: Risonanza magnetica, TAC, ecografie
- Radar e sonar: Rilevamento oggetti, analisi Doppler
- Controllo industriale: Robotica, automazione, sensori intelligenti
Esempi di Calcolo con MATLAB/Python
Ecco un esempio pratico di analisi FFT in Python:
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft
# Parametri del segnale
fs = 44100 # Frequenza di campionamento
T = 1/fs # Periodo di campionamento
t = np.arange(0, 1, T) # Vettore tempo (1 secondo)
f = 440 # Frequenza del segnale (440 Hz)
# Generazione segnale sinusoidale
signal = 0.5 * np.sin(2 * np.pi * f * t)
# Calcolo FFT
n = len(signal)
freq = np.fft.fftfreq(n, T)
fft_result = fft(signal)
# Visualizzazione
plt.figure(figsize=(10, 4))
plt.plot(freq[:n//2], np.abs(fft_result[:n//2]))
plt.title("Spettro di Frequenza")
plt.xlabel("Frequenza (Hz)")
plt.ylabel("Ampiezza")
plt.grid()
plt.show()
Confronto tra Metodi di Filtraggio
| Caratteristica | Filtro FIR | Filtro IIR |
|---|---|---|
| Stabilità | Sempre stabile | Può essere instabile |
| Risposta in fase | Lineare (nessuna distorsione) | Non lineare |
| Complessità computazionale | Maggiore (più coefficienti) | Minore |
| Implementazione | Convoluzione | Equazioni alle differenze |
| Applicazioni tipiche | Audio, immagini | Telecomunicazioni, controllo |
Statistiche dei Segnali Comuni
| Parametro | Segnale Sinusoidale | Rumore Bianco | Onda Quadrata |
|---|---|---|---|
| Valore Medio | 0 | ≈0 | 0 |
| Varianza | A²/2 | σ² | A² |
| Banda (Hz) | ≈f | ∞ | ∞ (armoniche) |
| Rapporto Segnale/Rumore | ∞ (teorico) | 0 | ∞ (teorico) |
| Densità Spettrale | Impulsi | Costante | f, 3f, 5f,… |
Errori Comuni e Soluzioni
Durante l’implementazione di algoritmi DSP, è facile incorrere in errori:
- Aliasing: Soluzione: Rispettare il teorema di Nyquist (fs > 2×fmax)
- Overflow numerico: Soluzione: Usare rappresentazione in virgola mobile o scaling
- Instabilità nei filtri IIR: Soluzione: Verificare i poli dentro il cerchio unitario
- Finestra temporale insufficientemente lunga: Soluzione: Usare windowing (Hamming, Hann)
- Quantizzazione eccessiva: Soluzione: Aumentare la risoluzione in bit
Strumenti Software per DSP
I principali strumenti per l’implementazione di algoritmi DSP includono:
- MATLAB con Signal Processing Toolbox (standard industriale)
- Python con librerie NumPy, SciPy, PyAudio (open source)
- GNU Radio per applicazioni in tempo reale (SDR)
- LabVIEW per prototipazione rapida
- C/C++ per implementazioni embedded (ARM Cortex, DSP)
Esempio Pratico: Filtro Passa-Basso
Progettiamo un filtro FIR passa-basso con frequenza di taglio a 1 kHz e fs = 44.1 kHz:
from scipy.signal import firwin, freqz
import matplotlib.pyplot as plt
# Parametri del filtro
cutoff = 1000 # Hz
fs = 44100 # Hz
numtaps = 101 # Numero di coefficienti (dispari)
# Progettazione filtro
taps = firwin(numtaps, cutoff, fs=fs)
# Risposta in frequenza
w, h = freqz(taps, worN=8000)
# Visualizzazione
plt.figure(figsize=(10, 5))
plt.plot((fs * 0.5 / np.pi) * w, np.abs(h))
plt.axvline(cutoff, color='red', linestyle='--')
plt.title("Risposta in Frequenza Filtro FIR")
plt.xlabel("Frequenza (Hz)")
plt.ylabel("Guadagno")
plt.grid()
plt.show()