Algoritmo (s) para mezclar señales de audio sin recorte

49

Me gustaría mezclar dos o más canales de audio PCM (por ejemplo, muestras grabadas) digitalmente de una manera acústicamente fiel, preferiblemente en tiempo casi real (lo que significa poco o ningún adelanto).

La forma físicamente "correcta" de hacer esto es sumar las muestras. Sin embargo, cuando agrega dos muestras arbitrarias, el valor resultante podría ser hasta dos veces el valor máximo.

Por ejemplo, si sus muestras son valores de 16 bits, el resultado será hasta 65536 * 2. Esto da como resultado el recorte.

La solución ingenua aquí es dividir por N, donde N es el número de canales que se mezclan. Sin embargo, esto da como resultado que cada muestra sea 1 / Nth tan alta, lo que es completamente poco realista. En el mundo real, cuando dos instrumentos se tocan simultáneamente, cada instrumento no llega a la mitad de volumen.

A partir de la lectura, un método común de mezcla es: resultado = A + B - AB, donde A y B son las dos muestras normalizadas que se mezclan, y AB es un término para garantizar que los sonidos más fuertes sean cada vez más "suaves".

Sin embargo, esto introduce una distorsión de la señal. ¿Es aceptable este nivel de distorsión en la síntesis de audio de alta calidad?

¿Qué otros métodos hay para resolver este problema? Estoy interesado en algoritmos eficientes de menor calidad, así como algoritmos menos eficientes de alta calidad.

Estoy haciendo mi pregunta en el contexto de la síntesis de música digital, con el propósito de mezclar múltiples pistas de instrumentos. Las pistas pueden ser audio sintetizado, muestras pregrabadas o entrada de micrófono en tiempo real.

Bryhoyt
fuente
Me pregunto con qué frecuencia es posible evitar el recorte simplemente cambiando un poco el tiempo de las señales.
Sebastian Reichelt
Buena idea, aunque sospecho que no es tan simple, especialmente cuando no tienes mucha anticipación (por ejemplo, en tiempo real). El problema es que debe conocer la muestra de antemano para saber qué tipo de cambio de tiempo sería apropiado. Dicho esto, en la mayoría de la música, tendría una alta probabilidad de correlación, por lo que un poco de cambio de tiempo aleatorio podría funcionar muy bien. ¿Alguien tiene alguna experiencia a la que recurrir aquí?
bryhoyt
2
@bryhoyt: los mezcladores reales suman las señales juntas. Eso es. No se requieren demoras de tiempo ni procesamiento no lineal. El recorte no es un problema porque las señales originales no eran tan fuertes.
endolito el
2
16 + 16 bits = 17 bits ;-)
nikwal
1
solo divídalo por el número de entradas, luego el recorte no será posible. y si el sonido es demasiado bajo, suba el amplificador ...
Sarge Borsch

Respuestas:

14

Es muy difícil señalarle técnicas relevantes sin conocer el contexto de su problema.

La respuesta obvia sería decirle que ajuste la ganancia de cada muestra para que rara vez se produzca recorte. No es tan poco realista suponer que los músicos tocarían más suavemente en un conjunto que cuando se les pide que toquen solo.

La distorsión introducida por A + B - AB simplemente no es aceptable. Crea imágenes especulares de A en cada lado de los armónicos de B, equivalente a la modulación en anillo, lo cual es bastante horrible si A y B tienen un espectro rico con armónicos que no están en relaciones enteras. Pruébelo en dos ondas cuadradas a 220 y 400 Hz, por ejemplo.

Una función de recorte más "natural" que funciona muestra por muestra es la función tanh, que en realidad coincide con el comportamiento limitante suave de algunos elementos analógicos. Más allá de eso, puede analizar las técnicas clásicas de compresión dinámica: si su sistema puede mirar hacia adelante y ver picos por adelantado, esto es aún mejor.

