Quali sono alcuni algoritmi per generare una buona approssimazione pseudo-casuale al rumore (rosa), ma adatti per l'implementazione con basso costo computazionale su un DSP intero?
Quali sono alcuni algoritmi per generare una buona approssimazione pseudo-casuale al rumore (rosa), ma adatti per l'implementazione con basso costo computazionale su un DSP intero?
Risposte:
Ce ne sono diversi. Questo sito ha un elenco ragionevole (ma forse vecchio):
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.
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:
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:
dove
a 1 = 0.99516897 , a 2 = 0.94384177 , a 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.
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.
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