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);
答
呀,你真的不能用分析仪。它的运行时间有太多的不确定性,并且无法保证运行的准确时间。现在最好使用ScriptProcessor(最终AudioWorklet),并自己完成FFT(或其他识别代码)。
+0
这么想。现在就试用ScriptProcessor,非常感谢! –
你真的不想使用FFT来检测莫尔斯电码 - 效率低下而且没有足够的时间分辨率。毫无疑问@ hotpaw2将很快给出章节和诗句...... –
@PaulR FFT允许一次采样多个频率,从而并行接收和解码多个信号 - 这就是我所要做的。 Goertzel的时间分辨率是否与完全成熟的FFT只有一个频率相同?我是音频处理新手,所以我可能是错的。 –
20 wpm摩尔斯电码具有约15-20点/秒的点速率,因此您需要的时间分辨率稍好于50毫秒来解析点。这意味着你需要运行(重叠)FFT> 20次/秒(理想情况下是2倍,如果你想解码更快的莫尔斯,甚至更多)。这是可行的,但效率非常低,您的音频API可能不支持重叠。 –