【发布时间】:2017-08-28 16:59:08
【问题描述】:
我想使用web audio 检测特定频率上的音频信号(摩尔斯电码)。我使用分析器节点的getFloatFrequencyData 函数检索频率数据。
现在的问题是:使用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);
【问题讨论】:
-
您真的不想使用 FFT 来检测莫尔斯电码 - 效率低且时间分辨率不够。毫无疑问,@hotpaw2 很快就会给出章节……
-
@PaulR FFT 允许一次采样多个频率,从而并行接收和解码多个信号——这就是我想要的。 Goertzel 不是仅针对一个频率就具有与完全成熟的 FFT 相同的时间分辨率吗?我是音频处理的新手,所以我可能错了。
-
20 wpm 莫尔斯电码的点速率约为 15 - 20 点/秒,因此您需要比 50 毫秒更好的时间分辨率来解析点。这意味着您需要运行(重叠的)FFT > 20 次/秒(理想情况下是 2 倍,如果您想更快地解码莫尔斯电码,甚至更多)。可行但效率很低,而且你的音频 API 可能不支持重叠。
-
@PaulR 我实际上以 20 毫秒的时间分辨率对其进行了测试,每 20 wpm 单位为我们提供了大约 3 个样本。现在将尝试使用以下 cwilso 建议的带有 ScriptProcessor 节点的 Goertzel 算法,并查看时间分辨率是否显着增加以改进匹配。非常感谢您的意见,PaulR
标签: timer signal-processing fft web-audio-api