Как мне ослабить WAV-файл по заданному значению в децибелах? - PullRequest
9 голосов
/ 19 июля 2009

Если бы я хотел уменьшить амплитуду 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 ]

12 голосов
/ 19 июля 2009

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

Уравнения для звука:

Децибел, чтобы получить:

  gain = 10 ^ (attenuation in db / 20)

или в C:

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

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

  attenuation_in_db = 20 * log10 (gain)
1 голос
/ 06 декабря 2012

Упс, я неправильно понял вопрос… Вы можете увидеть мои реализации на Python для преобразования из дБ в число с плавающей запятой (которое вы можете использовать в качестве множителя для амплитуды, как показано выше) и наоборот

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

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

10 ^ (db_gain / 10)

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

10 ^ (-6 / 10)  ==  10 ^ (-0.6)  ==  0.2512
1 голос
/ 21 июля 2009

Нужно учитывать одну вещь: файлы .WAV имеют МНОГИЕ разные форматы. Код выше работает только для WAVE_FORMAT_FLOAT. Если вы имеете дело с файлами PCM, то ваши сэмплы будут иметь 8, 16, 24 или 32-битные целые числа (8-битная PCM использует целые числа без знака от 0..255, 24-битная PCM может быть упакована или распакована (pack == 3-байтовые значения упакованы рядом друг с другом, распакованы == 3-байтовые значения в 4-байтовом пакете).

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

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

1 голос
/ 19 июля 2009

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

...