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);
モールス符号を検出するためにFFTを使用したくないのは、効率的ではなく、十分な時間分解能ではありません。間違いなく@ hotpaw2はすぐに章と節を与えることになるでしょう。 –
@PaulR FFTは複数の周波数を一度にサンプリングすることができますので、複数の信号を並列に受信してデコードすることができます。 Goertzelは、1つの周波数だけの本格的なFFTと同じ時間分解能を持っていませんか?私はオーディオ処理に新しいので、私は間違っている可能性があります。 –
20のwpmモールスコードは約15〜20ドット/秒のドットレートを持つため、ドットを解決するには50msよりやや良い時間分解能が必要です。つまり、重複したFFTを20回/秒(理想的には2倍、より高速なモールスを解読したい場合はさらに)実行する必要があります。それは可能ですが、非常に効率が悪く、オーディオAPIがオーバーラップをサポートしていない可能性があります。 –