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

Timer Web音频分析器节点-定期运行,timer,signal-processing,fft,web-audio-api,Timer,Signal Processing,Fft,Web Audio Api,我想检测一个音频信号(摩尔斯电码)在特定频率使用。我使用Analyzer节点的getFloatFrequencyData函数检索频率数据 现在的问题是:使用setInterval()定期采样频率数据不够规则:回调的执行时间比预期的早或晚几毫秒 如何准确地每隔几毫秒定期检索分析仪的频率数据?我更喜欢使用内置分析仪节点的FFT功能,而不是通过算法等手动处理音频数据 使用有问题的setInterval()对示例进行编码: //分析麦克风音频: 功能在线(流){ 让audioCtx=new(window

我想检测一个音频信号(摩尔斯电码)在特定频率使用。我使用Analyzer节点的
getFloatFrequencyData
函数检索频率数据

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

如何准确地每隔几毫秒定期检索分析仪的频率数据?我更喜欢使用内置分析仪节点的FFT功能,而不是通过算法等手动处理音频数据

使用有问题的setInterval()对示例进行编码:
//分析麦克风音频:
功能在线(流){
让audioCtx=new(window.AudioContext | | window.webkitadiocontext)(),
source=audioCtx.createMediaStreamSource(流),
Analyzer=audioCtx.CreateAnalyzer(),
fft=新的浮动阵列(分析仪频率B计数);
源。连接(分析仪);
//没有按照需要每100毫秒执行一次-怎么办?
设置间隔(()=>{
分析仪.频率数据(fft);
log(performance.now(),fft[0]);
}, 100);
}

navigator.mediaDevices.getUserMedia({audio:true})是的,你不能真正使用分析仪。它何时运行有太多的不确定性,你不能保证它何时运行。现在最好使用脚本处理器(最终是AudioWorklet),自己进行FFT(或其他识别代码)。

是的,你不能真正使用分析仪。它何时运行有太多的不确定性,你不能保证它何时运行。现在最好使用脚本处理器(最终是AudioWorklet),然后自己进行FFT(或其他识别代码)。

您真的不想使用FFT检测莫尔斯电码-效率低下且时间分辨率不够。毫无疑问,@hotpaw2将很快发布章节…@PaulR FFT允许一次对多个频率进行采样,从而并行接收和解码多个信号-这就是我要做的。难道Goertzel对于一个频率不具有与成熟的FFT相同的时间分辨率吗?我是音频处理新手,所以我可能错了。每分钟20个莫尔斯电码的点速率大约为15-20点/秒,所以你需要一个比50毫秒更好的时间分辨率来分辨这些点。这意味着您需要运行(重叠的)FFT>20次/秒(理想情况下是这个的2倍,如果您想解码更快的莫尔斯,甚至更多)。这是可行的,但效率很低,而且您的音频API可能不支持重叠。@PaulR我实际使用20毫秒的时间分辨率对其进行了测试,每20 wpm单元大约有3个样本。现在,我们将使用下面cwilso建议的ScriptProcessor节点尝试Goertzel算法,并查看时间分辨率是否会大幅提高以改进匹配。非常感谢你的输入,Paulry你真的不想用FFT来检测莫尔斯电码——效率低下,时间分辨率不够。毫无疑问,@hotpaw2将很快发布章节…@PaulR FFT允许一次对多个频率进行采样,从而并行接收和解码多个信号-这就是我要做的。难道Goertzel对于一个频率不具有与成熟的FFT相同的时间分辨率吗?我是音频处理新手,所以我可能错了。每分钟20个莫尔斯电码的点速率大约为15-20点/秒,所以你需要一个比50毫秒更好的时间分辨率来分辨这些点。这意味着您需要运行(重叠的)FFT>20次/秒(理想情况下是这个的2倍,如果您想解码更快的莫尔斯,甚至更多)。这是可行的,但效率很低,而且您的音频API可能不支持重叠。@PaulR我实际使用20毫秒的时间分辨率对其进行了测试,每20 wpm单元大约有3个样本。现在,我们将使用下面cwilso建议的ScriptProcessor节点尝试Goertzel算法,并查看时间分辨率是否会大幅提高以改进匹配。非常感谢你的意见,保罗。我想是的。我们现在将试用ScriptProcessor,非常感谢!我想是的。我们现在将试用ScriptProcessor,非常感谢!