Передаточная функция WaveShaperNode
У меня возникают проблемы с пониманием того, как работает функция передачи для WaveShaperNode в API Web Audio. Как я понимаю, передаточная функция - это волновой формирователь, который принимает входной сигнал x и генерирует новый сигнал y. Так,
y = f(x)
Я понимаю, что если х равен нулю, то и у должно быть. Следовательно, 0 = f(0)
, И чтобы уместиться в соответствующем диапазоне, у должно быть между [-1, 1], поэтому эта функция: y = x / (1 + |x|)
ограничивает выходной диапазон до [-1, 1]. И что полиномы Чебышева полезны для передачи функций, используемых для "искажения" музыкальных входных сигналов.
Но для передаточной функции вам нужен входной сигнал x, чтобы манипулировать им и создать выход y. Однако с WaveShaperNode в API Web Audio у вас нет доступа к исходному вводу x (или нет?). Часто я вижу такие алгоритмы, как:
for(var i = 0; i < sampleRate; i++){
var x = i * 2 / sampleRate - 1;
this.curve[i] = (3 + distortionAmount) * x * 20 * (Math.PI / 180) / (Math.PI + distortionAmount * Math.abs(x));
}
Где, в приведенном выше коде, this.curve
является массивом Float32Array, представляющим график каждого примера кадра. И я предполагаю x
здесь предполагается представлять входной аудиосигнал. Тем не менее, он на самом деле не представляет точный входной аудиосигнал. Это потому, что он просто представляет среднюю синусоиду, а фактический вход не имеет значения? Принимает ли WaveShaperNode исходный вход x и использует (умножить?) Общую кривую, которую мы создали для вычисления выходного значения y?
2 ответа
Узел WaveShaper сам по себе не включает общие функции передачи, но вы можете использовать его для этого. Чтобы ответить на ваш вопрос - смещение в массиве с небольшой предварительной обработкой.
Кривая, которую вы задаете для волнового формирователя, подобна таблице поиска для x - разброса по диапазону [-1,1]. Y не обязательно должен быть в [-1,1] - но x делает. Итак, чтобы решить f(x) для x в [-1,1], вы просто получите значение в
curve[ Math.floor( (x+1)/2 * (curve.length-1) ) ];
или что-то типа того.
На самом деле это не так, что если х равен нулю, то и у тоже должно быть; но это вероятно. Например, вы можете использовать волновую форму для реализации смещения постоянного тока.
Этот бит "sampleRate" в вашем демонстрационном коде глупый - вы должны использовать maxint, а не samplerate, чтобы определить размер вашего массива. sampleRate - это элемент во временной области, а волновой фильтр работает только в амплитудном векторе.
WaveShaperNode описывается как применение нелинейных искажений. Как таковая, она не имела бы классической линейной не зависящей от времени передаточной функции (которая строго относится только к линейным искажениям).