Web音频分析器节点 - 定期运行

问题描述:

我想用web audio在特定频率上检测音频信号(摩斯电码)。我使用分析器节点的getFloatFrequencyData函数检索频率数据。Web音频分析器节点 - 定期运行

现在的问题是:使用setInterval()定期对频率数据进行采样不够规律:回调的执行时间比预期的要早或晚几毫秒。

怎样才能每隔几毫秒定期检索一次分析仪的频率数据?我宁愿使用内置分析仪节点的FFT功能,而不是通过例如手动处理音频数据。 Goertzel算法。

代码示例有问题的setInterval()

// Analyse microphone audio frequencies: 
 
function onStream(stream) { 
 
    let audioCtx = new(window.AudioContext || window.webkitAudioContext)(), 
 
    source = audioCtx.createMediaStreamSource(stream), 
 
    analyser = audioCtx.createAnalyser(), 
 
    fft = new Float32Array(analyser.frequencyBinCount); 
 

 
    source.connect(analyser); 
 

 
    // Doesn't execute exactly every 100ms as needed - what to do? 
 
    setInterval(() => { 
 
    analyser.getFloatFrequencyData(fft); 
 
    console.log(performance.now(), fft[0]); 
 
    }, 100); 
 
} 
 

 
navigator.mediaDevices.getUserMedia({audio: true}).then(onStream);

+0

你真的不想使用FFT来检测莫尔斯电码 - 效率低下而且没有足够的时间分辨率。毫无疑问@ hotpaw2将很快给出章节和诗句...... –

+0

@PaulR FFT允许一次采样多个频率,从而并行接收和解码多个信号 - 这就是我所要做的。 Goertzel的时间分辨率是否与完全成熟的FFT只有一个频率相同?我是音频处理新手,所以我可能是错的。 –

+1

20 wpm摩尔斯电码具有约15-20点/秒的点速率,因此您需要的时间分辨率稍好于50毫秒来解析点。这意味着你需要运行(重叠)FFT> 20次/秒(理想情况下是2倍,如果你想解码更快的莫尔斯,甚至更多)。这是可行的,但效率非常低,您的音频API可能不支持重叠。 –

呀,你真的不能用分析仪。它的运行时间有太多的不确定性,并且无法保证运行的准确时间。现在最好使用ScriptProcessor(最终AudioWorklet),并自己完成FFT(或其他识别代码)。

+0

这么想。现在就试用ScriptProcessor,非常感谢! –