Изменение усиления аудиосигнала во время воспроизведения вызывает артефакты

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

void audioCallback(AudioOutputBuffer* ao, AudioInput* ai, int startSample, int numSamples){
    for (int i=startSample; i<numSamples+startSample; i++){
        ao[i] = ai[i]*gain;
    }
}

В основном я просто умножаю данные на некоторый множитель. В этом случае gain - это элемент с плавающей запятой, который корректируется с помощью обратного вызова графического интерфейса. Если я регулирую это значение во время воспроизведения звука, я слышу, что звук становится тише или громче при перемещении ползунка, но я слышу много мелких хлопков и щелчков.

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

Если я отрегулирую ползунок до начала воспроизведения звука, усиление будет установлено правильно, и я не получу щелчков.

Я что-то упустил? Как еще реализовано усиление, кроме как множителя входного сигнала?


person sugarmuff    schedule 04.08.2014    source источник
comment
Это связано с тем, что ao [i], вероятно, переполняется на максимальное число, например, если максимальное число равно 255, и вы пытаетесь сохранить более высокие значения, оно будет обрезано, вызывая артефакты.   -  person concept3d    schedule 04.08.2014
comment
Я пробовал это с диапазоном множителя усиления от 0,0 до 1,0, и в этом случае множитель никогда не увеличивал бы сигнал, так что это определенно не проблема отсечения. Я также проверил это, распечатав все исходные значения аудиовыхода (которые, как я знаю, вызывают печать артефактов в реальном времени, но клипы без печати).   -  person sugarmuff    schedule 04.08.2014
comment
попробуй без пользы. Это клип? если это так, вероятно, у вас что-то не так в исходном сигнале, иначе у меня нет другой причины, по которой это переполнение.   -  person concept3d    schedule 04.08.2014
comment
также убедитесь, что оба буфера относятся к одному типу, например; беззнаковый 16.   -  person concept3d    schedule 04.08.2014
comment
нет артефактов, если я не изменяю усиление в реальном времени. Если я применяю усиление, но не меняю его во время воспроизведения звука, артефактов не будет. Артефакты возникают только при изменении множителя усиления во время воспроизведения звука. Если я уберу усиление полностью, клиппирования не будет.   -  person sugarmuff    schedule 04.08.2014
comment
оба буфера одного типа   -  person sugarmuff    schedule 04.08.2014


Ответы (2)


Вопрос: как оператор умножения узнает, какой операнд является звуковым сигналом, а какой - усилением? Ответ: нет. Оба являются звуковыми сигналами, и все, что слышно в любом из них, будет слышно на выходе.

Плоский, неизменный сигнал не издает слышимых звуков. Пока усиление остается постоянным, он не будет вносить никакого собственного звука.

Резко изменяющийся сигнал будет очень слышимым, он будет звучать как щелчок с большим количеством высоких частот.

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

Другой способ - использовать фильтр нижних частот для сигнала усиления и использовать это как вход для умножения.

person Mark Ransom    schedule 08.08.2014
comment
Это объясняет, почему, когда я меняю микс над чем-то, над чем я работаю, я получаю щелчок ... момент фейспалма! - person imekon; 29.10.2014

Я исправил это, изменяя приращение с шагом измененной суммы. Например, если множитель усиления был установлен на 1,0, а затем изменен на 0,8, это разница в 0,2 усиления. Для каждого образца в обратном вызове добавьте разницу / numSamples к предыдущему тому, чтобы создать размытое или постепенное изменение усиления.

person sugarmuff    schedule 04.08.2014
comment
Это правильно. Резкое изменение усиления приводит к появлению большого количества высоких частот в сигнале усиления. Это отражается на результате, поскольку фактически представляет собой комбинацию обоих сигналов. Невнятное изменение резко снижает высокочастотный контент. - person Mark Ransom; 05.08.2014