【问题标题】:Web Audio FFT of an Oscillator?振荡器的网络音频 FFT?
【发布时间】:2013-09-11 13:16:38
【问题描述】:

我正在尝试在振荡器上使用网络音频的 FFT。

相关代码:

var context = new window.webkitAudioContext

var osc = context.createOscillator()
var an = context.createAnalyser()
osc.connect(an)
an.connect(context.destination)

osc.start(0)
osc.stop(context.currentTime + 2) //play sine wave for 2 seconds

var freqDomain = new Int8Array(an.frequencyBinCount)
an.getByteFrequencyData(freqDomain)
console.dir(freqDomain) //all 0's

另外,调用an.getTimeDomainData 也不会返回任何内容。我做错了什么?

【问题讨论】:

    标签: javascript html audio fft web-audio-api


    【解决方案1】:

    上述代码中发生的情况是,您立即尝试获取字节频率数据——但由于音频尚未开始,因此还没有数据。每当您要将数据从 AnalyserNode 复制到 freqDomain 数组时,都需要调用 getByteFrequencyData

    你可以上一个ScriptProcessorNode,或者使用一个简单的setInterval来调用分析,like

    var freqDomain = new Int8Array(an.frequencyBinCount);
    
    function proc () {
      an.getByteFrequencyData(freqDomain);
      console.log(freqDomain[0]); // Just output one element so we don't destroy the console
    }
    setInterval(proc, 22);
    

    【讨论】:

    • 谢谢。是否可以在不播放声音并等待持续时间的情况下做到这一点?
    • 那么分析器节点将永远不会收到任何数据;根据目标,offlineAudioContext 可能会满足您的需求
    • 我的目标是利用网络音频 API 的 FFT 分析非音频数据/信号。这甚至是个好主意吗?还是我应该查看其中一个 JavaScript DFT 包?
    • 使用带有 FFT/DFT 算法的 DSP 库可能会更容易/更有意义
    • 可能。不过我仍然很好奇,我仍然认为可以在不实际播放信号的情况下实时执行此操作……对吧?
    猜你喜欢
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多