pichenettes
fuente
44
Adiciones y recorte duro. Solo mira cualquier reproductor de código abierto. El uso de una adición a la mezcla, con entradas a escala apropiadamente para reducir al mínimo el recorte, y luego un disco limitador (opcionalmente suave) es la norma, no la excepción ...
pichenettes
44
En la mayoría de las situaciones, no es responsabilidad del desarrollador resolver el problema. Le da al usuario / compositor la posibilidad de ajustar el volumen de cada canal, y depende del usuario hacer la mezcla para que el recorte sea aceptable para ellos. Por ejemplo, en Renoise, por defecto, la ganancia de cada instrumento / nota es 1 y las cosas comienzan a recortarse mal al agregar pistas: depende del usuario ajustar el volumen de las notas o instrumentos en el módulo para evitar el recorte en el pista maestra (a menos que se desee). Aquí hay una captura de pantalla que muestra eso: i.imgur.com/KVxDt.png .
pichenettes
2
IIRC, FastTracker fue más conservador, ya que aplicó una atenuación en cada pista, y luego tuvo una "ganancia de maquillaje" global en el diálogo de preferencias de x1 a x32. Recuerdo que cuando tuve que renderizar todos mis módulos a .WAV para un CD, tuve que probar los valores de la ganancia hasta que encontré el más bajo que no causó recorte ...
pichenettes
2
En cuanto al nivel de atenuación, en caso de que no pueda tener un usuario en el bucle; 1/32 es un nivel absolutamente seguro (sin recorte). Suponiendo que los canales no están correlacionados (lo cual no es muy cierto para la música, más correcto cuando se mezclan ambientes de fondo), un valor de 1 / sqrt (32) sería un buen compromiso entre el volumen y la probabilidad de recorte. La mejor solución sería utilizar 1/32 y luego procesar sus muestras con un compresor dinámico.
pichenettes
3
Adiciones Eso es lo que hacen los mezcladores de hardware de todos modos y es la forma en que la gente espera que las cosas se comporten. Los mezcladores de nivel de sistema simplemente se acortan. Sería un gran problema si los controladores del sistema implementaran algún tipo de procesamiento no lineal: me imagino el dolor de dominar a los ingenieros que intentan averiguar si lo que escuchan es su configuración de plug-in de compresor o algún procesamiento dinámico a nivel de sistema. El software de producción musical ofrece una amplia paleta de complementos de compresión dinámica, depende de los usuarios asegurarse de que su mezcla no se acorte.
pichenettes
16

La forma físicamente "correcta" de hacer esto es sumar las muestras. Sin embargo, cuando agrega dos muestras arbitrarias, el valor resultante podría ser hasta dos veces el valor máximo. ... La solución ingenua aquí es dividir por N, donde N es el número de canales que se mezclan.

Esa no es la solución "ingenua", es la única solución. Eso es lo que hace todo mezclador analógico y digital, porque es lo que hace el aire y es lo que hace tu cerebro.

Desafortunadamente, esto parece ser un error común, como lo demuestran estos otros algoritmos incorrectos no lineales de "mezcla" (distorsión):

El "dividir por N" se llama altura libre ; El espacio adicional para picos que se asigna por encima del nivel RMS de la forma de onda. La cantidad de espacio libre requerido para una señal está determinada por el factor de cresta de la señal . (La incomprensión de los niveles de señal digital y el espacio para la cabeza probablemente sea en parte responsable de la guerra de Loudness y Elephunk ).

En hardware analógico, la altura libre es quizás de 20 dB. En un DSP de hardware, el punto fijo se usa a menudo, con un margen fijo; SigmaDSP de AD , por ejemplo, tiene 24 dB de altura libre. En el software de la computadora, el procesamiento de audio generalmente se realiza en coma flotante de 32 bits, por lo que el margen de maniobra es enorme.

Idealmente, no necesitaría dividir por N en absoluto, simplemente sumaría las señales juntas, porque sus señales no se generarían a 0 dBFS en primer lugar.

Tenga en cuenta que la mayoría de las señales no están correlacionadas entre sí, de todos modos, por lo que es poco común que todos los canales de un mezclador interfieran de manera constructiva en el mismo momento. Sí, mezclar 10 ondas sinusoidales idénticas en fase aumentaría el nivel de pico en 10 veces (20 dB), pero mezclar 10 fuentes de ruido no coherentes solo aumentará el nivel de pico en 3,2 veces (10 dB). Para señales reales, el valor estará entre estos extremos.

Para obtener la señal mixta de un DAC sin recorte, simplemente reduzca la ganancia de la mezcla. Si desea mantener el nivel RMS de la mezcla alto sin recorte fuerte, deberá aplicar algún tipo de compresión para limitar los picos de la forma de onda, pero esto no es parte de la mezcla, es un paso separado. Primero se mezcla, con mucho margen, y luego se somete a compresión de rango dinámico más tarde, si lo desea.

