1/f-Rauschen: Zahlenwerte berechnen

Gast #3286620
Lesenswert?

Ich möchte digitale Zahlenwerte "berechnen", die rosa Rauschen 
entsprechen.
Gibt es da keinen Algorithmus oder Formel?

Ich dachte mir, die Werte eines Zufallsgenerators (Random-Funktion)
mit einer Funktion zu multiplizieren, um entweder Gauß verteiltes weißes 
Rauschen zu bekommen, dann noch Filtern - integrieren(?).
Moderator #3287017
Lesenswert?

Der Zufallsgenerator (für gleichverteilte Zufallszahlen) liefert dir 
weißes Rauschen im Bereich von 0 bis zu halben Abtastfrequenz. 
Integrierst du dieses Signal, erhältst du 1/f-Rauschen. Die Integration 
kannst du durch einfaches Aufaddieren der Zufallswerte realisieren:
1
// Zufallszahlen im Bereich [-0.5, +0.5]
2
double rnd() {
3
  return (double)rand() / RAND_MAX - 0.5;
4
}
5

6
void generate(double x[], int n) {
7
  double sum = 0;
8
  int i;
9
  for(i=0; i<n; i++) {
10
    x[i] = sum;
11
    sum += rnd();
12
  }
13
}

Edit: Mist, das oben Beschriebene ist kein rosa, sondern rotes Rauschen 
(1/f²-Rauschen), da sich das 1/f bzw. 1/f² ja auf die Rauschleistung und 
nicht die -amplitude bezieht. Aber 1/f-Rauschen kann sicher auch 
irgendwie berechnet werden. Nur nicht mehr heute :)
Moderator #3287174
Lesenswert?

Ich habe mir die Sache gerade noch einmal durch den Kopf gehen lassen. 
Um 1/f-Rauschen zu erhalten, muss das weiße Rauschen nicht 1-mal, 
sondern 1/2-mal integriert werden. Hier steht, wie's geht:

http://de.wikipedia.org/wiki/Fraktionale_Infinitesimalrechnung#Iterative_und_fraktionale_Integrale

Mit etwas Hin- und Herrechnen und nach Weglassen konstanter Faktoren 
kommt man auf folgende Funktion zur Generierung des 1/f-Rauschens:
1
void generate(double x[], int n) {
2
  double r;
3
  int i, j;
4

5
  for(i=0; i<n; i++) {
6
    r = rnd();
7
    for(j=i+1; j<n; j++)
8
      x[j] += r * (sqrt(j-i) - sqrt(j-i-1));
9
  }
10
}
Gast #3288249
Lesenswert?

Danke schon mal für die Hinweise.
Ich habe schon probiert, die gleichverteilten Zufallszahlen zu 
integrieren.
Dabei sind aber langsame und hohe Abweichungen vom Nullpunkt 
aufgetreten,
eine echte Kurve sieht anders aus.
Ich muss mal die Ergebnisse meines Generators genauer analysieren.

Gleichverteilte Zufallszahlen sind aber kein weißes Rauschen - 
(Gauß-verteilt)?
Deshalb auch die Frage nach Gauß-verteilten Zufallszahlen. Das 
numerische 1/f-filtern wäre dann tatsächlich eine Integration.
Moderator #3288357
Lesenswert?

Rausch schrieb:
> Ich habe schon probiert, die gleichverteilten Zufallszahlen zu
> integrieren.
> Dabei sind aber langsame und hohe Abweichungen vom Nullpunkt
> aufgetreten,

So soll es ja auch sein. Je niedriger die Frequenz, desto höher die
Amplitude.

> eine echte Kurve sieht anders aus.

Dann ist es kein perfektes 1/f²-Rauschen. So etwas dürfte in freier
Natur auch kaum vorkommen, da immer in irgendeiner Form eine
Amplitudenbegrenzung vorhanden ist.

Rausch schrieb:
> Gleichverteilte Zufallszahlen sind aber kein weißes Rauschen -
> (Gauß-verteilt)?

Doch. Nimm Matlab oder ein anderes Tool deiner Wahl und lasse dir eine
Sequenz von gleichverteilten Zufallszahlen fourier-transformieren. Da
die Spektralfunktion ebenso wie das Originalsignal verrauscht ist,
kannst du das Ganze viele tausend Mal (jeweils mit anderen
Zufallszahlen) wiederholen und daraus die Spektralfunktion mitteln. Dann
wirst du für jede Frequenz ziemlich genau den gleichen Wert erhalten.

Da Gleiche kannst du mit den oben angegebenen Routinen zur Generierung
von 1/f²- und 1/f-Rauschen machen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren