Comment générer du bruit blanc gaussien à bande limitée dans MATLAB?

16

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?

Bo LI
la source
Dans les systèmes à temps continu, le concept de bruit blanc à bande limitée, qu'il soit gaussien ou non, est bien défini et bien compris. Pour les systèmes à temps discret, le problème est plus compliqué et vous devez considérer quelle est la limitation de bande et comment elle se compare à la fréquence de Nyquist.
Dilip Sarwate
2
@DilipSarwate: Pour moi, le "bruit blanc limité par la bande" est un oxymore! :-)
Peter K.
@PeterK. La notion de bruit blanc limité en bande est principalement utilisée dans les systèmes passe-bande où les caractéristiques du bruit en dehors de la bande passante sont sans importance tandis que dans la bande passante, le bruit est indiscernable du bruit blanc qui a traversé un filtre passe-bande idéal qui passe précisément la bande de fréquence qui est la bande passante. Ce n'est pas plus un oxymore qu'un bruit blanc (sans aucun commentaire péjoratif sur les limitations de bande). Voir aussi le commentaire de DRazick (qui est sur place) suite à la réponse de Jason R (avec laquelle je ne suis pas d'accord).
Dilip Sarwate
1
@DilipSarwate: Merci pour l'explication. Je comprends, mais je pense toujours que c'est un très mauvais choix de terminologie. Pour moi, le "bruit blanc filtré passe-bande" est plus précis, mais je suppose qu'il se retrouve au même endroit.
Peter K.
1
@PeterK. Malheureusement, «bruit blanc filtré passe-bande» signifie généralement le processus décrit dans la réponse de JasonR. Commencez avec du bruit blanc et filtrez-le à travers un filtre avec fonction de transfert pour obtenir un processus avec PSD proportionnel à | H ( f ) | 2 . Le bruit blanc limité en bande est le même sauf que nous insistons sur le fait que H ( f ) doit être la fonction de transfert d'un filtre passe-bande idéal . Le point clé avec le bruit blanc est que nous ne pouvons pas placer le signal là où le bruit ne s'applique pas au bruit blanc à bande limitée aussi longtemps que nous sommes contraints de garder nos signaux dans la bande.H(f)|H(f)|2H(f)
Dilip Sarwate

Réponses:

19

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);
Jason R
la source
Je me suis toujours demandé cela, mais si quelque chose comme ça est fait, alors qu'est-ce qui est si gaussien à ce sujet? Je ne pense pas que le PDF soit du tout à ce stade ...
Spacey
8
L'une des particularités des variables aléatoires gaussiennes est que la somme de deux VR gaussiens indépendants est également distribuée gaussienne. Comme le bruit d'entrée est blanc, vous pouvez regarder chaque échantillon à la sortie du filtre comme une somme de nombreuses variables aléatoires gaussiennes indépendantes (où la variance de chaque RV dépend de la variance du bruit d'entrée et des valeurs de la prise de filtre correspondante). Par conséquent, les échantillons à la sortie du filtre sont également distribués gaussiens. Cependant, le bruit n'est évidemment plus blanc, car il existe une corrélation entre des échantillons successifs en sortie de filtre.
Jason R
Cette propriété est décrite plus en détail sur Wikipedia . Notez que la propriété est toujours valable même si le bruit d'entrée est coloré (voir la section "Variables aléatoires corrélées").
Jason R
1
facepalm . Bien sûr.
Spacey
3
Pourtant, cette méthode ne génère pas de bruit blanc. Pas besoin d'appliquer un filtre, chaque bruit échantillonné discret est limité en bande pour commencer.
Royi
9

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:σ2

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.

Matt L.
la source
2
Bon point. Si vous mettez à l'échelle les coefficients du filtre de telle sorte que , le filtre n'affectera pas la variance du bruit. n=0N|h[n]|2=1
Jason R
@Matt Belle addition!
Spacey
4

Chaque fois que vous générez des échantillons de bruit discrets (à l'aide de MATLAB randn/ randpar 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.

σcn2δ(t)fsfsσcn2

fs/2

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 .

Royi
la source
Plus d'informations ici: dsp.stackexchange.com/questions/17494/…
Royi
2

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?

MrUser
la source
1
en regardant le code matlab d'origine, il fonctionne pour une taille de bloc de n, votre longueur fft. Si je veux 2n échantillons, vous pouvez doubler la longueur de fft, ce qui est plus que de faire 2 fft. si vous faites 2 blocs séparés, il y aura une transition discontinue du premier au deuxième bloc. vous pouvez utiliser une fenêtre pour faciliter la transition, mais vous devez ensuite faire plus de 2 blocs pour éviter de festonner votre série chronologique. En utilisant la méthode de filtrage, une fois que le filtre est en régime permanent, vous pouvez lui fournir des nombres aléatoires aussi longtemps que vous le souhaitez. L'augmentation de traitement pour la méthode de filtrage évolue de façon linéaire.
0

Je me rends compte que cette question est apparue dans la vue actuelle car @Drazick a modifié sa réponse de 2013.

xrand()frand()0x<1

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.

robert bristow-johnson
la source
-1

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

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
    }


}
Zibri
la source
1
Le STFT n'est pas plat à travers le groupe. Vous n'avez pas montré pourquoi votre technique présente un quelconque avantage. Btw la plupart des peintures sont stockées en blanc grisâtre puis mélangées avec des pigments. La peinture orange n'est pas faite en utilisant uniquement des ingrédients orange. Il n'y a pas de travail supplémentaire pour générer du bruit blanc.
@StanleyPawlukiewicz En électronique, vous êtes righe car un générateur de bruit et un filtre sont deux "objets" très simples. En programmation, un filtre est complexe en nombre d'instructions bien plus que simplement générer les données nécessaires. Donc, lorsque la programmation est préférable, mon approche si vous avez des applications à temps critique. Si vous avez voté contre, je vous suggère de réfléchir à nouveau.
Zibri
1
votre bruit n'est pas préférable. le spectre n'est pas plat à travers la bande. appeler une fonction transcendantale à la volée n'est pas plus rapide que le filtrage. vos arguments ne sont pas étayés
1
En fait, l'ondulation intrabande est un paramètre de conception. Dire qu'ils
1
puisque votre technique est si facile à modifier, pourquoi n'écrivez-vous pas votre propre routine d'onde sinusoïdale au lieu de la lier à une et de prétendre que votre code est moins complexe et de le comparer à un biquad. pendant que vous l'ajoutez, que diriez-vous d'une version à virgule fixe. vous pourriez également penser à la façon dont votre technique évolue lorsque vous augmentez le nombre d'échantillons