使用WebAudioAPI从fft返回哪种格式

时间:2014-04-25 17:00:44

标签: javascript web-audio

我使用WebAudioAPI和Dancer.js可视化音频文件。一切运作良好,但可视化看起来非常不同。任何人都可以帮我找出它看起来如此不同的原因吗?

The Web-Audio-API code (fft.php, fft.js)

The dancer code (plugins/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

3 个答案:

答案 0 :(得分:1)

不同之处在于如何“找到”频率的音量。您的代码使用分析器,该分析器获取值并进行一些平滑处理,因此您的图表看起来不错。 Dancer使用脚本处理器。每当某个样本长度通过时,脚本处理器就会触发一个回调,并将该样本传递给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)中找到。

答案 1 :(得分:1)

因为一个人只是使​​用{4}}来使用Web Audio API提供的本机频率数据。

另一个人使用analyser.getByteFrequencyData()进行自己的计算,然后当该节点的onaudioprocess事件触发时,ScriptProcessorNode执行they take the channel data from the input buffer and convert that to a frequency domain spectra然后forward transform on it

答案 2 :(得分:0)

idbehold的答案部分正确(平滑正在应用),但更大的问题是Web Audio代码使用的是getByteFrequencyData而不是getFloatFrequencyData。 “byte”版本进行处理以最大化字节的范围 - 它在0-255字节范围内将minDb扩展到maxDb。