5 votos

Prevención de la saturación de la señal de audio

Estoy tratando de implementar un algoritmo en señales de audio. El algo que opera sobre la señal en un fotograma por fotograma. Una de las etapas intermedias requiere además de la señal de los cuadros anteriores. El fotograma de salida se satura al final de esta etapa.

Aclaración: El fotograma de salida de la operación de suma es el doble, aunque el resultado final del marco TIENE que ser en el corto plazo. Por tanto, el problema con la saturación.

He intentado lo siguiente para la prevención de la saturación:
1. duro de limitación: Limitar la muestra a un pre-definido max_val.
2. Normaliation: Calcular el máximo. de la trama y, a continuación, la escala de cada una de las muestras en el marco apropiadamente.

Ninguno de estos enfoques han trabajado desde que tengo para trabajar en un fotograma por fotograma.

Cualquier ayuda en la prevención de la saturación de señales es la mayoría de la recepción.

7voto

Binarytales Puntos 1145

Sus Intentos

Por definición, cuando "duro" límite de los valores en el código que está causando la saturación. Puede que no sea la saturación en el sentido de que se desborde de su corto, pero todavía distorsión de la onda cuando pasa por encima de un cierto punto. He aquí un ejemplo:

Saturation

Me doy cuenta de que probablemente no son difíciles de limitación en la parte inferior, pero yo ya había dibujado antes de que me di cuenta de que.

Así que, en otras palabras, la limitación dura método no funciona.

Ahora para el segundo enfoque, este método hará que hagas lo que oyen algunas personas realmente hacen intencionalmente. Usted está causando cada fotograma a ser tan alto como sea posible. Este método puede funcionar bien si usted consigue la escala de la derecha y están bien con su música sonando fuerte todo el tiempo, pero no es ideal para la mayoría de la gente.

Una Solución

Si usted sabe que el max efectiva posible ganancia que su sistema puede crear, se puede dividir a su entrada por esta cantidad. Para averiguar lo que esta sería tendrá a paso a través de su código y determinar cuál es el máximo de entrada es, darle una ganancia de x, averiguar cuál es el máximo de salida es en términos de x, y, a continuación, determinar lo que x debe estar en orden para no saturar. Se podría aplicar esta ganancia a su señal de audio entrante antes de hacer cualquier otra cosa.

Esta solución está bien, pero no es muy grande para todos, ya que su rango dinámico puede doler un poco, ya que generalmente no se ejecuta en el máximo de entrada todo el tiempo.

La otra solución es hacer un poco de auto-ganar. Este método es similar al método anterior, pero su ganancia va a cambiar a lo largo del tiempo. Para hacer esto usted puede comprobar su valor máximo de cada fotograma de su entrada. Usted va a utilizar va a almacenar este número y el lugar de un simple filtro de paso bajo en sus valores máximos y decidir qué ganancia para aplicar con este valor.

Aquí es un ejemplo de lo que su ganancia versus volumen de entrada sería:

auto-gain

Este tipo de sistema hará que la mayoría de sus archivos de audio de tener un alto rango dinámico, pero a medida que usted comienza a conseguir cerca de el volumen máximo que puede tener que reducir lentamente su ganancia.

El Análisis De Los Datos

Si desea averiguar qué tipo de valores que el sistema realmente es obtener, en tiempo real, entonces usted tendrá que tener algún tipo de salida de depuración. Esta salida variará en función de la plataforma de su ejecución, pero he aquí una esencia general de lo que iba a hacer. Si usted está en un entorno integrado, usted tendrá que tener un poco de la salida serial. Lo que va a hacer es en ciertas etapas en su código de salida a un archivo o la pantalla o algo que usted puede tomar los datos. Tomar estos datos y ponerlo en excel de matlab y el gráfico de todos ellos frente al tiempo. Usted probablemente muy fácilmente ser capaz de decir dónde está todo mal.

Método Muy Sencillo

Estás saturando su doble? No suena como que, en lugar de eso parece que están saturando al cambiar a un corto. Una forma muy sencilla y "sucio" manera de hacer esto es para convertir el máximo de su doble (este valor es diferente dependiendo de la plataforma) y la escala que para ser el máximo valor de su corto. Esto le garantiza que si no lo desbordamiento de su doble que usted no desbordamiento de su corta tampoco. Más probable es que esto va a resultar en que su salida es mucho más suaves después de su entrada. Usted sólo tendrá que jugar y utilizar algunos de los análisis de datos que he descrito anteriormente para que el sistema funcione perfectamente para usted.

