2009-07-19 9 views
8

Si quisiera reducir la amplitud de un archivo WAV en un 25%, me gustaría escribir algo como esto:¿Cómo atenúo un archivo WAV con un valor de decibel determinado?

for (int i = 0; i < data.Length; i++) 
{ 
    data[i] *= 0.75; 
} 

Una gran cantidad de los artículos que he leído en técnicas de audio, sin embargo, hablar de amplitud en términos de decibelios. Entiendo la naturaleza logarítmica de las unidades de decibeles en principio, pero no tanto en términos de código real.

Mi pregunta es: si quisiera atenuar el volumen de un archivo WAV digamos 20 decibeles, ¿cómo haría esto en código como en el ejemplo anterior?

actualización: fórmula (basado en la respuesta de Nils Pipenbrinck) para atenuar por un número determinado de decibelios (entró como un número, por ejemplo positivo 10, 20, etc.):

public void AttenuateAudio(float[] data, int decibels) 
{ 
    float gain = (float)Math.Pow(10, (double)-decibels/20.0); 
    for (int i = 0; i < data.Length; i++) 
    { 
     data[i] *= gain; 
    } 
} 

Así, si quiero para atenuar por decibeles, el factor de ganancia es .1.

+0

@sth: ¿cómo te atreves a editar mi pregunta? Solo por eso, te estoy dando un desorden de insignias y una "k" después de tu representante. – MusiGenesis

+2

':)' – sth

Respuesta

11

Creo que quieres convertir de decibeles a ganancia.

Las ecuaciones para audio son:

decibelios para obtener:

gain = 10^(attenuation in db/20) 

o en C:

gain = powf(10, attenuation/20.0f); 

Las ecuaciones convertir de ganancia para db son:

attenuation_in_db = 20 * log10 (gain) 
+0

¿Quiere ganancia de voltaje o ganancia de potencia para la conversión? Nunca puedo recordar. – Nosredna

+2

Creo que es ganancia de voltaje. Nils parece tener razón. Fuente: http://www.sengpielaudio.com/calculator-gainloss.htm – Nosredna

+0

Gracias, Nils. Siempre aprendo mejor con una buena fórmula que con cualquier otra cosa. – MusiGenesis

1

Si ju Para agregar algo de audio, he obtenido buenos resultados con el paquete normalize de nongnu.org. Si desea estudiar cómo se hace, el código fuente está disponible gratuitamente. También utilicé wavnorm, cuya página de inicio parece no estar disponible en este momento.

+0

Esto es en realidad para un sintetizador de software, para normalizar notas en diferentes tonos. El paquete de normalización en su enlace solo usa RMS, que no cambia significativamente a medida que varío el tono (no tengo idea de lo que hace wavnorm). He descubierto que atenuar el volumen de una nota en aproximadamente 5 decibelios (usando la función de Nils) por octava por encima de un tono base da como resultado un volumen percibido constante en todo el rango de una escala. – MusiGenesis

1

Una cosa a tener en cuenta: los archivos WAV tienen MUCHOS formatos diferentes. El código anterior solo funciona para WAVE_FORMAT_FLOAT. Si está tratando con archivos PCM, sus muestras van a ser enteros de 8, 16, 24 o 32 bits (PCM de 8 bits utiliza enteros sin signo desde 0..255, PCM de 24 bits puede empaquetarse o desempaquetarse (empaquetado == Valores de 3 bytes empaquetados uno junto al otro, desempaquetados == 3 valores de bytes en un paquete de 4 bytes).

Y luego está la cuestión de las codificaciones alternativas: por ejemplo, en Win7, todos los sonidos de Windows son en realidad archivos MP3 en un Contenedor WAV

Desafortunadamente no es tan simple como parece :(.

+0

Lo sentimos, "archivo WAV" fue solo una abreviatura de datos de audio muestreados, genéricamente. Sé todo sobre los formatos de archivo WAV y MP3, aunque debo decir que nunca me he encontrado con archivos PCM de 24 bits o 32 bits en la naturaleza. – MusiGenesis

+0

Estoy tratando de adivinar cuál sería el propósito de un archivo PCM WAV desempaquetado de 24 bits. Me refiero a grabar la salida de un mezclador de 24 bits, supongo? – MusiGenesis

+0

Acabo de terminar de leer una buena parte de tu blog. Como programador de audio, me inclino ante ti. :) – MusiGenesis

1

Vaya no he entendido bien la pregunta ... Se puede ver mis implementaciones pitón de la conversión de dB a un flotador (que se puede utilizar como un multiplicador de la amplitud como usted muestra arriba) y viceversa

https://github.com/jiaaro/pydub/blob/master/pydub/utils.py

En pocas palabras es:

10^(db_gain/10) 

así para reducir el volumen por 6 dB tendría que multiplicar la amplitud de cada muestra por:

10^(-6/10) == 10^(-0.6) == 0.2512 
Cuestiones relacionadas