2012-04-16 16 views
8

Esto es en realidad una cuestión más teórica, pero aquí va:igual potencia de fundido cruzado en la Unidad de audio?

Estoy desarrollando una unidad de audio con efectos y necesita un fundido de igual potencia entre señales secas y húmedas.

Pero estoy confundido acerca de la forma correcta de hacer la función de mapeo desde el fader lineal al factor de escala (ganancia) para las amplitudes de señal de las corrientes secas y húmedas.

Básicamente, lo he visto hecho con funciones cos/sin o raíces cuadradas ... aproximando esencialmente curvas logarítmicas. Pero si nuestra percepción de la amplitud es logarítmica para empezar, ¿no deberían estas curvas mapear la posición del fader a una amplitud ser exponencial?

Esto es lo que quiero decir:

Supuestos:

  • signal[i]: es la muestra i-ésima en una señal.
  • cada muestra es un flotador que varía [-1, 1] para amplitudes entre [0,1].
  • nuestro control GUI es un NSSlider que va desde [0,1], por lo que es en principio lineal.
  • fader es una variable con el valor de NSSlider.

Primera Observación: Percibimos la amplitud de una forma logarítmica. Así que si tenemos un atenuador lineal y simplemente ajustan la amplitud de una señal haciendo: signal[i] * fader lo que estamos percibiendo (audiencia, independientemente de las matemáticas) es algo a lo largo de las líneas de:

enter image description here

Esta es la así llamado Crappy Fader-Effect: pasamos del silencio a un aumento drástico de volumen en el segmento más a la izquierda del control deslizante y más allá del medio, el volumen no parece ser más alto.

Así que para hacer el fader "a la derecha", en su lugar, lo expresamos en una escala de dB y luego, en lo que respecta a la señal, hacemos: signal[i] * 10^(fader/20) o, si tuviéramos que mantener unidades de fader en [0, 1], que podemos hacer: signal[i] * (.001*10^(3*fader))

de cualquier manera, nuestro nuevo mapeo de la NSSlider a la variable atenuador, que vamos a utilizar para multiplicar en nuestro código, se parece a esto ahora:

enter image description here

Que es lo que realmente queremos, porque como percibimos la amplitud logarítmicamente, somos esencialmente mappi ng desde lineal (rango NSSLider 0-1) a exponencial y alimentando esta salida exponencial a nuestra percepción logarítmica. Y resulta que: log(10^x)=x por lo que terminamos percibiendo el cambio de amplitud de una manera lineal (también correcta).

Genial.

Ahora, mi idea es que un fundido cruzado de igual potencia entre dos señales (en este caso un NSSlider horizontal seco/húmedo para mezclar la entrada al AU y la salida procesada del mismo) es esencialmente el mismo que con un deslizador que actúa en ambas señales hipotéticas seco [i] y húmedo [i].

Así que si mi control deslizante varía de 0 a 100 y seco es completamente a la izquierda y húmeda está lleno-derecha), que iba a terminar con el código en la línea de:

Float32 outputSample, wetSample, drySample = <assume proper initialization> 
Float32 mixLevel = .01 * GetParameter(kParameterTypeMixLevel); 
Float32 wetPowerLevel = .001 * pow(10, (mixLevel*3)); 
Float32 dryPowerLevel = .001 * pow(10, ((-3*mixLevel)+1)); 
outputSample = (wetSample * wetPowerLevel) + (drySample * dryPowerLevel); 

El gráfico de los cuales sería:

enter image description here

Y mismo que antes, porque percibimos amplitud logarítmica, esta aplicación exponencial en realidad debería hacerlo cuando oímos el fundido cruzado lineal.

Sin embargo, he visto implementaciones del crossfade usando aproximaciones para registrar curvas. Es decir, en su lugar:

enter image description here

Pero no estas curvas de hecho hincapié en nuestra percepción de la amplitud logarítmica?

+0

Sugiero que pregunte esto en el sitio de la hermana DSP: http://dsp.stackexchange.com/ –

+0

