Как ослабить 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