Rosa ( ) generación de ruido pseudoaleatorio

20

¿Cuáles son algunos algoritmos para generar una buena aproximación pseudoaleatoria al ruido (rosa), pero adecuados para la implementación con un bajo costo computacional en un DSP entero?1/ /F

hotpaw2
fuente
¿Qué hay de la memoria? Si eso no es una preocupación, pero el cálculo lo es, yo diría que haga un iDFT de fase aleatoria de la curva de frecuencia deseada y guárdelo como una tabla de ondas const estática en su dispositivo.
Leftaroundabout
@leftaroundabout - ¿O multiplicar el DFT de ruido blanco aleatorio por la curva de frecuencia 1 / f, luego hacer un IDFT tiene mejores características de aleatoriedad?
hotpaw2
1
El ruido blanco es esencialmente un iFT de fase aleatoria de la función constante, por lo que no debería hacer mucha diferencia.
Leftaroundabout

Respuestas:

11

Hay varios. Este sitio tiene una lista razonable (pero posiblemente antigua):

Peter K.
fuente
66
Si ese sitio deja de funcionar, su respuesta desaparece, si tuviera que presentar los conceptos básicos de cada solución, la respuesta mejoraría mucho , utilizando el sitio como referencia.
Kortuk
@Kortuk: La respuesta es el wiki de la comunidad, ¡así que siéntete libre de hacerlo tú mismo! La información allí debería ser suficiente para señalar otras referencias web (como la respuesta de datageist para la primera opción). Sin embargo, estoy de acuerdo en que más detalles serían buenos.
Peter K.
20

Filtrado Lineal

El primer enfoque en la respuesta de Peter (es decir, filtrado de ruido blanco) es un enfoque muy directo. En el procesamiento de señal de audio espectral , JOS ofrece un filtro de bajo orden que puede usarse para producir una aproximación decente , junto con un análisis de qué tan bien la densidad espectral de potencia resultante coincide con el ideal. El filtrado lineal siempre producirá una aproximación, pero eso puede no importar en la práctica. Parafraseando a JOS:

No existe un filtro exacto (racional, de orden finito) que pueda producir ruido rosa a partir del ruido blanco. Esto se debe a que la respuesta de amplitud ideal del filtro debe ser proporcional a la función irracional , dondefdenota frecuencia en Hz. Sin embargo, es bastante fácil generar ruido rosa a cualquier grado de aproximación deseado, incluso perceptualmente exacto.1/ff

Los coeficientes del filtro que da son los siguientes:

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

Están formateados como parámetros para la función de filtro MATLAB , por lo que, en aras de la claridad, corresponden a la siguiente función de transferencia:

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

Obviamente, es mejor usar la precisión total de los coeficientes en la práctica. Aquí hay un enlace a cómo suena el ruido rosa generado usando ese filtro:

Para la implementación de punto fijo, dado que generalmente es más conveniente trabajar con coeficientes en el rango [-1,1), será necesario volver a trabajar la función de transferencia. En general, la recomendación es dividir las cosas en secciones de segundo orden , pero parte de la razón de esto (en lugar de usar secciones de primer orden) es la conveniencia de trabajar con coeficientes reales cuando las raíces son complejas. Para este filtro en particular, todas las raíces son reales, y combinarlas en secciones de segundo orden probablemente arrojaría algunos coeficientes del denominador> 1, por lo que tres secciones de primer orden son una opción razonable, como sigue:

H(z)=1-si1z-11-un1z-1 1-si2z-11-un2z-1 1-si3z-11-un3z-1

dónde

si1=0.98223157, si2=0.83265661, si3=0.10798089
un1=0.99516897, un2=0.94384177, un3=0.55594526

Se requerirá alguna elección juiciosa de secuencia para esas secciones, combinada con alguna elección de factores de ganancia para cada sección para evitar el desbordamiento. No he probado ninguno de los otros filtros que figuran en el enlace de la respuesta de Peter , pero probablemente se aplicarían consideraciones similares.

Ruido blanco

Obviamente, el enfoque de filtrado requiere una fuente de números aleatorios uniformes en primer lugar. Si una rutina de biblioteca no está disponible para una plataforma determinada, uno de los enfoques más simples es usar un generador congruencial lineal . TI da un ejemplo de una implementación eficiente de punto fijo en la generación de números aleatorios en un TMS320C5x (pdf) . Se puede encontrar una discusión teórica detallada de varios otros métodos en Generación de números aleatorios y Métodos Monte Carlo de James Gentle.

Recursos

Vale la pena destacar varias fuentes basadas en los siguientes enlaces en la respuesta de Peter.

  • El primer fragmento de código basado en referencias de referencia Introducción al procesamiento de señales de Orfanidis. El texto completo está disponible en ese enlace, y [en el Apéndice B] tiene cobertura de generación de ruido rosa y blanco. Como menciona el comentario, Orfanidis cubre principalmente el algoritmo de Voss.

  • El espectro producido por el generador de ruido rosa Voss-McCartney . Muy cerca de la parte inferior de la página, después de una extensa discusión sobre las variantes del algoritmo Voss, este enlace está referenciado en letras rosadas gigantes . Es mucho más fácil leer que algunos de los diagramas ASCII anteriores.

  • Una bibliografía sobre el ruido 1 / f de Wentian Li. Esto se hace referencia tanto en la fuente de Peter como por JOS. Tiene un número vertiginoso de referencias sobre el ruido 1 / f en general, que se remonta a 1918.

