Нормализация громкости потока с использованием BASS.NET в C#
Мне нужно нормализовать воспроизводимый аудиопоток с помощью BASS. Для этого я следую за этими шагами:
- Играть в стрим
- Создайте другой поток из файла и определите пиковое значение в фоновом режиме.
- Примените 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