ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 주파수 검출 구현하기 1.
    JDTuner/개발기록 2026. 2. 20. 20:05

    이번 포스트는 코드 자체 보단 이론이 중요하다.

    사실 코드보다 이 이론을 공부하고 싶어서 이 프로젝트를 시작한 이유가 크다.

    일단 기록을 위해서 말로만 정리하고 이후 포스트에서 이론 파트는 따로 정리해보려고 한다.

    YIN 알고리즘

    요약하면 반복되는 주기를 찾고 그 값을 통해 주파수 값을 구하는 방법이다.

    4단계가 필요하다.

     

    차이 배열 구하기

    어떤 파형이 있다고 가정했을때 그 파형의 주기를 구하려면

    동일한 파형을 옆으로 조금씩 옮기면서 차이값을 구한다.

    그러면 처음으로 차이값이 가장 낮을때가 한 주기에 해당된다.

    인덱스 1개씩 옮기면서 구한 차이 값들을 순서대로 배열에 저장한다.

    정규화

    가장 첫값은 자기 자신의 값을 뺀 값이므로 제외해야하고

    입력되는 소리의 크기에 영향 받지 않기 위해 정규화가 필요하다.

    여기서 사용한 정규화는 각 배열값을 해당 인덱스까지의 평균값으로 나누는 방법이다.

     

    가장 낮은 값 구하기

    정규화까지 끝냈다면 해당 배열에서 가장 낮은 값을 찾는다.

    임계값을 기준으로 가장 첫번째 값을 찾으면 되며 보통 튜너에선 0.1~0.15 값을 사용한다고 한다.

     

    주파수 구하기

    가장 낮은 값을 구했다면 그 값은 주기에 해당된다.

    주파수는 1초에 몇번 반복되는지의 값인데.

    주기를 알고 있다면 1초에 몇번 반복되는지는 샘플레이트를 통해 계산이 가능하다.

    샘플레이트는 1초에 받는 샘플의 개수이고 이를 주기로 나눈다면

    해당 주기로 1초에 몇번 반복되는 샘플인지가 나온다. 이 값이 주파수가 된다.

     

    문제점

    계산은 됐지만...

     

    다행히 코드 진행은 잘되고 value 값을 뷰까지 가져오는데 성공했지만

    마이크에 직접 목으로 아- 아- 소리를 넣어도 주파수 값이 제대로 안나왔다.

    카페 환경이었는데도 0 값만 계속 나오는게 이상했다.

     

    샘플이 너무 적다

    샘플 개수가 너무 적다는게 문제가 됐다고 생각이 된다.

    이 샘플값을 조절하는 방법은 딱히 없고 디바이스에서 이 버퍼값으로 넘기면 어쩔 수 없는것이므로

    들어오는 샘플을 분석하기 좋은 개수까지 쌓아 놓은 다음에 튜너 알고리즘을 돌리는 방식으로 해야할거 같다.

    이건 이후 포스트에서...

    'JDTuner > 개발기록' 카테고리의 다른 글

    Assert 없애기  (0) 2026.03.03
    주파수 검출 구현하기 2.  (1) 2026.02.24
    디바이스 삭제와 마이크 입력 확인  (0) 2026.02.20
    소리 데이터를 받아보자  (0) 2026.02.19
    c++ 와 Swift 사이 값 주고 받기  (0) 2026.02.19
Designed by Tistory.