Datageist
fuente
¿Alguna idea de cómo se le ocurrieron estos coeficientes de filtro? Supongo que es solo un ajuste no lineal a la pendiente deseada, pero me interesaría saber si hay un algoritmo más específico.
nibot
Mi mejor conjetura sería una de las técnicas de aproximación mencionadas en su tesis . Es una gran lectura de cualquier manera.
Datageist
¡Guau, eso es todo un documento! Gracias por el enlace.
nibot
1
El problema con el método de filtro de ruido blanco es que no se obtienen las mismas relaciones de fase de magnitud que con una serie temporal autocorrelacionada. Por lo tanto, si está tratando de emular procesos naturales, no debe generar ruido blanco y filtrarlo. En realidad, debe crear ruido autocorrelacionado como una serie temporal, es decir, el valor actual depende del valor anterior + ruido. Ver en estadísticas procesos "AR". Puede probar esto generando ruido usando ambos métodos, luego FFT, y graficar real versus imaginario (plano complejo del dominio de frecuencia). Notarás una gran diferencia en el patrón
Paul S
Hola Paul, bienvenido a DSP.SE. Si solo le importa cómo suena el ruido (en el trabajo de audio, por ejemplo), entonces el espectro de magnitud es la principal preocupación. Sin embargo, sería genial si pudieras detallar tus pensamientos en una nueva respuesta. No creo que tengamos nada en el sitio que describa esa técnica todavía.
Datageist
1

He estado usando el algoritmo de Corsini y Saletti desde 1990: G. Corsini, R. Saletti, "A 1 / f ^ gamma Generador de secuencia de ruido de espectro de potencia", IEEE Transactions on Instrumentation and Measurement, 37 (4), diciembre de 1988, 615 -619. El exponente gamma está entre -2 y +2. Funciona bien para mis propósitos. Ed

Si este intento de agregar una captura de pantalla funciona, la siguiente figura muestra un ejemplo de qué tan bien funciona el algoritmo de Corsini y Saletti (al menos como lo programé en 1990). La frecuencia de muestreo fue de 1 kHz, gamma = 1 y se promediaron 1000 PSD de 32k FFT.

PSD para 1 / f de ruido a través del algoritmo Corsini y Saletti


Esto sigue a mi publicación anterior sobre el generador de ruido Corsini y Saletti (C&S). Las siguientes dos figuras muestran qué tan bien funciona el generador C&S con respecto a la generación de ruidos de baja frecuencia (gamma> 0) y alta frecuencia (gamma <0). La tercera figura compara los PSD de ruido 1 / f del generador C&S (igual que mi primera publicación) y el generador 1 / f del Ejemplo B.9 que figura en el excelente libro del profesor Orfanidis (ecuación B.29, p. 736). Todos estos PSD son promedios de 1000 PSD de 32k FFT. Todos son unilaterales y sustraen la media. Para los PSD C&S, utilicé 3 polos / década y especifiqué 4 décadas (0.05 a 500 Hz) como el rango de uso deseado. Entonces el generador C&S tenía n = 12 polos y cero pares. La frecuencia de muestreo fue de 1 kHz, Nyquist fue de 500 Hz y el elemento de resolución fue de poco más de 0.0305 Hz. Ed V PSD de baja frecuencia PSD de alta frecuencia Comparación de 2 generadores de ruido 1 / f

Como afirman Corsini y Saletti en su artículo, FC10FMETRO, dónde FC es la frecuencia de muestreo y FMETROes el "límite superior de la banda de frecuencia en la que generaremos muestras de ruido". Los coeficientes del filtro digital están dados por sus ecuaciones (5.1):

unyo=miXpag[-2π10(yo-norte)/ /h-γ/ /2h-C]
siyo=miXpag[-2π10(yo-norte)/ /h-C]
donde c = 1. Para obtener PSD C&S como los que se muestran arriba, deje que c = 0 y FMETRO=0,5FC.

Ed V
fuente
1
Estado de Corsini y Saletti "Este filtro consta de N secciones de primer orden en cascada, cada una con un par polo-cero real" y los polos N están "distribuidos uniformemente con respecto al logaritmo de frecuencia con una densidad de polos h por década de frecuencia (p / d), y los ceros N siguen en consecuencia ". La sección de Discusión del documento fue excepcionalmente bien hecha, por lo que no hubo problema solo en programar lo que dijeron que hicieran. Todo lo que tengo es mi vieja copia impresa y una copia escaneada. Para el PSD anterior, utilicé 3 polos / década y el PSD está sustraído a la media y es unilateral. Ed V
Ed V