2016-11-11 1 views
0

음성 학습 앱을 만들고 있으며 FFT를 사용하여 시간 도메인에서 주파수 도메인으로 신호를 변환했습니다. FFT를 적용하기 전에 blackman-harris 윈도우를 사용하여 신호를 창으로 봤습니다. 그런 다음 기본 주파수를 추출하기 위해 고조파 스펙트럼을 사용했습니다. 가장 낮은 주파수는 F2 (87.307 Hz)이고 가장 높은 주파수는 C6 (1046.502 Hz)입니다. FFT 길이는 8192이고 샘플링 주파수는 44100 Hz입니다.고조파 곱 스펙트럼의 옥타브 오류를 수정하는 방법은 무엇입니까?

옥타브 오류를 수정하려면 here이라는 규칙을 적용하십시오.

 float[] array = hps.HPS(Data); 
    float hpsmax_mag = float.MinValue; 
    float hpsmax_index = -1; 

    for (int i = 0; i < array.Length; i++) 
      if (array[i] > hpsmax_mag) 
       { 
       hpsmax_mag = array[i]; 
       hpsmax_index = i; 
       } 

    // Fixing octave too high errors  
     int correctMaxBin = 1; 
     int maxsearch = (int) hpsmax_index * 3/4; 
     for (int j = 2; j < maxsearch; j++) 
     { 
     if (array[j] > array[correctMaxBin]) 
     { 
      correctMaxBin = j; 
     } 
     } 

     if (Math.Abs(correctMaxBin * 2 - hpsmax_index) < 4) 
     { 
      if (array[correctMaxBin]/array[(int)hpsmax_index] > 0.2) 
      { 
       hpsmax_index = correctMaxBin; 
      } 
     } 

나는 톱니파를 사용하여 시스템을 테스트했으며 옥타브 오류가 여전히 눈에 띄는 것으로 나타났습니다. 87.307 Hz ~ 190 Hz에서 옥타브의 높은 오류를 나타냅니다. G5 (783.991) 위쪽으로 가끔 한 옥타브 낮게 표시됩니다.

다음은 일부 결과입니다. 입력 | 결과 | 오류

F2 (87.307) - F4 (349.228) - 2 octaves higher 
    G2 (97.999)- G4 (391.995) - 2 octaves higher 
    A2 (110) - A3 (220) - an octave higher 
    D3 (146.832) - D4 (mostly) (293.665) and D3 - an octave higher 
    A3 (220) - A3 - Correct 
    A4 (440) - A4 - Correct 
    G5 (783.991) - G5 (mostly) and G4 (391.995) - an octave lower 
    A5 (880) - A5 - Correct 
    C6 (1046.502) - C6 - Correct 

사용자의 시스템 피드백에 악영향을 미칠 수 있으므로이 문제를 해결할 수 있도록 도와주십시오.

답변

0

MP3 녹음시 폴리 포닉 신호에서 피치와 옥타브를 감지했을 때 약간 다른 접근 방식을 사용했습니다. '피치'를 구성하는 고조파를 식별하기 위해 FFT가 아닌 대수적으로 간격을 둔 수정 된 DFT를 사용하기로했습니다.

두 번째 단계에서 나중에 Octave (및 내포 된 기본 주파수)를 결정한 피치를 감지하기 위해 Two Stage Algorithm을 사용하기로 결정했습니다. 알고리즘은 다음과 같이 작동합니다 :

a) 먼저 'ScalePitch'에 12 가지 피치 값 {E, F, F #, G, G #, A, A #, B, C가 있습니다. , C#, D, D #}. 그리고 음계의 ScalePitch와 Time-Width가 결정된 후에는

b) 그 노트의 옥타브 (기본)는 4 가지 옥타브 - 후보 노트의 모든 고조파를 조사하여 계산됩니다.

옥타브 검출은 매우 까다로울 수 있습니다. 특히 기본 고조파 및/또는 기타 고조파가없는 대위법 신호의 경우. 하지만 일부 고조파가없는 경우에도 알고리즘이 작동합니다. GitHub의 PitchScope Player에 대한 필자의 Windows 코드를 컴파일하고 밟아서 옥타브를 결정하는 방법을 알아볼 수 있습니다.

FundCandidCalcer.cpp 파일 내의 FundCandidCalcer :: Calc_Best_Octave_Candidate() 함수에 중점을 두어 C++의 옥타브 탐지 알고리즘을 확인하는 것이 좋습니다.

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

https://github.com/CreativeDetectors/PitchScope_Player

아래 그림 I는 (즉, 올바른 기본이다) 정확한 옥타브 후보 주를 선택하기 위해 개발 옥타브 검출 알고리즘을 설명하는 참고 용 ScalePitch 고조파 회 결정되었습니다. 내가 모노 피치에서 일하고 있어요

enter image description here

+0

.. 나는 그것을 시도하고 볼 수 있습니다 – Giggity

관련 문제