আমি এইচপিএস ব্যবহার করে একটি পিচ সনাক্তকরণ অ্যালগরিদম তৈরি করেছি এবং আমি একটি সমস্যার মুখোমুখি হয়েছি। আমি সিগন্যাল প্রসেসিংয়ের সাথে এক শিক্ষানবিস এবং এই সাইটটি আমাকে আগে সহায়তা করেছিল, তাই আমার জিজ্ঞাসা করা উচিত।
উচ্চতর পিচের জন্য ( eg. >C6:1046.50hz
) আমি এইচপিএস থেকে আবর্জনা ডেটা পেতে শুরু করছি। আমি যত বেশি আবর্জনা পেয়েছি পিচটি তত বেশি হবে (আবর্জনার দ্বারা আমি ফ্রিকোয়েন্সিগুলি বোঝাই যা অষ্টক ত্রুটি বা সুরেলা নয় এবং 1Hz-20Hz এর কাছাকাছি)
আমি যা অনুভব করে দেখেছি:
ফলাফলগুলি উচ্চতর পিচের জন্য সবচেয়ে খারাপ, যদি মৌলিক A6 বা তার বেশি হয় তবে আমি কেবল জঞ্জালের ডেটা পাই।
এফএফটি এমনকি খুব উঁচু পিচের জন্যও সূক্ষ্মভাবে কাজ করে, (সূক্ষ্মভাবে আমি বলতে চাইছি যে এর শিখরটি মৌলিক বা এর সুরেলাগুলির মধ্যে একটি দেখায়, তবে আবর্জনা নয়)
যদি আমি এইচপিএসের জন্য বিবেচনা করি এমন সুরেলা সংখ্যা কম করি তবে আবর্জনা হ্রাস পায়, তবে এটি মৌলিক এবং সুরেলাগুলির মধ্যে বৈষম্য করা আরও শক্ত করে তোলে।
এখানে আমার অ্যালগরিদম:
->raw buffer -> hann window, 16384 samples, 50% overlap -> zero padding -> FFT -> HPS
কোন সাহায্য প্রশংসা করা হয়!
আপডেট 1: সুতরাং, আমি আরও কয়েকটি জিনিস যুক্ত করতে চাই:
- আমি যে নমুনা রেটে রেকর্ড করছি তা হ'ল 44100 হার্জ
- আমি দেখেছি যে এই আচরণটি গিটারে সবে দৃশ্যমান, তবে একটি ডিজিটাল পিয়ানোতে খুব একই দৃশ্যমান (একই প্লে নোটের জন্য)
এখানে আমার এইচপিএস অ্যালগরিদম, সম্ভবত আরও বেশি অভিজ্ঞতার সাথে কেউ সমস্যা চিহ্নিত করতে পারে।
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; }