Como faço para atenuar um arquivo WAV por um determinado valor de decibéis?

StackOverflow https://stackoverflow.com/questions/1149092

  •  18-09-2019
  •  | 
  •  

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

Actualizar : fórmula (com base na resposta de Nilo Pipenbrinck) para atenuar por um determinado número de decibéis (inserido como um número positivo, por exemplo, 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;
    }
}

Então, se eu quiser para atenuar por 20 decibéis, o fator de ganho é 0,1 .

Foi útil?

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

Se você quer apenas adust algum áudio, eu tive bons resultados com o pacote normalize de nongnu.org. Se você quer estudar como ele é feito, o código fonte está disponível livremente. Eu também usado wavnorm , cuja página de casa parece estar fora no momento.

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top