Изменить усиление громкости в буфере для образцов аудио

StackOverflow https://stackoverflow.com/questions/4300995

Вопрос

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

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

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

Обновление: вау, я только что узнал интересную вещь! Я бросил аудио до увеличения объема и сразу после этого.

Вот фотоClipped audio

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

Это было полезно?

Решение

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

Это должно работать таким образом ...

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

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

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

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 вдохновляет меня):

Если у вас есть стерео, то же самое будет работать, просто подсчитайте все образцы x2 IE

number of shorts = number of samples * 2.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top