Нормализация громкости потока с использованием BASS.NET в C#

Мне нужно нормализовать воспроизводимый аудиопоток с помощью BASS. Для этого я следую за этими шагами:

  1. Играть в стрим
  2. Создайте другой поток из файла и определите пиковое значение в фоновом режиме.
  3. Примените DSP_Gain с соответствующим значением усиления для воспроизводимого потока.

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

Проблема заключается в том, что при определении пикового значения потока результирующее значение представляет собой целое число от 0 до 32768 (чем больше значение, тем громче звук), однако DSP_Gain имеет две переменные для установки значения усиления, ни одна из которых не является целые числа. Первый - это Gain - двойное значение между 0 и 1024, а второй - Gain_dBV - двойное значение между -infinity и 60. Попытка передать пиковое значение как фактор привела к огромному отсечению внутри потока воспроизведения. У меня вопрос, как мне перевести это пиковое значение в правильный параметр для DSP_Gain? Ниже приведен код для получения пикового значения:

int strm = Bass.BASS_StreamCreateFile(filename, 0, 0, BASSFlag.BASS_STREAM_DECODE);
//initialized stream for getting peak value

int peak=0; //This value will be between 0 and 32768

while (System.Convert.ToBoolean(Bass.BASS_ChannelIsActive(strm)))
{
    //calculates peak from a 20ms frame and advances, loops till stream over

    int level = Bass.BASS_ChannelGetLevel(strm);
    int left = Utils.LowWord32(level); // the left level
    int right = Utils.HighWord32(level); // the right level

    if (peak < left) peak = left;
    if (peak < right) peak = right;
}

Применение DSP_Gain:

DSPGain = new DSP_Gain();
DSPGain.ChannelHandle = stream; //this stream is the already playing one
DSPGain.Gain = *SOME VALUE*
DSPGain.Start();

1 ответ

Решение

Просто читая ссылки, которые вы разместили, кажется, что усиление - это умножающий коэффициент, применяемый к сигналу - значения ниже 1,0 уменьшат уровень сигнала, значения выше 1,0 увеличат уровень. Поэтому вам необходимо рассчитать, насколько вы хотите снизить уровень, скажем, вы хотите максимальное пиковое значение 30000, а рассчитанное пиковое значение - 32000, - тогда ваш выигрыш, скорее всего, будет (30000 / 32000) = 0,9375.

Gain_dBV - это коэффициент усиления, выраженный в децибелах, который обычно рассчитывается как 10 * log(выходная мощность / входная мощность) или 20 * log(pp Volts Out / pp Volts In). ДБ преобразуется обратно в фактическое усиление перед применением к сигналу, как указано выше - в этом примере усиление дБ будет 20 * log(0,9375) = -0,56

Другие вопросы по тегам