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?
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?
Réponses:
Il y a plusieurs. Ce site a une liste raisonnable (mais peut-être ancienne):
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. f
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:
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:
où
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.
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.
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
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 .