Métodos más Avanzados que probablemente no se aplican a usted

En el mundo digital hay un trade-off entre la resolución y el rango dinámico. Lo que esto significa es que usted tiene un número fijo de bits dado a su audio. Si se disminuye el rango que el audio puede ser en, a continuación, aumente los bits por el rango que tiene. Si usted piensa acerca de esto en el sentido de voltios y tienen 0-5v de entrada y 10bit adc, a continuación, usted tiene 10bits para dar a 5v rango, normalmente esto se hace de manera lineal. Así 0b0000000000 = 0v, 0b1111111111 = 5v y linealmente asignar los voltajes a los bits. En realidad, con audio, este no siempre es un buen uso de sus bits.

En el caso de la voz, de la tensión frente a la probabilidad de los voltajes de ser algo como esto:

pdf

Esto significa que usted tiene un montón más de su voz en la disminución de la amplitud y sólo una pequeña cantidad en la alta cantidad. Así que en lugar de la asignación de los bits linealmente, puede reasignar su bits para tener más pasos en la disminución de la amplitud de la gama y, por tanto, menos en la parte superior del rango de amplitud. Esto le da a usted el mejor de ambos mundos, una resolución en donde la mayoría de sus archivos de audio, pero el límite de su saturación por el aumento de su rango dinámico.

Ahora, esta reasignación va a cambiar la forma de los filtros de actuar y probablemente tendrá que rehacer tus filtros, pero es por eso que este es en la sección "avanzado". También, ya que están haciendo su trabajo, con un doble y, a continuación, convertirlo a un corto, su corto probablemente necesitará ser lineal, de todos modos. Su doble ya le da mucha más precisión, a continuación, lo que a su corto le dará así que, probablemente, no hay necesidad de este método.

3voto

Jacob Griffin Puntos 126

Si esto es en todo similar a cómo los valores desbordan en C, por lo que ha hecho la incorporación, usted habría desbordado. Así usted necesita reducir a la mitad del fotograma actual y el valor anterior de marco que se va a agregar antes de que agregar, luego agregar, luego opcionalmente normalizar.

Pero en cualquier caso, usted tendrá un tiempo difícil mantener un nivel constante (compresión de audio) si usted tiene solamente un marco para trabajar a la vez, porque necesita un promedio de largo plazo que no salta alrededor.

3voto

bootload Puntos 379

Usted puede utilizar codificación predictiva Lineal para comprimir la señal hacia abajo en un "residual" y un filtro para recrear la trama de audio más adelante. Es bastante complicado, pero aquí es un buen papel. Si desea mantener el residual exactamente, este es un algoritmo de compresión sin pérdida. Usted también puede utilizar menos bits para codificar el residual y mantener una buena calidad.

J. Makhoul. Predicción lineal: Una revisión tutorial. Actas de la IEEE, 63(4):561-580 de abril de 1975.

Y un capítulo en DAFX ha algoritmos de MATLAB escrito para usted.

U. Zolzer, editor. DAFX - Digital de Efectos de Audio. John Wiley & Sons, Ltd, Baffins Lane, Chichester, West Sussex, PO 19 1UD, Inglaterra, 2002.

Básicamente, dada una señal de entrada fotograma se puede calcular la envolvente espectral y un valor residual. Ver las fotos de abajo, y tenga en cuenta la amplitud de los residuos. alt text alt text

Utilice el filtro de la segunda figura y darle el valor residual cuando se desea volver a crear el sonido. Aviso que el residuo tiene una relativamente estable de amplitud, y nota las unidades. Usted necesita ser capaz de codificar al menos que. El filtro es un "LTI" filtro y tiene buenas propiedades que probablemente se podría usar para combinar los fotogramas.

2voto

Jeremy Ruten Puntos 59989

@Kellenjb , gracias por las imágenes ... creo que me ayudó a entender las cosas en gran medida.

@Sriram , yo quisiera que decir unas palabras en cuanto a lo que usted desea iba a suceder.

