Передаточная функция 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 описывается как применение нелинейных искажений. Как таковая, она не имела бы классической линейной не зависящей от времени передаточной функции (которая строго относится только к линейным искажениям).

Другие вопросы по тегам