2017-04-03 17 views
0

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

+0

모스 코드를 탐지하기 위해 FFT를 사용하고 싶지는 않습니다. 비효율적이며 시간 분해능이 충분하지 않습니다. 의심의 여지가 @ hotpaw2 곧 장 및 절을 제공 할 예정이다. –

+0

@PaulR FFT는 여러 주파수를 동시에 샘플링하여 다중 신호를 병렬로 수신하고 디코딩 할 수있게 해준다. Goertzel은 한 주파수에 대해서만 본격적인 FFT와 동일한 시간 해상도를 가지고 있지 않습니까? 나는 오디오 프로세싱에 새로운 것이므로 잘못되었을 수도 있습니다. –

+1

20 개의 wpm 모스 부호는 도트 비율이 약 15 - 20 도트/초이므로 점을 해결하려면 50 밀리 초보다 약간 더 나은 시간 해상도가 필요합니다. 즉, (오버랩 된) FFT> 20 회/초 (이상적으로는 2 배, 더 빠른 모스를 해독하려면 더 많은)를 실행할 필요가 있음을 의미합니다. 그것은 가능하지만 매우 비효율적이며 오디오 API가 겹침을 지원하지 않을 수 있습니다. –

답변

3

그래, 당신이 정말로 분석기를 사용할 수 없습니다. 실행될시기에는 너무 많은 불확실성이 있으며 실행시기를 정확하게 보장 할 수는 없습니다. 이제는 ScriptProcessor (AudioWorklet)를 사용하고 FFT (또는 다른 인식 코드)를 직접 사용하는 것이 좋습니다.

+0

생각했습니다. 지금 ScriptProcessor를 사용해 보겠습니다. 고맙습니다. –