endolito
fuente
1
Entiendo estos conceptos, pero no estoy seguro de que sea del todo correcto. Claro, si agrego un montón de muestras de 16 bits, 32 bits me dan un montón de espacio numérico. Pero aún tengo que reproducir la mezcla resultante a un volumen normalizado en un sistema de sonido del mundo real. Quiero que 2 canales suenen más fuerte que cada canal reproducido por separado, pero no quiero recortar. Hacer mis sumas en 32 o incluso 64 bits no ayuda con esto. Tal vez estoy empezando a responder mi propia pregunta: las muestras originales deberían normalizarse a un nivel más silencioso que la amplitud máxima. Como sugieres, deja un poco de espacio para mezclar.
bryhoyt
3
@bryhoyt: Sí, pero también debes recordar que las ondas rara vez se correlacionan entre sí, por lo que sumar 5 sonidos no hace que los picos sean 5 veces más altos.
endolito
1
Gracias, @endolith, supongo que eso es realmente el corazón de todo esto, y me explica por qué no es un problema tan grande como pensé por primera vez.
bryhoyt
Entonces, si 10 fuentes no coherentes dan 10 dB, ¿dividir por sqrt (número de fuentes) sería una heurística razonable? Es decir, si tiene 3 fuentes, ¿sumarlas y dividir por sqrt (3)? (perdón por comentar sobre un hilo antiguo)
nerdfever.com
@ nerdfever.com Así es como se combinan los niveles de RMS, entonces ... ¿probablemente?
endolito
6

la formula

result=A+BAB

no tiene ningún sentido, incluso si usted se refiere a algo que no sea . Una cosa en la que debe pensar es que el sonido varía por encima y por debajo de cero. Una mejor manera de pensarlo es así:AB=AB

result=g(A+B)

donde .g1

El enfoque más simple es decir , que es conservador, lineal y siempre funciona, pero puede que no sea tan "ruidoso" como desee. Un enfoque menos conservador que "generalmente funciona" y es "más ruidoso" es . Las extensiones a más canales con este enfoque funcionan mejor.g=0.5g=1/2

Alternativamente, puede cambiar con el tiempo, en cuyo caso suele ser el resultado de un algoritmo de compresor / limitador. Entonces realmente tienes una ecuación de diferencia:g

result[i]=g[i](A[i]+B[i])

g[i] es una continuación, en función de la anterior , , y .ABgresult

Quizás esto:

g[i]=f(A[i]+B[i],g[i1])

ACTUALIZACIÓN: Como lo sugiere hotpaw2, puede retrasar la señal de entrada pero no la supresión de ganancia. Esto se llama un "limitador de anticipación".

Bjorn Roche
fuente
Por "AB" quiero decir "A * B". Entiendo que la amplitud puede ser positiva o negativa. Tienes razón, mi ecuación no tiene mucho sentido para la combinación de amplitudes negativas.
bryhoyt
Tengo que mezclar 8 a 10 (N) diferentes ondas sinusales. Empíricamente, sabía que el valor correcto era alrededor de 0.3 ... 1 / √N parece correcto ... ¿algún enlace a por qué es correcta esa fórmula?
Zibri
5

Una forma en que esto se puede hacer para la mezcla en tiempo no real es usar un AGC anticipado, donde la ganancia de uno o ambos canales se reduce a una velocidad difícil de percibir antes de que la amplitud de la suma exceda el límite de recorte. Mientras menos anticipación esté disponible, el ajuste de ganancia de AGC se volverá más audible o la ganancia máxima para una rampa de ajuste de ganancia más suave se acercará más y más a 0.5 por canal en el límite. Para las fuentes de sonido con cierta previsibilidad, también se podrían usar estadísticas sobre el comportamiento de la envolvente a lo largo del tiempo para adivinar de forma adaptativa un límite de ganancia, pero con alguna probabilidad de falla (que sería un ajuste abrupto de ganancia de AGC).

hotpaw2
fuente
Este es un limitador de anticipación, no un AGC de anticipación.
Bjorn Roche
2
@BjornRoche: ¿No se puede considerar un limitador como un tipo de AGC?
endolito el
Algunos limitadores son AGC, pero un limitador anticipado no es un AGC.
Bjorn Roche
1
@BjornRoche bueno, es automático y controla la ganancia ...
Olli Niemitalo
2

Había hablado con un diseñador de mezcladores de finales de los 90 y primeros 2000 que estaba pasando por la ola digital (después de caminar de puntillas). Creo que el tipo fue diseñador para SPL, pero tal vez no tan grande, no recuerdo ni el nombre ni la marca, solo recuerdo cuán realmente grande y costosa era la máquina.

Hablamos mucho y finalmente hablamos sobre las técnicas para garantizar realmente que sus canales de 64/128 @ 24 bits mezclados permanecieran como un canal de salida mezclado preciso de 24 bits sin recorte.

La técnica que explicó fue bastante simple. Las 64 pistas (en 24 bits) se agregaron en un canal de 48 bits, donde el recorte no puede ocurrir. Derecho.

No puedo decir cómo esa señal se desvió 48 a 24 bits. Tal vez ahí es donde se aplican las complicadas recetas de cocina.

