ฉันใช้อัลกอริทึมการตรวจจับพิชชันโดยใช้ HPS และฉันประสบปัญหา ฉันเป็นผู้เริ่มต้นด้วยการประมวลผลสัญญาณและเว็บไซต์นี้ช่วยฉันมาก่อนดังนั้นฉันจึงควรถาม
สำหรับสนามที่สูงขึ้น ( eg. >C6:1046.50hz
) ฉันกำลังเริ่มรับข้อมูลขยะจาก HPS ยิ่งระดับเสียงสูงขึ้นเท่าไรฉันก็ยิ่งได้รับขยะมากขึ้นเท่านั้น (โดยขยะฉันหมายถึงความถี่ที่ไม่ใช่ข้อผิดพลาดระดับแปดเสียงหรือเสียงประสานและอยู่ที่ประมาณ 1Hz-20Hz)
สิ่งที่ฉันสังเกตุเห็น:
ผลลัพธ์นั้นเลวร้ายที่สุดสำหรับสนามที่สูงกว่าถ้าพื้นฐานอยู่เหนือ A6 หรือมากกว่านั้นฉันได้รับข้อมูลขยะเท่านั้น
FFT ใช้งานได้ดีแม้ในระดับเสียงที่สูงมาก (โดยละเอียดฉันหมายถึงจุดสูงสุดของมันแสดงให้เห็นถึงพื้นฐานหรือหนึ่งเดียวของฮาร์โมนิกของมัน แต่ไม่ใช่ขยะ)
ถ้าฉันลดจำนวนของฮาร์โมนิกที่ฉันคำนึงถึงสำหรับ HPS ขยะจะลดลง แต่นั่นทำให้ยากที่จะแยกแยะระหว่างพื้นฐานและฮาร์โมนิก
นี่คืออัลกอริทึมของฉัน:
->raw buffer -> hann window, 16384 samples, 50% overlap -> zero padding -> FFT -> HPS
ความช่วยเหลือใด ๆ ที่เป็นที่นิยม!
อัปเดต 1: ดังนั้นมีอีกสองสามสิ่งที่ฉันต้องการเพิ่ม:
- อัตราตัวอย่างที่ฉันบันทึกที่ 44100 Hz
- ฉันสังเกตว่าพฤติกรรมนี้แทบจะมองไม่เห็นในกีตาร์ แต่มองเห็นได้ชัดเจนบนเปียโนดิจิตอล (สำหรับโน้ตตัวเดียวกัน)
นี่คืออัลกอริทึม 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; }