Я воспроизводю аудиофайлы в программе, и в обратных вызовах рендеринга звука я применяю множитель усиления к входному сигналу и добавляю его в выходной буфер. Вот некоторый псевдокод для иллюстрации моих действий:
void audioCallback(AudioOutputBuffer* ao, AudioInput* ai, int startSample, int numSamples){
for (int i=startSample; i<numSamples+startSample; i++){
ao[i] = ai[i]*gain;
}
}
В основном я просто умножить данные на некоторый множитель. В этом случае, gain
является элементом с плавающей точкой, который настраивается с помощью обратного вызова GUI. Если я отрегулирую это значение во время воспроизведения звука, я могу услышать, что звук становится мягче или громче, когда я перемещаю ползунок, но слышу много маленьких щелчков и щелчков.
Не совсем уверен, что сделка. Я знаю об интерполяции, и я делаю это, если звук смещен по высоте тона, но я не уверен, нужно ли мне делать какую-либо дополнительную интерполяцию или что-то еще, если усиление регулируется в реальном времени, прежде чем закончится воспроизведение аудиофайла.
Если я отрегулирую ползунок до начала воспроизведения звука, усиление будет установлено правильно, и я не получу щелчков.
Я что-то здесь упускаю? Как еще реализовано усиление, кроме множителя входного сигнала?
Вопрос: как оператор умножения узнает, какой операнд является аудиосигналом, а какой — коэффициентом усиления? Ответ: это не так. Они оба звуковые сигналы, и что-либо слышимое в любом из них будет слышно на выходе.
Плоский, неизменный сигнал не производит слышимых звуков. Пока усиление остается постоянным, оно не будет вносить никакого собственного звука.
Сигнал, который резко меняется, будет очень слышно, это звучит как щелчок, содержащий много высоких частот.
Как вы сами определили, один из способов уменьшения высокочастотного контента и, следовательно, слышимости — это растянуть изменение по количеству семплов, используя постоянный наклон. Это, безусловно, будет достаточно в приложении, где у вас есть много времени, чтобы внести изменения в усиление.
Другой способ — запустить фильтр нижних частот на сигнале усиления и использовать тот как вход для умножения.
Я исправил это, изменив прирост суммы, измененной. Например, если множитель усиления был установлен на 1,0, а затем изменен на 0,8, это разница в 0,2 усиления. Для каждого семпла в обратном вызове добавьте разность / numSamples к предыдущему тому, чтобы создать размытое или постепенное изменение коэффициента усиления.