Erzeugung von rosa ( ) Pseudozufallsrauschen

20

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?1/f

hotpaw2
quelle
Wie wäre es mit Erinnerung? Wenn das kein Problem ist, aber die Berechnung es ist, würde ich sagen, mache eine Zufallsphasen-iDFT der gewünschten Frequenzkurve und speichere sie als statische Konstante in deinem Gerät.
Leftaroundabout
@leftaroundabout - Oder würde die DFT des zufälligen weißen Rauschens mit der 1 / f-Frequenzkurve multipliziert, wenn eine IDFT dann bessere Zufälligkeitseigenschaften hätte?
hotpaw2
1
Weißes Rauschen ist im Wesentlichen eine Zufallsphasen-iFT der konstanten Funktion, daher sollte es keinen großen Unterschied machen.
Linksabfahrt etwa

Antworten:

11

Es gibt einige. Diese Seite hat eine vernünftige (aber möglicherweise alte) Liste:

Peter K.
quelle
6
Wenn die Seite nicht Ihre Antwort verschwindet geht, wenn Sie die Grundlagen jeder Lösung zu bringen , über waren würde die Antwort viel verbessert, die Website als Referenz.
Kortuk
@Kortuk: Die Antwort ist Community-Wiki. Die Informationen dort sollten ausreichen, um auf andere Webverweise zu verweisen (wie die Antwort von Datageist für die erste Option). Ich stimme jedoch zu, dass weitere Details gut wären.
Peter K.
20

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. f1/ff

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:

H(z)=.041-.096z-1+.051z-2-.004z-31-2.495z-1+2,017z-2-.522z-3

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:

H(z)=1-b1z-11-ein1z-1 1-b2z-11-ein2z-1 1-b3z-11-ein3z-1

woher

b1=0.98223157, b2=0,83265661, b3=0.10798089
ein1=0.99516897, ein2=0.94384177, ein3=0,55594526

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.

Datageist
quelle
Irgendeine Idee, wie er auf diese Filterkoeffizienten gekommen ist? Ich denke, es ist nur eine nichtlineare Anpassung an die gewünschte Steigung, aber es würde mich sehr interessieren, ob es einen spezifischeren Algorithmus gibt.
Nibot
Meine beste Vermutung wäre eine der Näherungstechniken, die in seiner Dissertation erwähnt wurden . Es ist so oder so eine großartige Lektüre.
Datageist
Wow, das ist schon ein Dokument! Danke für den Link.
Nibot
1
Das Problem bei der Filtermethode für weißes Rauschen besteht darin, dass Sie nicht die gleichen Größenphasenbeziehungen erhalten wie bei einer autokorrelierten Zeitreihe. Wenn Sie also versuchen, natürliche Prozesse zu emulieren, sollten Sie kein weißes Rauschen erzeugen und es filtern. Sie sollten tatsächlich autokorreliertes Rauschen als Zeitreihe erstellen, dh der aktuelle Wert hängt vom vorherigen Wert + Rauschen ab. Siehe in der Statistik "AR" -Prozesse. Sie können dies testen, indem Sie mit beiden Methoden Rauschen erzeugen, dann FFT und Real gegen Imaginär zeichnen (komplexe Ebene des Frequenzbereichs). Sie werden einen großen Unterschied im Muster bemerken
Paul S
Hallo Paul, willkommen bei DSP.SE. Wenn Sie sich nur darum kümmern, wie sich das Rauschen anhört (z. B. bei der Audiowiedergabe), ist das Betragsspektrum das Hauptanliegen. Es wäre jedoch großartig, wenn Sie Ihre Gedanken in einer neuen Antwort beschreiben könnten. Ich glaube, wir haben noch nichts auf der Website, das diese Technik beschreibt.
Datageist
1

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.

PSD für 1 / f-Rauschen über Corsini und Saletti-Algorithmus


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 Niederfrequenz-PSDs Hochfrequenz-PSDs Vergleichen von 2 1 / f-Rauschgeneratoren

fc10fMfcfM

einich=exp[-2π10(ich-N)/h-γ/2h-c]
bich=exp[-2π10(ich-N)/h-c]
fM=0,5fc

Ed V
quelle
1
Corsini- und Saletti-Zustand "Dieses Filter besteht aus N kaskadierten Abschnitten erster Ordnung mit jeweils einem echten Pol-Null-Paar" und die N Pole sind "gleichmäßig verteilt in Bezug auf den Frequenzlogarithmus mit einer Dichte von h Polen pro Frequenzdekade (p / d) und die N Nullen folgen entsprechend. " Der Diskussionsteil des Papiers war außergewöhnlich gut, so dass es kein Problem gab, nur das zu programmieren, was sie sagten. Alles, was ich habe, ist meine alte Hardcopy und eine gescannte Kopie davon. Für die PSD oben habe ich 3 Pole / Dekade verwendet und die PSD ist mittel subtrahiert und einseitig. Ed V
Ed V