我想捕获一个小的时间窗口(即〜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
的时间窗口?
答案 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秒的时间窗口)。