使用WebAudioAPI从fft返回哪种格式



我用WebAudioAPI和Dancer.js可视化了一个音频文件。所有功能都很好,但可视化效果看起来非常不同。有人能帮我找出为什么它看起来如此不同吗?

Web-Audio-API代码(fft.php,fft.js)

dancer代码(plugins/dancer.ft.js,js/playerFFT.js,fft.php)

WebAudioAPI的可视化功能位于:http://multimediatechnology.at/~fhs2640/sem6/WebAudio/fft.html

因为《舞者》正在上映http://multimediatechnology.at/~fhs2640/sem6/Dancer/fft.php

不同之处在于如何"找到"频率下的体积。您的代码使用分析器,该分析器获取值并进行一些平滑处理,因此您的图形看起来不错。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中找到).

因为我们只是使用Web Audio API使用analyser.getByteFrequencyData()提供的本地频率数据。

另一个通过使用ScriptProcessorNode进行自己的计算,然后当该节点的onaudioprocess事件触发时,他们从输入缓冲器中获取通道数据,并通过对其执行前向变换将其转换为频域频谱,然后使用快速傅立叶变换算法计算信号的离散傅立叶变换。

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

最新更新