Was sind einige Algorithmen zur Erzeugung einer guten pseudozufälligen Annäherung an Rauschen (rosa Rauschen), die sich jedoch für die Implementierung mit geringem Rechenaufwand auf einem Ganzzahl-DSP eignen?
Was sind einige Algorithmen zur Erzeugung einer guten pseudozufälligen Annäherung an Rauschen (rosa Rauschen), die sich jedoch für die Implementierung mit geringem Rechenaufwand auf einem Ganzzahl-DSP eignen?
Antworten:
Lineare Filterung
Der erste Ansatz in Peters Antwort (dh das Filtern von weißem Rauschen) ist ein sehr einfacher Ansatz. Bei der Verarbeitung von spektralen Audiosignalen bietet JOS ein Filter niedriger Ordnung, mit dem eine anständige Näherung erstellt werden kann , zusammen mit einer Analyse, wie gut die resultierende spektrale Leistungsdichte mit dem Ideal übereinstimmt. Die lineare Filterung liefert immer eine Annäherung, was in der Praxis jedoch möglicherweise keine Rolle spielt. Um JOS zu paraphrasieren:
Es gibt kein genaues (rationales, Filter endlicher Ordnung), das aus weißem Rauschen rosa Rauschen erzeugen kann. Dies liegt daran, dass der ideale Amplitudengang des Filters proportional zur irrationalen Funktion , wobei die Frequenz in Hz bezeichnet. Es ist jedoch einfach genug, rosa Rauschen in einem beliebigen Grad an Annäherung zu erzeugen, einschließlich wahrnehmungsgenau. f
Die Koeffizienten des Filters sind wie folgt:
B = [0.049922035, -0.095993537, 0.050612699, -0.004408786];
A = [1, -2.494956002, 2.017265875, -0.522189400];
Sie sind als Parameter für die MATLAB-Filterfunktion formatiert , daher entsprechen sie der Übersichtlichkeit halber der folgenden Übertragungsfunktion:
Offensichtlich ist es in der Praxis besser, die volle Genauigkeit der Koeffizienten zu nutzen. Hier ist ein Link, wie sich das mit diesem Filter erzeugte Rosa Rauschen anhört:
Da es für die Festkommaimplementierung in der Regel bequemer ist, mit Koeffizienten im Bereich [-1,1) zu arbeiten, ist eine Überarbeitung der Übertragungsfunktion angebracht. Im Allgemeinen wird empfohlen, die Dinge in Abschnitte zweiter Ordnung aufzuteilen. Ein Grund dafür (im Gegensatz zur Verwendung von Abschnitten erster Ordnung) ist jedoch die Bequemlichkeit, mit reellen Koeffizienten zu arbeiten, wenn die Wurzeln komplex sind. Für dieses spezielle Filter sind alle Wurzeln reell und die Kombination zu Abschnitten zweiter Ordnung würde wahrscheinlich immer noch Nennerkoeffizienten> 1 ergeben, so dass drei Abschnitte erster Ordnung eine vernünftige Wahl sind, wie folgt:
woher
Um einen Überlauf zu verhindern, ist eine sorgfältige Auswahl der Sequenzierung für diese Abschnitte sowie eine Auswahl der Verstärkungsfaktoren für jeden Abschnitt erforderlich. Ich habe noch keinen der anderen Filter ausprobiert, die im Link in Peters Antwort angegeben sind , aber ähnliche Überlegungen würden wahrscheinlich zutreffen.
Weißes Rauschen
Offensichtlich erfordert der Filterungsansatz in erster Linie eine Quelle einheitlicher Zufallszahlen. Wenn eine Bibliotheksroutine für eine bestimmte Plattform nicht verfügbar ist, besteht einer der einfachsten Ansätze darin, einen linearen Kongruenzgenerator zu verwenden . Ein Beispiel für eine effiziente Festkommaimplementierung liefert TI in Random Number Generation auf einem TMS320C5x (pdf) . Eine detaillierte theoretische Diskussion verschiedener anderer Methoden findet sich in Random Number Generation und Monte Carlo Methods von James Gentle.
Ressourcen
Einige Quellen, die auf den folgenden Links in Peters Antwort basieren, sind hervorzuheben.
Der erste filterbasierte Codeabschnitt enthält eine Einführung in die Signalverarbeitung von Orfanidis. Der vollständige Text ist unter diesem Link verfügbar und [in Anhang B] deckt sowohl die Erzeugung von rosa als auch von weißem Rauschen ab. Wie der Kommentar erwähnt, behandelt Orfanidis hauptsächlich den Voss-Algorithmus.
Das vom Voss-McCartney Pink Noise Generator erzeugte Spektrum . Ganz unten auf der Seite wird nach ausführlicher Erörterung der Varianten des Voss-Algorithmus auf diesen Link in riesigen rosa Buchstaben verwiesen . Es ist viel einfacher zu lesen als einige der vorhergehenden ASCII-Diagramme.
Eine Bibliographie zu 1 / f Lärm von Wentian Li. Darauf wird sowohl in Peters Quelle als auch von JOS verwiesen. Es gibt eine schwindelerregende Anzahl von Hinweisen auf 1 / f-Lärm im Allgemeinen, die bis ins Jahr 1918 zurückreichen.
Ich benutze den Corsini und Saletti-Algorithmus seit 1990: G. Corsini, R. Saletti, "A 1 / f ^ gamma Power Spectrum Noise Sequence Generator", IEEE Transactions on Instrumentation and Measurement, 37 (4), Dezember 1988, 615 -619. Der Gamma-Exponent liegt zwischen -2 und +2. Es funktioniert gut für meine Zwecke. Ed
Wenn dieser Versuch, einen Screenshot hinzuzufügen, funktioniert, zeigt die folgende Abbildung ein Beispiel für die Leistung des Corsini- und Saletti-Algorithmus (zumindest so, wie ich ihn 1990 programmiert habe). Die Abtastfrequenz betrug 1 kHz, gamma = 1 und es wurden 1000 32k-FFT-PSDs gemittelt.
Dies folgt meinem vorherigen Beitrag zum Geräuschgenerator Corsini und Saletti (C & S). Die nächsten beiden Abbildungen zeigen, wie gut der C & S-Generator in Bezug auf die Erzeugung von Niederfrequenz- (Gamma> 0) und Hochfrequenz- (Gamma <0) Rauschen arbeitet. Die dritte Abbildung vergleicht die 1 / f-Rausch-PSDs des C & S-Generators (wie in meinem ersten Beitrag) und den 1 / f-Generator von Beispiel B.9 in Prof. Orfanidis 'ausgezeichnetem Buch (Gleichung B.29, S. 736). Alle diese PSDs sind Durchschnittswerte von 1000 32-KB-FFT-PSDs. Sie sind alle einseitig und mittelsubtrahiert. Für die C & S PSDs habe ich 3 Pole / Dekade verwendet und 4 Dekaden (0,05 bis 500 Hz) als gewünschten Nutzbereich angegeben. Der C & S-Generator hatte also n = 12 Pol- und Null-Paare. Die Abtastfrequenz betrug 1 kHz, Nyquist betrug 500 Hz und das Auflösungselement betrug etwas mehr als 0,0305 Hz. Ed V