Como faço para atenuar um arquivo WAV por um determinado valor de decibéis?
Pergunta
Se eu quisesse reduzir a amplitude de um arquivo WAV em 25%, eu iria escrever algo como isto:
for (int i = 0; i < data.Length; i++)
{
data[i] *= 0.75;
}
Muitos dos artigos que li sobre técnicas de áudio, no entanto, discutir amplitude em termos de decibéis. Eu entendo a natureza logarítmica de unidades de decibéis em princípio, mas não tanto em termos de código real.
A minha pergunta é: se eu quisesse atenuar o volume de um arquivo WAV, digamos, 20 decibéis, como eu faria isso no código como o meu exemplo acima
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;
}
}
Então, se eu quiser para atenuar por 20 decibéis, o fator de ganho é 0,1 .
Solução
Eu acho que você deseja converter de decibéis para o ganho.
As equações para áudio são:
decibéis para ganhar:
gain = 10 ^ (attenuation in db / 20)
ou em C:
gain = powf(10, attenuation / 20.0f);
As equações converter de ganho para db são:
attenuation_in_db = 20 * log10 (gain)
Outras dicas
Uma coisa a considerar: arquivos .WAV têm formatos diversos. O código acima só funciona para WAVE_FORMAT_FLOAT. Se você está lidando com arquivos PCM, então suas amostras vão ser 8, 16, 24 ou 32 bit inteiros (8 bits PCM usa inteiros sem sinal de 0..255, 24 PCM bit pode ser embalados ou não (embalado == 3 valores de byte embalada ao lado do outro, desempacotado == valores 3 bytes num pacote de 4 bytes).
E depois há a questão das codificações alternativas - Por exemplo, no Win7, todos os sons do Windows são realmente arquivos de MP3 em um recipiente WAV
.Não é, infelizmente, tão simples quanto parece:. (
Oops eu mal entendido a pergunta ... Você pode ver as minhas implementações de python de conversão de dB para um float (que você pode usar como um multiplicador sobre a amplitude como você mostrar acima) e vice-versa
https://github.com/jiaaro/pydub/blob/ master / pydub / utils.py
Em poucas palavras, é:
10 ^ (db_gain / 10)
de modo a reduzir o volume em 6 dB, multiplicaria a amplitude de cada amostra por:
10 ^ (-6 / 10) == 10 ^ (-0.6) == 0.2512