AnalyserNode.getByteFrequencyData中的数据对应哪个时间窗口?

时间:2019-06-28 14:58:25

标签: javascript fft

我想捕获一个小的时间窗口(即〜1秒)的傅立叶变换。

let audioCtx = new AudioContext();
let analyser = audioCtx.createAnalyser()
let buffer = new Uint8Array(analyser.frequencyBinCount);

//given an audio stream 'stream'
let source = audioCtx.createMediaStreamSource(stream);

setInterval(()=>{
    analyser.getByteFrequencyData(buffer);
    //Do some analysis with buffer...
},1000)

使用WebAPI的AnalyserNode,我可以在宽度为44100/analyser.fftSize = 22050/analyser.frequencyBinCount的bin中获取傅立叶数据,从而可以通过设置analyser.fftSize来指定分辨率。我从文档中不清楚的是如何设置时间窗口。

来自API

  

以128个样本帧的块形式呈现音频图。一个128个样本帧的块称为渲染量子,渲染量子大小为128。

这是否意味着128/44100Hz=2.9ms的时间窗口?

1 个答案:

答案 0 :(得分:1)

  
    

以128个样本帧的块形式呈现音频图。一个128个样本帧的块称为渲染量子,渲染量子大小为128。

  
     

这是否意味着128 / 44100Hz = 2.9ms的时间窗口?

不完全是。渲染量子大小是渲染循环一次处理的样本帧数,但是它不能防止节点在缓冲区中累积其他样本。在AnalyserNode的特定情况下,保留最后的fftSize个样本用于FFT计算。因此,时间窗口实际上是analyser.fftSize/sampleRate,其中sampleRate是您的configured sample rate(可能是44100,但可能会因输出设备而异)。要捕获约1秒的音频,假设采样率为44100Hz,您将需要fftSize = 32768(这将导致约0.74秒的时间窗口)。