Y quizás haya muchas técnicas para lograrlo, sobre todo diferentes, ya sea en tiempo real o con la señal ya registrada con picos altos fáciles de determinar ... creo que todo tipo de normalizaciones.

Stephane Rolland
fuente
2

Bajar el volumen global. El rastreador de impulsos produce, de forma clásica, canales con aproximadamente un 33% de volumen máximo de forma predeterminada.

Eso parece ser lo suficientemente alto para la música con pocos canales (MOD de Amiga de 4 canales) y lo suficientemente suave para las canciones con 50 canales (ya que los contenidos del canal generalmente no están correlacionados, por lo que el volumen no aumenta tan rápido más allá de cierto nivel ... más pocos canales saldrán al volumen máximo con esa cantidad de cosas que están sucediendo). También deja suficiente espacio para los canales panorámicos de izquierda o derecha (que usan el 66% del rango).

Además, no desea agregar sus canales juntos en 16 bits, desea agregarlos juntos en 32 bits, luego recortar el resultado y reducirlo a 16 bits al final. Necesitará el rango más alto para que no se ajuste mientras hace los cálculos. Otra opción es usar un punto flotante de 32 bits (que es conveniente para hacer filtros, efectos, etc.).

Hubert Lamontagne
fuente
0

Creo que la clave es que, si tiene valores de 16 bits y está sumando 2 valores juntos que potencialmente podrían ser más que el valor máximo, entonces tiene 2 opciones:

1) convierta ambos a la suma de 32 bits y luego devuelva el valor máximo si la suma excede ese valor. Luego vuélvalo a 16 bits. Por ejemplo, si sus valores son 32768 y 34567, excede 65535 y la clave es devolver 65535. Haría lo mismo si usara valores firmados en el extremo de valor mínimo.

2) comprima ambos valores, luego agréguelos juntos.

El primero es esencialmente un recorte duro, el segundo es un recorte suave. Los sistemas analógicos son todo recorte duro.

Wogster
fuente
0

Solo serán el doble del espacio si las frecuencias en ambas pistas ocupan la misma frecuencia espacial. Use la ecualización y la compresión para evitar esto, esculpiendo áreas del espectro de frecuencia para cada sonido y controlando los transitorios y los sostenidos de los sonidos para que todo salga donde debería. Quizás eso no responda la pregunta sin embargo. Puede retrasar las señales de baja frecuencia hasta 2 ms. No se cancelará a través de la fase porque las longitudes de onda son más largas que las frecuencias más altas y agregará espacio porque los transitorios no están completamente a tiempo con las señales de graves que necesitan mucha potencia. Algo que agregue linealmente más demora cuanto menor sea la señal sería interesante probar.

Max Cherry
fuente
-1
A + B + {
    (|A| = A) = (|B| = B) = true: -AB;
    (|A| = A) = (|B| = B) = false: AB;
    else: 0
}

Es decir, si A y B comparten un signo, aplique un desplazamiento limitante. La magnitud del desplazamiento es el producto de A y B. La dirección del desplazamiento es opuesta a la de A y B.

Si A y B no comparten un signo, no se aplica ningún límite, ya que no hay forma de desbordamiento.

Rich Remer
fuente
Tenga en cuenta que esto no es conmutativo. Si desea mezclar más de 2 voces, debe mezclarlas todas a la vez. En este caso, debe "aplanar" todo en una dirección (si es demasiado alto, aplanar los valores positivos con los negativos; si es demasiado bajo, aplanar los valores negativos con los positivos). Una vez que haya contabilizado el desplazamiento (aplicado proporcionalmente a los valores restantes); use el enfoque binario, pero escale el limitador en función del número de valores mixtos.
Rich Remer
-1

Mi sugerencia:

  1. Convierta el formato de audio de pista de punto fijo de 16 bits a punto flotante de 32 bits.
  2. Agregue el valor de muestra actual de todas las pistas a mezclar.
  3. No hagas nada más.

Es posible que el usuario desee procesar esta secuencia mixta con compresión y / o limitación antes del tramado y la reconversión al formato de punto fijo de 16 bits (suponiendo que esta conversión ... la mezcla para entregar a los ingenieros de masterización generalmente se deja en un formato de resolución más alta)

aaron pavo real
fuente
2
Hola y bienvenidos a DSP.se. Le agradecemos por intentar contribuir, pero no creo que esto responda en absoluto a la pregunta del OP. El OP no mencionó a los "usuarios" de su sistema: podría estar jugando solo o escribiendo el programa según requisitos específicos. Lamento hacer un voto negativo: me complacerá revisar mi voto si hace que su respuesta sea más precisa. Además, cuide su formato: consulte las preguntas frecuentes para ver cómo escribir buenas respuestas.
Penélope