Building a Better Erhu Tuner: Why Auto correlation Beats Standard Pitch Detection in the Browser
개요
Erhu와 같이 활로 연주하는 악기를 위한 웹 기반 튜너 개발 시, 기존 FFT 기반 주파수 탐지 방식의 한계를 극복하기 위해 시간 영역에서의 Autocorrelation 알고리즘을 적용하는 방법을 설명합니다.
주요 내용
* 기존 FFT 기반 튜너의 문제점:
* Erhu와 같이 활로 연주하는 악기는 활의 마찰음(고주파 잡음), 최초의 "바이트" 시 발생하는 과도 현상(transients), 복잡한 배음(harmonics)으로 인해 주파수 스펙트럼이 불안정해집니다.
* 이러한 신호는 FFT 기반 튜너에서 높은 주파수 피크를 잘못 감지하거나 잡음 때문에 주파수 탐지를 불안정하게 만들어 정확한 음정을 파악하기 어렵게 합니다.
* Autocorrelation 알고리즘의 원리:
* 주파수 영역 대신 시간 영역에서 동작하며, 오디오 신호가 시간 이동된 자신과 얼마나 유사한지를 측정합니다.
* 신호의 짧은 스냅샷을 생성하고, 이를 작은 시간 단위로 이동시키면서 원본과 얼마나 잘 일치하는지를 비교합니다.
* 두 파형이 완벽하게 일치하는 시간 이동 거리("lag")를 찾고, 이를 통해 음파의 한 주기 길이를 파악합니다.
* 샘플링 레이트를 lag 값으로 나누어 매우 정확한 기본 주파수(fundamental frequency)를 계산합니다.
* Autocorrelation이 활 연주 악기에 효과적인 이유:
* 무작위적이고 비주기적인 활 마찰음은 시간 이동 시 신호와 일치하지 않으므로, Autocorrelation 알고리즘이 이러한 잡음을 자연스럽게 필터링합니다.
* 오직 반복되는 기본 파형에만 집중하여 정확한 음정을 탐지합니다.
* 브라우저 구현 시 고려사항:
* UI 스레드를 차단하지 않기 위해 무거운 연산은 AudioWorklet 인터페이스를 사용하여 별도의 스레드에서 처리해야 합니다.
* ScriptProcessorNode는 더 이상 사용되지 않으므로 AudioWorklet 사용을 권장합니다.
* "옥타브 오류(Octave Error)" 문제와 해결 방안:
* Autocorrelation은 특정 배음 구조로 인해 기본 주파수의 옥타브 아래를 잘못 탐지하는 "옥타브 오류"가 발생할 수 있습니다.
* 이를 해결하기 위해 단순히 가장 높은 상관 값만 사용하는 대신, 특정 임계값을 넘는 첫 번째 주요 피크를 분석하고 주변 프레임과의 안정성을 검증하는 Peak Picking Heuristics 기법을 적용합니다.
* 결과:
* 시간 영역 Autocorrelation과 부드러운 UI 보간법을 결합하면, 불안정하게 흔들리지 않고 잡음에 영향을 받지 않으며 Erhu 연주자가 D4와 A4 음정을 정확하게 잡을 수 있는 튜너를 만들 수 있습니다.
시사점
웹 기반 오디오 튜너 또는 유사한 피치 감지 도구를 개발할 때, 특히 유기적이거나 활로 연주되는 악기, 또는 잡음이 많은 소스를 다룰 경우 FFT 방식보다 Autocorrelation 알고리즘이 훨씬 더 나은 정확도와 안정성을 제공합니다.
댓글
GitHub Discussions