Harmoniczne ograniczenia widma produktu w wykrywaniu wysokości tonu

10

Stworzyłem algorytm wykrywania wysokości dźwięku za pomocą HPS i mam problem. Jestem początkującym w przetwarzaniu sygnałów i ta strona pomogła mi wcześniej, więc pomyślałem, że powinienem zapytać.

Dla wyższych tonów ( eg. >C6:1046.50hz) zaczynam pobierać śmieciowe dane z HPS. Im wyższy ton, tym więcej śmieci otrzymuję (przez śmieci rozumiem częstotliwości, które nie są błędami oktawowymi ani harmonicznymi i wynoszą około 1 Hz-20 Hz)

Co zaobserwowałem empirycznie:

  1. wyniki są najgorsze dla wyższych tonów, jeśli podstawa jest wyższa od A6 lub mniej więcej, dostaję tylko śmieciowe dane.

  2. FFT działa dobrze nawet przy bardzo wysokim skoku (przez grzywnę mam na myśli, że jego szczyt pokazuje albo podstawową albo jedną z jej harmonicznych, ale nie śmieci)

  3. jeśli obniżę liczbę harmonicznych, które biorę pod uwagę dla HPS, śmieci zmniejszają się, ale utrudnia to rozróżnienie między składową podstawową a harmoniczną.

Oto mój algorytm:

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

Każda pomoc jest mile widziana!

AKTUALIZACJA 1: Jest jeszcze kilka rzeczy, które chcę dodać:

  1. Częstotliwość próbkowania, z którą nagrywam, wynosi 44100 Hz
  2. Zauważyłem, że takie zachowanie jest ledwo widoczne na gitarze, ale bardzo widoczne na pianinie cyfrowym (dla tej samej granej nuty)
  3. Oto mój algorytm hps, może ktoś z większym doświadczeniem zauważy problem.

    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;
    }
    
Valentin Radu
źródło
1
Jaka jest twoja częstotliwość próbkowania? Jaki filtr antyaliasingowy masz przed ADC?
Martin Thompson,
Moja częstotliwość próbkowania wynosi 44100 Hz, przepraszam, że wcześniej o tym nie wspominałam.
Valentin Radu,
1. Musisz wykreślić widma pośrednie i produkty zastosowane w obliczeniach HPS i zobaczyć, skąd pochodzą nieprawidłowe wartości. 2. Gitara i fortepian są nieharmoniczne , co spowoduje, że szczyty nie będą idealnie pasować. Nie jestem pewien, jaki byłby to efekt, ale HPS zakłada widma idealnie harmoniczne.
endolith

Odpowiedzi:

3

Może się zdarzyć, że w tych wyższych częstotliwościach w sygnale jest za mało części harmonicznych. Algorytm HPS jest dość prosty i opiera się na tych wyższych harmonicznych, aby ustawiać się w stos aż do momentu, gdy podstawa wyjdzie z tła. Oczywiście powinniśmy się zastanawiać, jaka jest częstotliwość próbkowania? Jeśli jest to 8000 Hz, to jest miejsce tylko na 3 harmoniczne o częstotliwości 1000 Hz ...

Matt M.
źródło
Nagrywam w częstotliwości 44100 Hz, ale wciąż twoja odpowiedź skłoniła mnie do zastanowienia się. Może to coś związanego i powinienem zdecydować, ile harmonicznych należy wziąć pod uwagę w moich hps, w zależności od tego, ile pików znalazłem w mojej oryginalnej FFT. Inną rzeczą, którą zauważyłem, jest to, że działa znacznie lepiej z instrumentami smyczkowymi niż z moim pianinem elektrycznym, czy może to być spowodowane tym, że harmoniczne są tygodniowe w przypadku pianina?
Valentin Radu,
@mindnoise: Instrumenty strunowe pochylone są harmoniczne, a instrumenty strunowe lub strunowe mają en.wikipedia.org/wiki/Inharmonicity . Nie jestem pewien, czy to część problemu
endolith
@endolith może być szczególnie dlatego, że: „Im mniej elastyczne są struny (to znaczy, że są krótsze, grubsze i sztywniejsze), tym bardziej wykazują nieharmoniczność ”. i dostaję błąd dokładnie na tego typu ciągach (wysokie nuty). Właściwie podstawa jest zawsze najsilniejszym freqem w moim FFT, gdy pojawia się błąd, więc na pewno ma to związek z harmonicznymi lub algorytmem hps, jednak nie jestem pewien, dlaczego otrzymuję śmieci 20-50 Hz dla podstawy 1500 Hz. opublikuje algorytm hps.
Valentin Radu,
1
@mindnoise: „Nieharmoniczność w dużej mierze wpływa na najniższe i najwyższe nuty w fortepianie ... Najniższe struny, które musiałyby być najdłuższe, są najbardziej ograniczone przez wielkość fortepianu. Projektant krótkiego fortepianu jest zmuszony używać grube struny w celu zwiększenia gęstości masy, a tym samym doprowadzone do nieharmoniczności. Najwyższe struny muszą być pod największym napięciem, ale muszą być również cienkie, aby umożliwić niską gęstość masy. Ograniczona wytrzymałość stali zmusza projektanta fortepianu do użycia bardzo krótkich struny, których krótkie długości fal powodują w ten sposób nieharmoniczność. ”
endolith
2

W przypadku niektórych instrumentów liczba wytwarzanych znaczących harmonicznych może się zmieniać w różnych zakresach wysokości. Częściowe najniższych i najwyższych nut dla niektórych instrumentów fizycznych mogą wykazywać większą nieharmoniczność. Liczba harmonicznych, które mogą zmieścić się poniżej odcięcia filtra anty-aliasowego poniżej Fs / 2, z pewnością będzie niższa dla bardzo wysokich tonów. Twój estymator wysokości HPS może chcieć wziąć pod uwagę te czynniki.

Przejściowy atak niektórych instrumentów może wytwarzać aharmoniczne spektralne pasmo szumu, które może pokrywać się z obszarem wyszukiwania HPS niektórych tonów lub ich znacznymi harmonicznymi.

Potencjalnie podtony bardzo wysokich częstotliwości mogą nawet owijać się wokół Fs / 2, jeśli filtr dolnoprzepustowy przed ADC audio nie ma wystarczająco dobrego tłumienia pasma zatrzymania.

hotpaw2
źródło