Creo que ya lo tengo pero ¡ojalá no supiera de ese sitio! – SaldaVonSchwartz

+0

Cool. Si lo resolvió, debe responder su propia pregunta: por mi parte, me gustaría saber la respuesta que se le ocurrió. –

Respuesta

7

El fundido cruzado de "potencia equivalente" que está pensando tiene que ver con mantener constante la potencia de salida total de su mezcla a medida que se desvanece de húmedo a seco. Mantener constante la potencia total sirve como una aproximación razonable para mantener la sonoridad percibida total constante (que en realidad puede ser bastante complicada).

Si está fundido entre dos señales no correlacionadas de igual potencia, se puede mantener una potencia de salida constante durante el fundido mediante el uso de cualquiera de las dos funciones cuyos valores al cuadrado sumar 1. Un ejemplo común de esto es el conjunto de funciones

.

g1 (k) = (0,5 + 0,5 * cos (pi * k))^5

g2 (k) = (0,5 - 0,5 x cos (pi * k))^5,

.

donde 0 < = k < = 1 (observe que g1 (k)^2 + g2 (k)^2 = 1 está satisfecho, como se mencionó). Aquí hay una prueba de que esto da como resultado un fundido cruzado de potencia constante para señales no correlacionadas:

Digamos que tenemos dos señales x1 (t) yx2 (t) con las mismas potencias E [x1 (t)^2] = E [x2 (t)^2] = Px, que tampoco están correlacionados (E [x1 (t) * x2 (t)] = 0). Tenga en cuenta que cualquier conjunto de funciones de ganancia que satisfaga la condición previa tendrá ese g2 (k) = (1 - g1 (k)^2) ^. 5. Ahora, la formación de la suma y (t) = g1 (k) * x1 (t) + g2 (k) * x2 (t), se tiene que:

E[ y(t)^2 ] = E[ (g1(k) * x1(t))^2 + 2*g1(k)*(1 - g1(k)^2)^.5 * x1(t) * x2(t) + (1 - g1(k)^2) * x2(t)^2 ] 
= g1(k)^2 * E[ x1(t)^2 ] + 2*g1(k)*(1 - g1(k)^2)^.5 * E[ x1(t)*x2(t) ] + (1 - g1(k)^2) * E[ x2(t)^2 ] 
= g1(k)^2 * Px + 0 + (1 - g1(k)^2) * Px = Px, 

donde hemos utilizado que g1 (k) y g2 (k) son deterministas y, por lo tanto, pueden extraerse del operador de expectativa E [], y que E [x1 (t) * x2 (t)] = 0 por definición, porque x1 (t) y x2 (t) se suponen estar incorrelado Esto significa que no importa dónde estemos en el fundido cruzado (sea cual sea el k que elijamos) nuestra salida todavía tendrá la misma potencia, Px, y con esto esperamos que sea igual a la percepción del volumen.

Tenga en cuenta que para señales completamente correlacionadas, puede lograr una potencia de salida constante haciendo un fundido "lineal", y dos funciones que suman una (g1 (k) + g2 (k) = 1). Cuando se mezclan señales que están un tanto correlacionadas, las funciones de ganancia entre esas dos serían teóricamente apropiadas.

Lo que está pensando en cuando se dice

Y mismo que antes, porque percibimos amplitud logarítmica, esta aplicación exponencial en realidad debería hacerlo cuando oímos el fundido tan lineal.

es que una señal debe disminuir perceptualmente de la intensidad como una función lineal de la posición de cursor (k), mientras que la otra señal debe aumentar perceptualmente de la intensidad como una función lineal de la posición de cursor, al aplicar su crossfade derivada. Si bien su derivación parece bastante acertada, desafortunadamente esa no sea la mejor manera de combinar sus señales secas y húmedas en términos de consistencia, a menudo, manteniendo un volumen sonoro igual, independientemente de la posición del control deslizante, es lo mejor para disparar. En cualquier caso, podría valer la pena probar un par de funciones diferentes para ver qué es más útil y consistente.

Cuestiones relacionadas