-
주파수 검출 구현하기 2.JDTuner/개발기록 2026. 2. 24. 20:11
지난 시간에 256개의 버퍼 개수가 너무 적어서 주파수 검출을 제대로 하지 못하는 문제가 있었다.
AudioManager에서 버퍼 개수를 설정해도 변하지 않아서
해결하는 방법으로 2048개까지 오디오 데이터를 모으고 튜너 알고리즘을 거는 방식으로 시도했다.
// 버퍼가 전부 쌓인 경우에만 튜너 알고리즘 동작 if (collector.size() < collectorSize) { collectData(inputChannelData[0], numSamples); } else { // 튜너 알고리즘 - YIN 알고리즘 // 현재 소리를 복사해서 아주 살짝(tau) 옆으로 밀어낸 소리와 원본 소리의 차이를 빼서 제곱 // 두 소리 겹치는 부분에서 차이 값이 최소가 되는데 그 간격으로 주파수를 계산 auto prevDifference = setDiffernce(collector); auto normalizedDifference = normalize(prevDifference); auto pitchTau = findTau(normalizedDifference); auto frequency = getFrequency(pitchTau); sendFrequency(frequency); }collectData는 private vector<float> 값이며 collectorSize도 마찬가지로 private 프로퍼티다.
collectorSize를 2048로 설정해놓고 collectorSize가 낮을때는 데이터를 모으고
그 이후는 각 단계에 맞춰 튜너 알고리즘을 돌리는 방식으로 진행했다.
결과

데이터가 제대로 나온다!!!
(티스토리가 비디오 업로드를 중단해서 gif로 올림)
이 값은 내 목소리 인데 수치가 너무 낮다.
제대로 맞는 값인지 실제 기타로 테스트 해봐야 할듯하다.
이건 이후 포스트에서...
'JDTuner > 개발기록' 카테고리의 다른 글
Cents 계산 (0) 2026.03.04 Assert 없애기 (0) 2026.03.03 주파수 검출 구현하기 1. (0) 2026.02.20 디바이스 삭제와 마이크 입력 확인 (0) 2026.02.20 소리 데이터를 받아보자 (0) 2026.02.19