¿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?
¿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?
Respuestas:
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.
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:
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:
dónde
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.
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.
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
Como afirman Corsini y Saletti en su artículo, , dónde es la frecuencia de muestreo y es 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):