【问题标题】:Which format is returned from the fft with WebAudioAPI使用 WebAudioAPI 从 fft 返回哪种格式
【发布时间】:2014-04-25 17:00:44
【问题描述】:

我使用 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

【问题讨论】:

    标签: javascript web-audio-api


    【解决方案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 中找到)。

    【讨论】:

      【解决方案2】:

      因为一个是简单地使用 Web Audio API 提供的原生频率数据,使用 analyser.getByteFrequencyData()。

      另一个通过使用ScriptProcessorNode 进行自己的计算,然后当该节点的onaudioprocess 事件触发时,they take the channel data from the input buffer and convert that to a frequency domain spectra 通过执行forward transform on it 然后calculating the Discrete Fourier Transform of the signal with the Fast Fourier Transform algorithm。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 因此,如果我将 getByteFrequencyData 更改为 getFloatFrequencyData 并将 Uint8array 更改为 Float32Array 它应该 webAudioAPI 应该看起来像 Dancer.js?!
        • 我不知道 Dan​​cer.js 的确切作用。这将执行一个简单的 FFT,尽管正如 idbehold 所说,默认情况下在 AnalyserNode 上有平滑处理。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多