HPS를 사용하여 피치 감지 알고리즘을 만들었는데 문제가 있습니다. 나는 신호 처리 초보자 이며이 사이트가 전에 도움이되었으므로 물어봐야합니다.
더 높은 음높이 ( eg. >C6:1046.50hz
)를 위해 HPS에서 가비지 데이터를 가져 오기 시작했습니다. 피치가 높을수록 더 많은 쓰레기를 얻습니다 (가비지로 인해 옥타브 오류나 고조파가 아니며 약 1Hz-20Hz 인 주파수를 의미합니다)
내가 경험적으로 관찰 한 것 :
기본이 A6 이상이면 가비지 데이터 만 얻습니다.
FFT는 매우 높은 피치에서도 잘 작동합니다. (피크는 피크가 기본 또는 고조파 중 하나를 나타내지 만 가비지는 표시하지 않음)
HPS에 대해 고려할 고조파 수를 줄이면 가비지가 줄어들지 만 기본과 고조파를 구분하기가 더 어려워집니다.
내 알고리즘은 다음과 같습니다.
->raw buffer -> hann window, 16384 samples, 50% overlap -> zero padding -> FFT -> HPS
도움을 주셔서 감사합니다!
업데이트 1 : 추가하고 싶은 것이 몇 가지 더 있습니다.
- 내가 기록하고있는 샘플 속도는 44100Hz입니다.
- 이 동작은 기타에서는 거의 보이지 않지만 디지털 피아노 에서는 매우 비슷 합니다 (동일한 음표 연주).
여기 내 hps 알고리즘이 있습니다. 경험이 많은 사람이 문제를 발견 할 수 있습니다.
int hps(float* spectrum, int spectrumSize, int harmonics) { int i, j, maxSearchIndex, maxBin; maxSearchIndex = spectrumSize/harmonics; maxBin = 1; for (j=1; j<=maxSearchIndex; j++) { for (i=1; i<=harmonics; i++) { spectrum[j] *= spectrum[j*i]; } if (spectrum[j] > spectrum[maxBin]) { maxBin = j; } } // Fixing octave too high errors int correctMaxBin = 1; int maxsearch = maxBin * 3 / 4; for (i=2; i<maxsearch; i++) { if (spectrum[i] > spectrum[correctMaxBin]) { correctMaxBin = i; } } if (abs(correctMaxBin * 2 - maxBin) < 4) { if (spectrum[correctMaxBin]/spectrum[maxBin] > 0.2) { maxBin = correctMaxBin; } } return maxBin; }