Generazione di rumore pseudo-casuale rosa (


20

Quali sono alcuni algoritmi per generare una buona approssimazione pseudo-casuale al rumore 1/f (rosa), ma adatti per l'implementazione con basso costo computazionale su un DSP intero?


Che ne dici di memoria? Se questo non è un problema, ma il calcolo lo è, direi di fare un iDFT a fase casuale della curva di frequenza desiderata e salvarlo come const constabile nel tuo dispositivo.
lasciato circa il

@leftaroundabout - O moltiplicando il DFT del rumore bianco casuale per la curva di frequenza 1 / f, quindi fare un IDFT avrebbe migliori caratteristiche di casualità?
hotpaw2,

1
Il rumore bianco è essenzialmente una iFT a fase casuale della funzione costante, quindi non dovrebbe fare molta differenza.
lasciato circa il

Risposte:


11

6
Se quel sito diminuisce, la tua risposta scompare, se dovessi riportare le basi di ogni soluzione la risposta sarebbe molto migliorata, usando il sito come riferimento.
Kortuk,

@Kortuk: la risposta è wiki della community, quindi sentiti libero di farlo da solo! Le informazioni dovrebbero essere sufficienti per puntare ad altri riferimenti web (come la risposta di datageist per la prima opzione). Sono d'accordo, tuttavia, che maggiori dettagli sarebbero buoni.
Peter K.

20

Filtro lineare

Il primo approccio nella risposta di Peter (ovvero filtraggio del rumore bianco) è un approccio molto semplice. In Spectral Audio Signal Processing , JOS dà un filtro di ordine inferiore che può essere usato per produrre un'approssimazione accettabile , insieme ad un'analisi di come la densità di potenza risultante spettrale corrisponde alla ideale. Il filtro lineare produrrà sempre un'approssimazione, ma ciò potrebbe non avere importanza in pratica. Per parafrasare JOS:

Non esiste un filtro esatto (razionale, di ordine finito) in grado di produrre rumore rosa dal rumore bianco. Questo perché la risposta di ampiezza ideale del filtro deve essere proporzionale alla funzione irrazionale , dovefindica la frequenza in Hz. Tuttavia, è abbastanza facile generare rumore rosa a qualsiasi grado di approssimazione desiderato, incluso quello percettivo esatto.1/ff

I coefficienti del filtro che fornisce sono i seguenti:

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

Sono formattati come parametri della funzione filtro MATLAB , quindi per motivi di chiarezza, corrispondono alla seguente funzione di trasferimento:

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

Ovviamente, è meglio usare la piena precisione dei coefficienti in pratica. Ecco un link a come suona il rumore rosa generato usando quel filtro:

Per l'implementazione in virgola fissa, poiché di solito è più conveniente lavorare con coefficienti nell'intervallo [-1,1), alcune rielaborazioni della funzione di trasferimento saranno in ordine. In generale, la raccomandazione è quella di suddividere le cose in sezioni del secondo ordine , ma parte del motivo (al contrario dell'uso delle sezioni del primo ordine) è per la comodità di lavorare con coefficienti reali quando le radici sono complesse. Per questo particolare filtro, tutte le radici sono reali e la loro combinazione in sezioni del secondo ordine probabilmente produrrebbe comunque alcuni coefficienti di denominatore> 1, quindi tre sezioni del primo ordine sono una scelta ragionevole, come segue:

H(z)=1-B1z-11-un'1z-1 1-B2z-11-un'2z-1 1-B3z-11-un'3z-1

dove

a 1 = 0.99516897 , a 2 = 0.94384177 , a 3 = 0.55594526

B1=0.98223157, B2=0.83265661, B3=0.10798089
un'1=0.99516897, un'2=0.94384177, un'3=0.55594526

Sarà necessaria una scelta oculata di sequenziamento per quelle sezioni, combinata con una scelta di fattori di guadagno per ciascuna sezione per evitare il trabocco. Non ho provato nessuno degli altri filtri indicati nel link nella risposta di Peter , ma probabilmente valgono considerazioni simili.

Rumore bianco

Ovviamente, l'approccio di filtraggio richiede in primo luogo una fonte di numeri casuali uniformi. Se una routine di libreria non è disponibile per una determinata piattaforma, uno degli approcci più semplici consiste nell'utilizzare un generatore congruenziale lineare . Un esempio di implementazione efficiente in virgola fissa è dato da TI nella generazione di numeri casuali su un TMS320C5x (pdf) . Una discussione teorica dettagliata di vari altri metodi è disponibile in Generazione di numeri casuali e Metodi Monte Carlo di James Gentle.

risorse

Diverse fonti basate sui seguenti collegamenti nella risposta di Peter meritano di essere evidenziate.

  • Il primo blocco basato su filtro di riferimenti di codice Introduzione all'elaborazione del segnale di Orfanidis. Il testo completo è disponibile a quel link e [nell'Appendice B] ha una copertura della generazione di rumore sia rosa che bianco. Come menziona il commento, Orfanidis copre principalmente l'algoritmo Voss.

  • Lo spettro prodotto dal generatore di rumore rosa Voss-McCartney . Molto in basso vicino alla fine della pagina, dopo un'esaustiva discussione delle varianti dell'algoritmo Voss, questo link è indicato in gigantesche lettere rosa . È molto più facile da leggere rispetto ad alcuni dei precedenti diagrammi ASCII.

  • Una bibliografia sul rumore 1 / f di Wentian Li. Questo è riferito sia nella fonte di Peter che da JOS. Ha un numero vertiginoso di riferimenti sul rumore 1 / f in generale, risalente al 1918.


Hai idea di come abbia inventato questi coefficienti di filtro? Immagino sia solo un adattamento non lineare alla pendenza desiderata, ma sarei piuttosto interessato a sapere se esiste un algoritmo più specifico.
nibot,

La mia ipotesi migliore sarebbe una delle tecniche di approssimazione menzionate nella sua tesi . È un'ottima lettura in entrambi i modi.
datageist

Caspita, è un bel documento! Grazie per il link
nibot,

1
Il problema con il metodo del rumore bianco del filtro è che non si ottengono le stesse relazioni di fase di magnitudo di una serie temporale correlata automaticamente. Pertanto, se stai cercando di emulare i processi naturali, non dovresti generare rumore bianco e filtrarlo. Dovresti effettivamente creare rumore correlato automaticamente come serie temporale, ovvero il valore corrente dipende dal valore precedente + rumore. Vedi nelle statistiche i processi "AR". Puoi verificarlo generando rumore usando entrambi i metodi, quindi FFT e tracciato reale rispetto a immaginario (piano complesso del dominio della frequenza). Noterai una grande differenza nel modello
Paul S,

Ciao Paul, benvenuto su DSP.SE. Se ti interessa solo come suona il rumore (nell'audio, ad esempio), lo spettro di grandezza è la preoccupazione principale. Sarebbe bello se potessi dettagliare i tuoi pensieri in una nuova risposta, però. Non credo che sul sito ci sia ancora qualcosa che descriva quella tecnica.
datageist

1

Uso l'algoritmo Corsini e Saletti dal 1990: G. Corsini, R. Saletti, "A 1 / f ^ gamma Power Spectrum Noise Sequence Generator", IEEE Transactions on Instrumentation and Measurement, 37 (4), dicembre 1988, 615 -619. L'esponente gamma è compreso tra -2 e +2. Funziona bene per i miei scopi. Ed

Se questo tentativo di aggiungere uno screenshot funziona, la figura seguente mostra un esempio delle prestazioni dell'algoritmo Corsini e Saletti (almeno come l'ho programmato nel 1990). La frequenza di campionamento era 1 kHz, gamma = 1 e 1000 PSD FFT a 32k erano mediati.

PSD per rumore 1 / f tramite algoritmo Corsini e Saletti


Questo fa seguito al mio precedente post sul generatore di rumore Corsini e Saletti (C&S). Le prossime due figure mostrano quanto bene il generatore C&S si comporta riguardo alla generazione di rumori a bassa frequenza (gamma> 0) e alta frequenza (gamma <0). La terza figura confronta i PSD rumore 1 / f del generatore C&S (lo stesso del mio primo post) e il generatore Esempio B.9 1 / f riportato nell'eccellente libro del Prof. Orfanidis (eqn B.29, p. 736). Tutti questi PSD sono in media 1000 PSD da 32k FFT. Sono tutti unilaterali e sottratti alla media. Per i PSD C&S, ho usato 3 poli / decennio e ho specificato 4 decadi (da 0,05 a 500 Hz) come intervallo utilizzabile desiderato. Quindi il generatore C&S aveva n = 12 poli e zero coppie. La frequenza di campionamento era di 1 kHz, Nyquist era di 500 Hz e l'elemento di risoluzione era di poco superiore a 0,0305 Hz. Ed V PSD a bassa frequenza PSD ad alta frequenza Confronto tra i generatori di rumore 2 1 / f

fc10fMfcfM

un'io=eXp[-2π10(io-N)/h-γ/2h-c]
Bio=eXp[-2π10(io-N)/h-c]
fM=0.5fc.


1
Corsini e Saletti dichiarano "Questo filtro è composto da N sezioni di primo ordine in cascata, ciascuna con una coppia polo-zero reale" e i poli N sono "distribuiti uniformemente rispetto al logaritmo di frequenza con una densità di poli h per frequenza decennio (p / d) e gli zeri N seguono di conseguenza. " La sezione Discussioni del documento è stata eccezionalmente ben fatta, quindi non c'è stato nessun problema a programmare ciò che hanno detto di fare. Tutto quello che ho è la mia vecchia copia cartacea e una sua copia scannerizzata. Per il PSD sopra, ho usato 3 poli / decennio e il PSD è sottratto dalla media e unilaterale. Ed V
Ed V
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.