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:
wyniki są najgorsze dla wyższych tonów, jeśli podstawa jest wyższa od A6 lub mniej więcej, dostaję tylko śmieciowe dane.
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)
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ć:
- Częstotliwość próbkowania, z którą nagrywam, wynosi 44100 Hz
- Zauważyłem, że takie zachowanie jest ledwo widoczne na gitarze, ale bardzo widoczne na pianinie cyfrowym (dla tej samej granej nuty)
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; }
źródło
Odpowiedzi:
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 ...
źródło
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.
źródło