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가 겹침을 지원하지 않을 수 있습니다. –