Génération de bruit pseudo-aléatoire rose ( )

20

Quels sont certains algorithmes pour générer une bonne approximation pseudo-aléatoire du bruit (rose), mais adaptés à une implémentation à faible coût de calcul sur un DSP entier?1/f

hotpaw2
la source
Et la mémoire? Si ce n'est pas un problème mais que le calcul l'est, je dirais de faire un iDFT à phase aléatoire de la courbe de fréquence souhaitée et de l'enregistrer en tant que table d'ondes const statique dans votre appareil.
leftaroundabout
@leftaroundabout - Ou multiplier la DFT du bruit blanc aléatoire par la courbe de fréquence 1 / f, puis faire un IDFT aurait de meilleures caractéristiques de caractère aléatoire?
hotpaw2
1
Le bruit blanc est essentiellement une iFT à phase aléatoire de la fonction constante, donc cela ne devrait pas faire beaucoup de différence.
leftaroundabout

Réponses:

11

Il y a plusieurs. Ce site a une liste raisonnable (mais peut-être ancienne):

Peter K.
la source
6
Si ce site tombe en panne, votre réponse disparaît, si vous apportiez les bases de chaque solution, la réponse serait bien améliorée, en utilisant le site comme référence.
Kortuk
@Kortuk: La réponse est un wiki communautaire, alors n'hésitez pas à le faire vous-même! Les informations devraient être suffisantes pour pointer vers d'autres références Web (comme la réponse de datageist pour la première option). Je suis d'accord, cependant, que plus de détails seraient bons.
Peter K.
20

Filtrage linéaire

La première approche de la réponse de Peter (c'est-à-dire le filtrage du bruit blanc) est une approche très simple. Dans le traitement du signal audio spectral , JOS fournit un filtre de faible ordre qui peut être utilisé pour produire une approximation décente , ainsi qu'une analyse de l'adéquation de la densité spectrale de puissance résultante avec l'idéal. Le filtrage linéaire donnera toujours une approximation, mais cela peut ne pas avoir d'importance dans la pratique. Pour paraphraser JOS:

Il n'y a pas de filtre exact (rationnel, d'ordre fini) qui peut produire du bruit rose à partir du bruit blanc. En effet, la réponse d'amplitude idéale du filtre doit être proportionnelle à la fonction irrationnelle , où désigne la fréquence en Hz. Cependant, il est assez facile de générer du bruit rose à n'importe quel degré d'approximation, y compris perceptuellement exact. f1/ff

Les coefficients du filtre qu'il donne sont les suivants:

B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];

Ils sont formatés en tant que paramètres de la fonction de filtre MATLAB , donc pour des raisons de clarté, ils correspondent à la fonction de transfert suivante:

H(z)=.041.096z1+.051z2.004z312.495z1+2.017z2.522z3

De toute évidence, il est préférable d'utiliser la pleine précision des coefficients dans la pratique. Voici un lien vers ce à quoi ressemble le bruit rose généré à l'aide de ce filtre:

Pour l'implémentation en virgule fixe, car il est généralement plus pratique de travailler avec des coefficients dans la plage [-1,1), une certaine retouche de la fonction de transfert sera de mise. Généralement, la recommandation est de diviser les choses en sections de second ordre , mais en partie (contrairement à l'utilisation de sections de premier ordre) est pour la commodité de travailler avec des coefficients réels lorsque les racines sont complexes. Pour ce filtre particulier, toutes les racines sont réelles, et la combinaison ensuite en sections de second ordre donnerait probablement encore des coefficients de dénominateur> 1, donc trois sections de premier ordre est un choix raisonnable, comme suit:

H(z)=1b1z11a1z1 1b2z11a2z1 1b3z11a3z1

b1=0.98223157, b2=0.83265661, b3=0.10798089
a1=0.99516897, a2=0.94384177, a3=0.55594526

Un certain choix judicieux de séquençage pour ces sections, combiné avec un certain choix de facteurs de gain pour chaque section sera nécessaire pour éviter un débordement. Je n'ai essayé aucun des autres filtres indiqués dans le lien dans la réponse de Peter , mais des considérations similaires s'appliqueraient probablement.

Bruit blanc

De toute évidence, l'approche de filtrage nécessite en premier lieu une source de nombres aléatoires uniformes. Si une routine de bibliothèque n'est pas disponible pour une plateforme donnée, l'une des approches les plus simples consiste à utiliser un générateur congruentiel linéaire . Un exemple d'une mise en œuvre efficace en virgule fixe est donné par TI dans la génération de nombres aléatoires sur un TMS320C5x (pdf) . Une discussion théorique détaillée de diverses autres méthodes peut être trouvée dans Génération de nombres aléatoires et méthodes de Monte Carlo par James Gentle.

Ressources

Plusieurs sources basées sur les liens suivants dans la réponse de Peter méritent d'être soulignées.

  • Le premier bloc de code basé sur un filtre fait référence à l' introduction au traitement du signal par Orfanidis. Le texte intégral est disponible sur ce lien et [dans l'annexe B] il couvre la génération de bruit rose et blanc. Comme le commentaire le mentionne, Orfanidis couvre principalement l'algorithme de Voss.

  • Le spectre produit par le générateur de bruit rose Voss-McCartney . Bien en bas de la page, après une discussion approfondie sur les variantes de l'algorithme Voss, ce lien est référencé en lettres roses géantes . C'est beaucoup plus facile à lire que certains des diagrammes ASCII précédents.

  • Une bibliographie sur le bruit 1 / f par Wentian Li. Ceci est référencé à la fois dans la source de Peter et par JOS. Il a un nombre vertigineux de références sur le bruit 1 / f en général, remontant à 1918.

