Web Audio API, periodic wave

259
14 февраля 2022, 08:30

Как создать волну нужной формы, как работает функция создания, причем здесь преобразование Фурье, как влияет параметр нормализации(включенный и выключенный)?

Доки:

  • https://developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/createPeriodicWave
  • https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-createperiodicwave
  • https://webaudio.github.io/web-audio-api/#dom-periodicwaveoptions-real
Answer 1

На примере функции по упомянутой ссылке это работает так:

  • Генерируется и суммируется набор синусоид, частота каждой из которых в (2, 3, 4, ...) - в целое число раз больше "оcновной частотой".

    Эти синусоиды называются гармониками основной частоты, а то, во сколько раз её частота больше основной частоты, называют её порядковым номером.

    Как результат, всё вместе (суммарный сигнал) воспринимается на слух, как звук, соответствующий основной частоте, только обогащённый разной тембровой окраской.

  • В массивы real и imag помещается информация о номерах гармоник, которые будут добавлены в выходной сигнал.

    Таким образом - номера ячеек массивов соответствуют номерам гармоник.

    Разница между этими массивами в том, что пиковые значения амплитуд гармоник в массиве real вычисляются с помощью косинуса номеров гармоник, а в массиве imag - с помощью синуса.

    Для первого знакомства можно поместить данные только в один из двух массивов, на пример, imag.

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

<button onclick="mystart()"> старт </button>  
<button onclick="osc.stop(); clearInterval(b); ac.close()"> стоп </button> 
<script> 
var numCoeffs = 15; // максимальный порядковый номер гармоник 
function mystart(){ 
ac = new AudioContext(); 
osc = ac.createOscillator(); 
osc.frequency.value = 100; // основная частота, т.е., гармоника №1 
osc.connect(ac.destination); 
b = setInterval(function(){ 
var real = new Float32Array(numCoeffs); 
var imag = new Float32Array(numCoeffs); 
var i = 0; 
while(i < numCoeffs){ 
	var myrand = Math.floor(Math.random() * 5) + 2; 
	i += myrand; 
	imag[i] = 1; 
} 
var wave = ac.createPeriodicWave(real, imag, {disableNormalization: false}); // нормализация включена 
osc.setPeriodicWave(wave); 
}, 200); 
osc.start(); 
} 
</script>

Нормализация желательно должна быть включённой, иначе в результате суммирования большого количества гармоник размах сигнала может выйти за пределы крайних значений, и тогда не избежать неприятных искажений. А Жан Батист Фурье имеет к этому отношение, как разработчик алгоритма обратного процесса - разложение сложного звукового сигнала на синусоидальнае составляющие (гармоники). К сожалению, Web Audio API пока не позволяет качественно воспроизводить гармоники с частотами, близкими к нижнему и верхнему пределам слышимого диапазона.

READ ALSO
Поведение this. Почему, ведь this ссылается на windows

Поведение this. Почему, ведь this ссылается на windows

Результат в окне - function f(){alert(this)}Почему?

129
Как подсчитать количество элементов в разных блоках?

Как подсчитать количество элементов в разных блоках?

Подскажите, пожалуйста, как правильно подсчитать и вывести в <span></span> количество элементов в разных блоках (для каждого отдельно) с помощью...

106
Не работает обработчик событий

Не работает обработчик событий

Есть скрипт для страницы, который применяет методы fadeIn и fadeOut для некоторых блоков, при ширине окна браузера более 900 pxПроблема в том, что если...

96