Как получить значение частоты в JavaScript? - PullRequest
0 голосов
/ 16 мая 2018

Я студент из Италии, и я использую библиотеки p5 для создания веб-гитарного тюнера. Я хотел бы знать, есть ли способ получить частоту входа микрофона.

ссылка на библиотеку: https://p5js.org/reference/#/libraries/p5.sound

Принимаются разные решения с разными библиотеками

Спасибо

1 Ответ

0 голосов
/ 19 мая 2018

Построение из этого примера , если вы используете объект FFT P5.sound, вы можете вызвать fft.analyze(), чтобы получить массив амплитуд, разделенных на разные частотные бины.

По умолчанию установлено 1024 ячейки. Эти ячейки равномерно распределены от 0 Гц до частоты Найквиста, что составляет половину вашей частоты дискретизации звука. (Частота дискретизации по умолчанию составляет 44100 Гц, поэтому частота Найквиста по умолчанию составляет 22050 Гц).

Обратите внимание, что для каждого бина по умолчанию установлено разрешение 22050 Гц / 1024 бина ≈ 21,53 Гц / бин. Точность 21,53 Гц будет достигнута при использовании P5.sound (при условии, что ваш компьютер настроен так же, как мой).

Таким образом, bin 0 (или spectrum[0]) содержит амплитуду на частотах ~ 0 - 21,5 Гц, bin 1 (spectrum[1]) содержит амплитуду на частотах ~ 21,5 Гц - 43,0 Гц и т. Д.

Это означает, что частота в любом заданном интервале равна: freq = binIndex * (nyquist / numberOfBins).

Если для вас этого достаточно, вы можете перебрать массив, возвращаемый fft.analyze(), найти индекс пика, а затем преобразовать этот индекс обратно в частоту, используя отношение Найквиста к длине массива (бины).

function getLoudestFrequency() {
    var nyquist = sampleRate() / 2; // 22050
    var spectrum = fft.analyze(); // array of amplitudes in bins
    var numberOfBins = spectrum.length;
    var maxAmp = 0;
    var largestBin;

    for (var i = 0; i < numberOfBins; i++) {
        var thisAmp = spectrum[i]; // amplitude of current bin
        if (thisAmp > maxAmp) {
            maxAmp = thisAmp;
            largestBin = i;
        }
    }

    var loudestFreq = largestBin * (nyquist / numberOfBins);
    return loudestFreq;
}

Допустим, ± 21,53 Гц недостаточно точен для вас. Ну что ж ... вы можете инициализировать ваш объект FFT с большим количеством бинов: new p5.FFT(0.8,[bins]). Документация гласит , что максимальное количество бинов равно 1024, но я только что попробовал с 8192 (для разрешения 2,69 Гц), и мне показалось, что оно работает нормально.

...