datageist
la source
Une idée de comment il a trouvé ces coefficients de filtre? Je suppose que c'est juste un ajustement non linéaire à la pente souhaitée, mais je serais très intéressé de savoir s'il existe un algorithme plus spécifique.
nibot
Ma meilleure supposition serait l'une des techniques d'approximation mentionnées dans sa thèse . C'est une bonne lecture de toute façon.
datageist
Wow, c'est tout un document! Merci pour le lien.
nibot
1
Le problème avec la méthode de filtrage du bruit blanc est que vous n'obtenez pas les mêmes relations de phase d'amplitude qu'avec une série chronologique autocorrélée. Ainsi, si vous essayez d'émuler des processus naturels, vous ne devez pas générer de bruit blanc et le filtrer. Vous devez en fait créer du bruit autocorrélé sous forme de série temporelle, c'est-à-dire que la valeur actuelle dépend de la valeur précédente + bruit. Voir en statistiques les processus "AR". Vous pouvez tester cela en générant du bruit en utilisant les deux méthodes, puis la FFT, et en traçant le réel contre l'imaginaire (plan complexe du domaine fréquentiel). Vous remarquerez une grande différence dans le motif
Paul S
Salut Paul, bienvenue sur DSP.SE. Si vous vous souciez simplement de la façon dont le bruit retentit (dans le travail audio, par exemple), le spectre de magnitude est la principale préoccupation. Ce serait bien si vous pouviez détailler vos pensées dans une nouvelle réponse. Je ne pense pas que nous ayons encore sur le site une description de cette technique.
datageist
1

J'utilise l'algorithme de Corsini et Saletti depuis 1990: G. Corsini, R. Saletti, «A 1 / f ^ gamma Power Spectrum Noise Sequence Generator», IEEE Transactions on Instrumentation and Measurement, 37 (4), décembre 1988, 615 -619. L'exposant gamma est compris entre -2 et +2. Cela fonctionne bien pour mes besoins. Ed

Si cette tentative d'ajout d'une capture d'écran fonctionne, la figure ci-dessous montre un exemple de la performance de l'algorithme Corsini et Saletti (du moins comme je l'ai programmé en 1990). La fréquence d'échantillonnage était de 1 kHz, gamma = 1, et 1000 PSD FFT 32k ont ​​été moyennés.

PSD pour bruit 1 / f via l'algorithme Corsini et Saletti


Cela fait suite à mon précédent article sur le générateur de bruit Corsini et Saletti (C&S). Les deux figures suivantes montrent la performance du générateur C&S en ce qui concerne la génération de bruits basse fréquence (gamma> 0) et haute fréquence (gamma <0). La troisième figure compare les PSD de bruit 1 / f du générateur C&S (comme mon premier article) et le générateur de l'exemple B.9 1 / f donné dans l'excellent livre du professeur Orfanidis (eqn B.29, p. 736). Tous ces PSD sont des moyennes de 1000 PSD FFT 32k. Ils sont tous unilatéraux et soustraits. Pour les PSD C&S, j'ai utilisé 3 pôles / décennie et spécifié 4 décennies (0,05 à 500 Hz) comme plage utilisable souhaitée. Le générateur C&S avait donc n = 12 pôles et zéro paire. La fréquence d'échantillonnage était de 1 kHz, Nyquist était de 500 Hz et l'élément de résolution était légèrement supérieur à 0,0305 Hz. Ed V PSD basse fréquence PSD haute fréquence Comparaison de 2 générateurs de bruit 1 / f

Comme Corsini & Saletti l'indiquent dans leur article, , où est la fréquence d'échantillonnage et est la «limite supérieure de la bande de fréquence sur laquelle nous générerons des échantillons de bruit». Les coefficients du filtre numérique sont donnés par leurs équations (5.1): où c = 1. Pour obtenir des PSD C&S comme ceux illustrés ci-dessus, supposons c = 0 et .fc10fMfcfM

ai=exp[2π10(iN)/hγ/2hc]
bi=exp[2π10(iN)/hc]
fM=0.5fc

Ed V
la source
1
Corsini et Saletti déclarent "Ce filtre est composé de N sections de premier ordre en cascade, chacune avec une paire de pôles réels" et les N pôles sont "uniformément répartis par rapport au logarithme des fréquences avec une densité de pôles h par décennie de fréquence (p / d), et les N zéros suivent en conséquence. " La section Discussion du document a été exceptionnellement bien réalisée, il n'y avait donc aucun problème à programmer ce qu'ils avaient dit de faire. Je n'ai que mon ancienne copie papier et une copie numérisée de celle-ci. Pour le PSD ci-dessus, j'ai utilisé 3 pôles / décennie et le PSD est soustrait à la moyenne et unilatéral. Ed V
Ed V