Dans certains articles, j'ai lu que le bruit additif était blanc à bande gaussienne limitée.
Comment puis-je simuler ce type de bruit avec MATLAB?
Dans certains articles, j'ai lu que le bruit additif était blanc à bande gaussienne limitée.
Comment puis-je simuler ce type de bruit avec MATLAB?
Réponses:
Vous généreriez du bruit gaussien à bande limitée en générant d'abord du bruit blanc, puis en le filtrant à la bande passante que vous désirez. Par exemple:
% 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);
Juste un petit ajout à la réponse de Jason: vous devez généralement générer un bruit à bande limitée avec une variance donnée . Vous pouvez ajouter ce code au code donné dans la réponse de Jason:
var = 3.0; % just an example
scale = sqrt(var)/std(nb);
nb = scale*nb; % nb has variance 'var'
Notez que vous devez effectuer la mise à l'échelle après le filtrage, car en général, le filtre modifie la variance du bruit.
Chaque fois que vous générez des échantillons de bruit discrets (à l'aide de MATLAB randn
/ rand
par exemple), vous générez en fait un bruit à bande limitée.
Tout ce que vous avez à faire est d'ajuster la variance des échantillons discrets à la variance du bruit "continu" dont ces échantillons sont prétendument extraits.
La description complète est donnée ici - Comment simuler l'AWGN (bruit blanc gaussien additif) dans les systèmes de communication pour une bande passante spécifique .
Pourquoi ne peut-on pas utiliser l'approche mentionnée dans cet article ?
Il commence avec les fréquences souhaitées et fonctionne en arrière pour construire le signal, au lieu de filtrer. Il utilise du code python, mais également des liens vers le code Matlab d'origine.
Y a-t-il des inconvénients à le faire de cette façon?
Je me rends compte que cette question est apparue dans la vue actuelle car @Drazick a modifié sa réponse de 2013.
rand()
frand()
le "bruit blanc" est, bien entendu, un terme impropre, même pour les signaux analogiques. un "signal de puissance" à spectre plat jusqu'à l'infini a également une puissance infinie. le signal virtuellement gaussien et "blanc" généré comme décrit a une puissance finie (qui est la variance et est 1) et une largeur de bande finie qui, exprimée comme unilatérale, est Nyquist. (donc la «densité spectrale de puissance» ou la puissance par fréquence unitaire est de 1 / Nyquist.)
je suppose que je peux le modifier plus tard et ajouter un pseudo-code de type C pour le montrer explicitement.
Produire du bruit blanc à spectre complet puis le filtrer, c'est comme si vous vouliez peindre un mur de votre maison en blanc, vous décidez donc de peindre toute la maison en blanc, puis de repeindre toute la maison sauf le mur. Est idiot. (Mais a du sens en électronique).
J'ai fait un petit programme en C qui peut générer du bruit blanc à n'importe quelle fréquence et n'importe quelle bande passante (disons à une fréquence centrale de 16 kHz et 2 kHz "large"). Aucun filtrage impliqué.
Ce que j'ai fait est simple: à l'intérieur de la boucle principale (infinie), je génère une sinusoïde à fréquence centrale +/- un nombre aléatoire entre - la moitié de la bande passante et + la moitié de la bande passante, puis je garde cette fréquence pour un nombre arbitraire d'échantillons (granularité) et ce est le résultat:
Bruit blanc large de 2 kHz à une fréquence centrale de 16 kHz
Pseudo code:
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
}
}