【问题标题】:Web audio analyser node - run at regular intervalWeb 音频分析器节点 - 定期运行
【发布时间】: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


【解决方案1】:

是的,您不能真正使用分析仪。它何时运行存在太多不确定性,您无法准确保证它何时运行。你现在最好使用 ScriptProcessor(最终是 AudioWorklet),然后自己进行 FFT(或其他识别代码)。

【讨论】:

  • 是这样想的。现在将试用 ScriptProcessor,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
相关资源
最近更新 更多