मैंने एचपीएस का उपयोग करके एक पिच डिटेक्शन एल्गोरिदम बनाया है और मैं एक समस्या का सामना कर रहा हूं। मैं सिग्नल प्रोसेसिंग के साथ शुरुआत कर रहा हूं और इस साइट ने मुझे पहले मदद की है, इसलिए मुझे हालांकि पूछना चाहिए।
उच्च पिचों के लिए ( eg. >C6:1046.50hz
) मैं एचपीएस से कचरा डेटा प्राप्त करना शुरू कर रहा हूं। जितनी अधिक पिच उतनी अधिक कचरा मुझे मिलता है (कचरे से मेरा मतलब आवृत्तियों से है जो ओक्टेव त्रुटियां नहीं हैं और न ही हार्मोनिक्स हैं और लगभग 1 हर्ट्ज-20 हर्ट्ज हैं)
क्या मैंने अनुभवजन्य अवलोकन किया है:
परिणाम उच्च पिचों के लिए सबसे खराब हैं, अगर मौलिक ए 6 या तो ऊपर है, तो मुझे केवल कचरा डेटा मिलता है।
एफएफटी बहुत ऊंची पिच के लिए भी ठीक काम करता है, (ठीक है मेरा मतलब है कि इसकी चोटी या तो मौलिक या इसके हार्मोनिक्स में से एक दिखाती है, लेकिन कचरा नहीं)
यदि मैं एचपीएस के लिए विचार करने वाले हारमोंस की संख्या कम करता हूं, तो कचरा कम हो जाता है, लेकिन इससे मूलभूत और हार्मोनिक्स के बीच भेदभाव करना कठिन हो जाता है।
यहाँ मेरा एल्गोरिथ्म है:
->raw buffer -> hann window, 16384 samples, 50% overlap -> zero padding -> FFT -> HPS
किसी भी मदद की सराहना की है!
अद्यतन 1: तो, कुछ और चीजें हैं जिन्हें मैं जोड़ना चाहता हूं:
- मैं जिस नमूना दर को रिकॉर्ड कर रहा हूं वह 44100 हर्ट्ज है
- मैंने देखा है कि यह व्यवहार एक गिटार पर मुश्किल से दिखाई देता है, लेकिन एक डिजिटल पियानो (एक ही खेले गए नोट के लिए) पर बहुत अधिक दिखाई देता है
यहाँ मेरा 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; }