Supongo que lo que usted desea pasaría algo así como "quiero una salida que siempre es tan fuerte como sea posible -- justo en el borde de la saturación. Pero no quiero que el volumen de cambiar radicalmente de un fotograma al siguiente. Quiero que el volumen cambie más como un ser humano aumentando lentamente la perilla de volumen durante las partes más silenciosas, y algo más rápidamente bajar el volumen cuando se inicia el clip. Pero yo no quiero un humano real a gire la perilla de volumen -- quiero que el software para ajustar automáticamente el volumen para mí."

También estoy suponiendo que el sistema necesita para escupir un marco de datos dentro de un marco o dos de llegar en un marco de datos, en tiempo real, así que no se me permite analizar toda la canción, y después elija el perfecto nivel de volumen y mantenerla constante a lo largo de toda la canción.

Así que supongo que se desea establecer una línea algo como esto:

(1) Una rutina de interrupción recoge los datos en un búfer. A menudo la gente set de 2 marcos de la pena de almacenamiento: Esta rutina lentamente se llena de un marco, mientras que la siguiente etapa, se trabaja con datos en el otro marco. Luego, cuando el marco se completa ping-ping búfer doble interruptor para llenar el otro marco, mientras que las próximas etapas de ponerse a trabajar con el marco. Algunas personas haciendo algoritmos tales como finita (FIR) de los filtros de búfer de muchos, muchos marcos de la pena de almacenamiento de aquí.

(2) En el "fondo" del bucle principal, el software se ejecuta algún algoritmo DSP en la última "completo" búfer de entrada y generar algunos resultados de salida en el buffer de salida. A menudo la gente set de 2 marcos de la pena de salida en el buffer de almacenamiento, por lo que esta rutina se llena rápidamente en uno de los fotogramas de salida, mientras que el siguiente etapas lentamente drenaje de datos desde el marco, con una mesa de ping-pong de doble búfer esquema. Algunas personas haciendo algoritmos tales como infinita (IIR) filtros de búfer de muchos, muchos marcos de la pena de almacenamiento con estos valores de salida. La mayoría de las veces, el DSP algoritmo toma como entrada el anterior salidas de esta etapa, no las salidas de las etapas siguientes. Esta etapa es en donde la mayoría de las personas tienen problemas con la saturación y la saturación, por lo que la mayoría de las respuestas que me vea aquí se centran en este paso. Pero a partir de sus respuestas, parece que ya has descubierto que tienes necesidad de un amplio tipo de datos con muchos "extra" bits de precisión para calcular estos valores intermedios.

(3) En el bucle principal, el software se multiplica cada valor de la estructura intermedia por algún factor de escala V para generar un "valor de escala". (No , no , este valor se almacena en cualquier tampón).

(4) En el bucle principal, el software reduce cada "valor de escala" para el final el tipo de salida (8 bits?) requerido por el dispositivo de salida, y almacenar el resultado en otro buffer. (La salida de esta etapa, casi seguro que no se alimenta de nuevo en el algoritmo DSP en el paso 2. "El BTC de Sonido Codificador" de Roman Negro es uno de los muy pocos algoritmos sé de donde tal información es útil).

(5) Una rutina de interrupción se lleva una muestra a la vez desde el búfer de salida (4), y escupe hacia fuera para el dispositivo de salida. (Esto también puede utilizar un doble buffer ping-pong acuerdo). A menudo la entrada de frecuencia de muestreo y la tasa de muestreo de salida son los mismos (44100 Muestras/s), y la misma rutina de interrupción (5) y (1).

A partir de su respuesta a Martin, me da la impresión de que un determinado volumen fijo de configuración V1 V puede ser adecuada para una canción, y algunos otros fijos ajuste de volumen V2 puede ser adecuada para alguna otra canción. Imagina que puedes escuchar la canción entera, y calcular un volumen perfecto para esa canción -- ¿cómo lo harían? Está bien si un par de muestras de la canción saliera?

