In alcuni articoli, ho letto che il rumore additivo è bianco gaussiano a banda limitata.
Come posso simulare questo tipo di rumore usando MATLAB?
In alcuni articoli, ho letto che il rumore additivo è bianco gaussiano a banda limitata.
Come posso simulare questo tipo di rumore usando MATLAB?
Risposte:
Genererai rumore gaussiano senza limiti generando prima il rumore bianco, quindi filtrandolo in base alla larghezza di banda che desideri. Come esempio:
% design FIR filter to filter noise to half of Nyquist rate
b = fir1(64, 0.5);
% generate Gaussian (normally-distributed) white noise
n = randn(1e4, 1);
% apply to filter to yield bandlimited noise
nb = filter(b,1,n);
Ogni volta che si generano campioni di rumore discreto (utilizzando MATLAB randn
/ rand
ad esempio) si genera effettivamente un rumore a banda limitata.
Tutto quello che devi fare è l'adattamento della varianza dei campioni discreti alla varianza del rumore "Continuo" da cui presumibilmente vengono prelevati i campioni.
La descrizione completa è fornita qui - Come simulare AWGN (rumore bianco gaussiano additivo) nei sistemi di comunicazione per una larghezza di banda specifica .
Perché non si può usare l'approccio menzionato in questo post ?
Inizia con le frequenze desiderate e lavora all'indietro per costruire il segnale, invece di filtrare. Utilizza il codice Python, ma si collega anche al codice Matlab originale.
Ci sono degli svantaggi nel farlo in questo modo?
mi rendo conto che questa domanda è spuntata nella vista attuale perché @Drazick ha modificato la sua risposta del 2013.
rand()
frand()
"rumore bianco" è, ovviamente, un termine improprio, anche per segnali analogici. un "segnale di potenza" con spettro piatto fino all'infinito ha anche una potenza infinita. il segnale virtualmente gaussiano e "bianco" generato come descritto ha un potere finito (che è la varianza ed è 1) e una larghezza di banda finita che, espressa come unilaterale, è Nyquist. (quindi la "densità spettrale di potenza" o la potenza per unità di frequenza è 1 / Nyquist.) ridimensionala e compensa come preferisci.
intendo di poterlo modificare in seguito e aggiungere qualche pseudo-codice simile a C per mostrarlo esplicitamente.
Produrre rumore bianco a spettro completo e quindi filtrarlo è come se volessi dipingere un muro della tua casa bianco, quindi decidi di dipingere l'intera casa bianca e quindi ridipingere tutta la casa tranne il muro. È idiota (Ma ha senso nell'elettronica).
Ho realizzato un piccolo programma C in grado di generare rumore bianco a qualsiasi frequenza e larghezza di banda (diciamo a frequenza centrale 16kHz e 2 kHz "wide"). Nessun filtro coinvolto.
Quello che ho fatto è semplice: all'interno del ciclo principale (infinito) generi una sinusoide a frequenza centrale +/- un numero casuale tra-metà larghezza di banda e + metà larghezza di banda, quindi mantengo quella frequenza per un numero arbitrario di campioni (granularità) e questo è il risultato:
Rumore bianco largo 2kHz a frequenza centrale 16kHz
Pseudo codice:
while (true)
{
f = center frequency
r = random number between -half of bandwidth and + half of bandwidth
<secondary loop (for managing "granularity")>
for x = 0 to 8 (or 16 or 32....)
{
[generate sine Nth value at frequency f+r]
output = generated Nth value
}
}