ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 주파수 검출 구현하기 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
Designed by Tistory.