Изменить усиление громкости в буфере аудиосэмпла - PullRequest
6 голосов
/ 29 ноября 2010

Я хочу увеличить громкость в буфере с голосовыми данными.Дело в том, что я использую DirectSound и у меня есть один основной и один вторичный буфер - все потоки смешиваются вручную.В голосовом чате все участники могут иметь независимые уровни громкости.Я умножаю каждый поток данных на значение (усиление) и суммирую его в один буфер.Все работает нормально, но когда я пытаюсь умножить данные на значение больше, чем 1.0f - я слышу некоторые отсечения или что-то.

Я пытался использовать компрессор эффектов Audacity, но это не помогает уменьшить странный шум.

Возможно, мне следует изменить усиление другим способом?Или просто использовать другой алгоритм постобработки?

ОБНОВЛЕНИЕ: Вау, я только что обнаружил интересную вещь!Я сбросил звук до увеличения громкости и сразу после этого.

Вот картинка Clipped audio

Извините за качество - думаю, именно так и должен звучать звук (я нарисовал красную линию сам).Действительно похоже, что значения превышают тип данных образца.Но я не могу понять, ПОЧЕМУ?Мой выборочный буфер - BYTE, но я получаю к нему доступ только через короткий указатель.Он подписан, но отсечение происходит даже тогда, когда * ptr составляет около 15-20 тысяч.

1 Ответ

7 голосов
/ 29 ноября 2010

Для каждого семпла - преобразуйте его в какой-то больший тип данных - если у вас есть 16-битные подписанные семплы, они изначально помещаются в SHORT - извлеките его из потока, затем приведите к локальному double, затем умножьте, затем CLIP, затем приведите обратноSHORT.

Это ДОЛЖНО работать таким образом ...

Я даже могу предоставить пример кода, если это необходимо.

РЕДАКТИРОВАТЬ:

Ваше изображение является точным доказательством того, что вы не расширили изображение до более крупного шрифта до умножения - вы не можете «захватить» условие отсечения в SHORT, потому что оно будет автоматически переноситься.

short* sampleBuffer;
...
short sample=*sampleBuffer;
double dsample=(double)sample * gain;
if (dsample>32767.0) {dsample=32767.0;}
if (dsample<-32768.0) {dsample=-32768.0;}
*sampleBuffer=(short)dsample;
sampleBuffer++;

И еще один РЕДАКТИРОВАТЬ:

если у вас есть несколько голосов - сначала поместите их все в удвоение - затем ПОЛУЧИТЕ каждый из них - затем добавьте их - и обрежьте их как последний шаг.

Еще один РЕДАКТИРОВАТЬ (+ 1s вдохновляют меня):

Если у вас есть STEREO, то же самое будет работать, просто посчитайте все сэмплы x2, т.е.

number of shorts = number of samples * 2.

...