Tal vez algo como esto relativamente simple control automático de ganancia (AGC o VOGAD) podría resolver tu problema:

  • Cada vez que la etapa 2 de los acabados de la producción de un marco, calcular un nuevo valor V que serán utilizados a escala de las muestras en el marco durante el paso 3. Una de las maneras más sencillas: encontrar el más positivo (máximo) valor y más valor negativo en ese marco, y multiplicar ambos valores por la actual V que fue utilizado para el marco anterior. Comprobar si la muestra clip (es decir, el resultado es superior a +127 o por debajo de -127) o están cercanas a la saturación (es decir, por encima de los +63 o por debajo de -63), y ajustar el volumen multiplicador VM adecuadamente:

    • Si el volumen es demasiado bajo (ninguna de las muestras de clip, en ninguna de las muestras se encuentran en cualquier lugar cerca de la saturación), ajustar el volumen multiplicador para un número ligeramente mayor de 1: VM = VM_UP, donde VM_UP es algo así como 1.01 o 1 + 2^(-12).

    • Si el volumen es demasiado alto (algunas de las muestras de clip, o muchas de las muestras son demasiado cerca de la saturación, o ambos), ajustar el volumen multiplicador de VM a un número ligeramente menor que 1: VM = VM_DOWN, donde VM_DOWN es algo así como 0.98 o 1 - 2^(-8).

    • Si el volumen se ve bien (no alto, ni muy bajo) mantener VM = 1.

  • Periódicamente (idealmente una vez por cada una de las muestras, pero si que come mucho tiempo una vez por fotograma o una vez por milisegundo o una vez cada décima de segundo puede ser suficiente), re-ajustar el volumen con una saturación de multiplicar:

    • V := (V * VM).
    • Si V es demasiado pequeño (menos de V_min), conjunto V := V_min.
    • Si V es ahora demasiado grande (más de V_max), conjunto V := V_max.

Usted querrá modificar las constantes de tiempo de compilación VM_UP y VM_DOWN hasta que subjetivamente "suena bien". Quizás conjunto VM_DOWN de modo que, con muy fuertes entradas, se tarda un segundo o dos para hacer girar la perilla de volumen del volumen máximo para el volumen mínimo. Quizás conjunto VM_UP de modo que, con absoluto silencio, se tarda diez segundos o así que muy lentamente gire la perilla de volumen del volumen mínimo para el volumen máximo.

Usted puede garantizar que nunca se saturan al instante, reduciendo el volumen V cada vez que un marco similar puede saturar, de tal manera que (con la reducción en el volumen V) es apenas éxitos de los picos de +127 o -127. Pero sospecho que va a sonar mejor a reducir lentamente el volumen, y permitir que un par de muestras para saturar para unos pocos fotogramas.

Hay una amplia variedad de más formas complicadas (a) de la envoltura/pico/"percepción de la sonoridad" de detección: calcular un número que indica si un marco de datos es demasiado fuerte o demasiado suave, y por cuánto. También hay una amplia variedad de más formas complicadas para un AGC (b) usa el número del fotograma actual (y tal vez de los últimos fotogramas) y el volumen utilizado durante el último fotograma con el fin de calcular el volumen a utilizar para el siguiente fotograma.

Leer más:

1voto

Dan Puntos 12178

Yo lo tome usted está teniendo para llevar sobre el resultado, porque se están haciendo en tiempo real dsp con audio.

He visto este problema antes, cuando los estudiantes hacen un error en la forma de llevar sobre el resultado de la idft. A menudo incorrectamente llevar las cosas y al final terminan provocando una continua acumulación. Basado en su comentario a martin que parecen haber evitado esto.

En segundo lugar, Esta es la razón por la radio tiene una perilla de volumen tienes que usar. Al cambiar las estaciones de radio de una emisora cercana a uno que está lejos de tener que cambiar lo que su nivel de volumen es para escuchar en el mismo volumen. Yo sugeriría agregar un usuario controlable la perilla de ganancia, luego, si se satura es en su control para cambiar. Un usuario normalmente hace esto automáticamente a medida que se vuelve más fuerte a medida que no le gusta. Ellos también van a activar cuando sea necesario.

Esta perilla iba a cambiar lo que están reduciendo sus valores. Espero que esto ayude, con más información sobre su solicitud de que yo podía dar otro tipo de ayuda. Puede crear una respuesta muy lenta media Baja filtro de paso Bajo) que lleva muchos marcos para cambiar significativamente y utilizarlo para dar el control de ganancia. Esto significa un pico provocará la saturación, pero si el audio de los cambios de volumen poco a poco podrá compensar fácilmente. Incluso si el audio se cambia rápidamente, este tipo de filtro que se va a guardar el usuario girar hacia arriba y abajo si cada nivel de volumen relativo se mantiene durante un período prolongado.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X