HPS kullanarak bir adım algılama algoritması yaptım ve bir sorunla karşılaşıyorum. Ben sinyal işleme ile bir acemi ve bu site daha önce bana yardımcı oldu, bu yüzden sormalıyım rağmen.
Daha yüksek sahalar için ( eg. >C6:1046.50hz
) HPS'den çöp verileri almaya başlıyorum. Saha ne kadar yüksek olursa o kadar çok çöp alırım (çöple oktav hatası veya harmonik olmayan ve 1Hz-20Hz civarında olan frekansları kastediyorum)
Deneysel olarak gözlemlediklerim:
sonuçlar daha yüksek sahalar için en kötüsüdür, eğer temel A6'nın üzerindeyse, sadece çöp verileri alırım.
FFT çok yüksek bir adım için bile iyi çalışıyor,
HPS için dikkate aldığım harmonik sayısını azaltırsam, çöp azalır, ancak bu temel ve harmonikler arasında ayrım yapmayı zorlaştırır.
İşte benim algoritma:
->raw buffer -> hann window, 16384 samples, 50% overlap -> zero padding -> FFT -> HPS
Herhangi bir yardım takdir!
GÜNCELLEME 1: Eklemek istediğim birkaç şey daha var:
- Kaydettiğim örnekleme hızı 44100 Hz
- Bu davranışın bir gitarda zar zor görülebildiğini, ancak dijital piyanoda çok görünür olduğunu gördüm (aynı çalınan nota için)
İşte benim hps algoritması, belki daha büyük deneyime sahip biri bir problemi tespit edebilir.
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; }