피치 감지의 고조파 제품 스펙트럼 제한


10

HPS를 사용하여 피치 감지 알고리즘을 만들었는데 문제가 있습니다. 나는 신호 처리 초보자 이며이 사이트가 전에 도움이되었으므로 물어봐야합니다.

더 높은 음높이 ( eg. >C6:1046.50hz)를 위해 HPS에서 가비지 데이터를 가져 오기 시작했습니다. 피치가 높을수록 더 많은 쓰레기를 얻습니다 (가비지로 인해 옥타브 오류나 고조파가 아니며 약 1Hz-20Hz 인 주파수를 의미합니다)

내가 경험적으로 관찰 한 것 :

  1. 기본이 A6 이상이면 가비지 데이터 만 얻습니다.

  2. FFT는 매우 높은 피치에서도 잘 작동합니다. (피크는 피크가 기본 또는 고조파 중 하나를 나타내지 만 가비지는 표시하지 않음)

  3. HPS에 대해 고려할 고조파 수를 줄이면 가비지가 줄어들지 만 기본과 고조파를 구분하기가 더 어려워집니다.

내 알고리즘은 다음과 같습니다.

->raw buffer -> hann window, 16384 samples, 50% overlap -> zero padding -> FFT -> HPS

도움을 주셔서 감사합니다!

업데이트 1 : 추가하고 싶은 것이 몇 가지 더 있습니다.

  1. 내가 기록하고있는 샘플 속도는 44100Hz입니다.
  2. 이 동작은 기타에서는 거의 보이지 않지만 디지털 피아노 에서는 매우 비슷 합니다 (동일한 음표 연주).
  3. 여기 내 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;
    }
    

1
샘플 속도는 얼마입니까? ADC 전에 어떤 앤티 앨리어싱 필터가 있습니까?
Martin Thompson

녹음 샘플 속도는 44100Hz입니다.
Valentin Radu

1. HPS 계산에 사용 된 중간 스펙트럼과 제품을 플로팅하고 어디에서 잘못된 값을 가져 오는지 확인해야합니다. 2. 기타와 피아노가 조화를 이루지 않아 피크가 완벽하게 정렬되지 않습니다. 이것이 얼마나 많은 영향을 줄지 모르지만 HPS는 완벽하게 고조파 스펙트럼을 가정합니다.
endolith

답변:


3

이 높은 피치에서 신호에 고조파 부분이 너무 적을 수 있습니다. HPS 알고리즘은 매우 간단하며 기본에서 배경이 나타날 때까지 계속 쌓기 위해 상위 고조파에 의존합니다. 물론 샘플링 속도는 얼마입니까? 그것이 8000 hz라면, 1000 hz 피치의 3 개의 고조파를위한 공간 만이 있습니다 ...


44100Hz로 녹음하고 있지만 여전히 귀하의 답변으로 생각했습니다. 어쩌면 그것과 관련된 것일 수도 있고 원래 FFT에서 찾은 피크 수에 따라 내 hp에서 고려해야 할 고조파 수를 결정해야합니다. 내가 관찰 한 또 다른 것은 전기 피아노보다 현악기에서 더 잘 작동한다는 것입니다. 피아노의 경우 고조파가 주 단위이기 때문일 수 있습니까?
Valentin Radu

@mindnoise : 활을 휘감은 현악기는 조화로운 반면, 뽑거나 눌린 현악기는 en.wikipedia.org/wiki/Inharmonicity를 갖습니다 . 그것이 문제의 일부인지 확실하지 않습니다
endolith

"문자열이있는 탄성이 적은 (즉, 짧고 두꺼운, 그리고 그들이 강성) @endolith 특히 될 수 있기 때문에 그들은 더 나타낼을 inharmonicity ." 그리고 해당 유형의 문자열 (높은 음표)에서 정확하게 오류가 발생합니다. 실제로, 버그가 발생할 때 기본은 항상 FFT에서 가장 강한 주파수이므로 고조파 또는 hps 알고리즘과 관련이 있지만 기본적으로 1500 hz의 20-50hz 가비지를 얻는 이유는 확실하지 않습니다. hps 알고리즘을 게시합니다.
Valentin Radu

1
@mindnoise : "고조파 는 피아노의 가장 낮은 음 과 가장 높은 음에 큰 영향을 미칩니다. 가장 긴 문자열은 가장 긴 피아노 음의 크기에 의해 제한됩니다. 짧은 피아노의 디자이너는 두꺼운 현은 질량 밀도를 높이고 불균일성을 유발합니다 가장 높은 현은 가장 높은 장력 아래에 있어야하지만 낮은 질량 밀도를 위해서는 얇아 야합니다. 짧은 파장이 불균일을 발생시키는 현 "
endolith

2

일부 악기의 경우 생성되는 상당한 고조파 수는 피치 범위에 따라 달라질 수 있습니다. 일부 물리적 악기에 대해 매우 낮은 음과 가장 높은 음의 부분은 더 큰 불일치를 보일 수 있습니다. Fs / 2 미만의 앤티 앨리어싱 필터 컷오프 아래에 들어갈 수있는 고조파 수는 매우 높은 음표 일 경우 확실히 낮아집니다. HPS 피치 추정기 mdy는 이러한 요소를 고려하려고합니다.

일부 기기의 어택 트랜 션트는 일부 피치의 HPS 검색 영역 또는 상당한 고조파와 겹칠 수있는 고조파 스펙트럼 노이즈 대역을 생성 할 수 있습니다.

오디오 ADC 이전의 저역 통과 필터에 충분한 정지 대역 감쇠가 없으면 매우 높은 주파수의 톤이 Fs / 2를 감쌀 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.