Как ослабить wav-файл на заданное значение децибела?

если бы я хотел уменьшить амплитуду WAV-файла на 25%, я бы написал что-то вроде этого:

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

много статей я читала о методах аудио, обсудить амплитуды в децибелах. Я понимаю логарифмическую природу децибел в принципе, но не столько с точки зрения фактического кода.

мой вопрос: если бы я хотел уменьшить объем WAV-файла, скажем, на 20 децибел, как бы я сделал это в коде, подобном моему выше пример?

обновление: формула (основанная на ответе Нильса Пайпенбринка) для ослабления на заданное число децибел (введенное как положительное число, например, 10, 20 и т. д.):

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;
    }
}

Итак, если я хочу ослабить 20 децибел, коэффициент усиления .1.

4 ответов


Я думаю, вы хотите конвертировать из децибела в выигрыш.

уравнения для аудио:

децибел получить:

  gain = 10 ^ (attenuation in db / 20)

или в C:

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

уравнения для преобразования из усиления в БД:

  attenuation_in_db = 20 * log10 (gain)

Если вы просто хотите добавить звук, у меня были хорошие результаты с нормализуют пакета из nongnu.org. Если вы хотите изучить, как это делается, исходный код доступен бесплатно. Я также использовал wavnorm, чья домашняя страница, похоже, в данный момент отсутствует.


одна вещь, чтобы рассмотреть: .Файлы WAV имеют множество различных форматов. Приведенный выше код работает только для WAVE_FORMAT_FLOAT. Если вы имеете дело с файлами PCM, то ваши образцы будут 8, 16, 24 или 32 битными целыми числами (8 бит PCM использует целые числа без знака от 0..255, 24 бит PCM может быть неупакованные и упакованные (упакованные == 3 байта значения упакованные рядом друг с другом, распаковал == 3 байта значения в 4 байта пакета).

и тогда возникает проблема альтернативных кодировок - например, в Win7, все звуки windows на самом деле являются MP3-файлами в контейнере WAV.

к сожалению, это не так просто, как кажется: (.


Oops я неправильно понял вопрос... Вы можете увидеть мои реализации python преобразования из dB в float (который вы можете использовать в качестве множителя по амплитуде, как показано выше) и наоборот

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

в двух словах это:

10 ^ (db_gain / 10)

таким образом, чтобы уменьшить объем на 6 дБ, вы умножили бы амплитуду каждого образца на:

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