Какой формат возвращается из fft с помощью WebAudioAPI

Я визуализировал аудиофайл с помощью WebAudioAPI и Dancer.js. Все работает хорошо, но визуализация выглядит совсем по-другому. Может ли кто-нибудь помочь мне выяснить, почему это выглядит так по-другому?

Код Web-Audio-API (fft.php, fft.js)

Код танцора (плагины/dancer.fft.js, js/playerFFT.js, fft .php)

Визуализация для WebAudioAPI включена: http://multimediatechnology.at/~fhs32640/sem6/WebAudio/fft.html

Для танцора на http://multimediatechnology.at/~fhs32640/sem6/Dancer/fft.php


person user2090392    schedule 25.04.2014    source источник


Ответы (3)


Разница заключается в том, как «находятся» объемы на частотах. В вашем коде используется анализатор, который принимает значения, а также выполняет некоторое сглаживание, поэтому ваш график выглядит красиво. Танцор использует обработчик сценариев. Процессор сценариев инициирует обратный вызов каждый раз, когда проходит определенную длину выборки, и передает эту выборку в e.inputBuffer. Затем он просто рисует эти «сырые» данные без применения сглаживания.

var
    buffers = [],
    channels = e.inputBuffer.numberOfChannels,
    resolution = SAMPLE_SIZE / channels,
    sum = function (prev, curr) {
        return prev[i] + curr[i];
    }, i;

for (i = channels; i--;) {
    buffers.push(e.inputBuffer.getChannelData(i)); 
}

for (i = 0; i < resolution; i++) {
    this.signal[i] = channels > 1 ? buffers.reduce(sum) / channels : buffers[0][i];
}

this.fft.forward(this.signal);
this.dancer.trigger('update');

Это код, который Dancer использует для получения силы звука на частотах.

(это можно найти в adapterWebAudio.js ).

person MarijnS95    schedule 25.04.2014

Потому что вы просто используете собственные данные о частоте, предоставляемые API веб-аудио, используя analyser.getByteFrequencyData().

Другой выполняет собственный расчет, используя ScriptProcessorNode, а затем, когда срабатывает событие onaudioprocess этого узла, они берут данные канала из входного буфера и преобразуют их в спектры частотной области, выполняя прямое преобразование на нем, а затем вычисление дискретного преобразования Фурье сигнала с помощью алгоритма быстрого преобразования Фурье.

person idbehold    schedule 25.04.2014

Ответ idbehold частично правильный (применяется сглаживание), но более серьезная проблема заключается в том, что код веб-аудио использует getByteFrequencyData вместо getFloatFrequencyData. Версия "byte" выполняет обработку, чтобы максимизировать диапазон байтов - она ​​распределяет minDb до maxDb в диапазоне 0-255 байт.

person cwilso    schedule 25.04.2014
comment
Итак, если я изменю getByteFrequencyData на getFloatFrequencyData и Uint8array на Float32Array, webAudioAPI должен выглядеть как Dancer.js?! - person user2090392; 26.04.2014
comment
Я точно не знаю, что делает Dancer.js. Это выполнит простое БПФ, хотя, как сказал idbehold, по умолчанию на AnalyserNode есть сглаживание. - person cwilso; 28.04.2014