2017-04-03 9 views
0

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);

+0

モールス符号を検出するためにFFTを使用したくないのは、効率的ではなく、十分な時間分解能ではありません。間違いなく@ hotpaw2はすぐに章と節を与えることになるでしょう。 –

+0

@PaulR FFTは複数の周波数を一度にサンプリングすることができますので、複数の信号を並列に受信してデコードすることができます。 Goertzelは、1つの周波数だけの本格的なFFTと同じ時間分解能を持っていませんか?私はオーディオ処理に新しいので、私は間違っている可能性があります。 –

+1

20のwpmモールスコードは約15〜20ドット/秒のドットレートを持つため、ドットを解決するには50msよりやや良い時間分解能が必要です。つまり、重複したFFTを20回/秒(理想的には2倍、より高速なモールスを解読したい場合はさらに)実行する必要があります。それは可能ですが、非常に効率が悪く、オーディオAPIがオーバーラップをサポートしていない可能性があります。 –

答えて

3

うん、あなたは本当にアナライザを使用することはできません。それがいつ実行されるのかにはあまりにも不確実性があり、いつ実行するのかを正確に保証することはできません。 ScriptProcessorを使用して(AudioWorkletの最終的に)、FFT(またはその他の認識コード)を自分で行う方がよいでしょう。

+0

そう思っています。今すぐScriptProcessorを試してみてください、ありがとうございます! –

関連する問題