ฉันใช้เวลาหลายปีทำการค้นคว้าการตรวจจับพิทช์เกี่ยวกับดนตรีโพลีโฟนิค - เหมือนกับการตรวจสอบบันทึกของกีต้าร์โซโลในการบันทึก mp3 ฉันยังเขียนหัวข้อใน Wikipedia ซึ่งให้คำอธิบายสั้น ๆ เกี่ยวกับกระบวนการ (ดูที่ส่วนย่อย "Pitch detection" ในลิงค์ด้านล่าง)
เมื่อกดปุ่มเดียวบนเปียโนสิ่งที่เราได้ยินไม่ใช่แค่การสั่นสะเทือนความถี่เดียว แต่เป็นการรวมกันของการสั่นสะเทือนเสียงหลายครั้งที่เกิดขึ้นในความถี่ที่เกี่ยวข้องกับคณิตศาสตร์ที่แตกต่างกัน องค์ประกอบของการสั่นสะเทือนประกอบกันที่ความถี่ที่ต่างกันนี้เรียกว่าฮาร์โมนิกหรือชิ้นงาน ตัวอย่างเช่นถ้าเรากดปุ่มกลาง C บนเปียโนความถี่ของเสียงประสานของแต่ละคอมโพสิตจะเริ่มต้นที่ 261.6 Hz เป็นความถี่พื้นฐาน 523 Hz จะเป็นฮาร์มอนิก 2, 785 Hz จะเป็นฮาร์มอนิกอันดับที่ 3, 1,046 Hz เป็นฮาร์มอนิกที่ 4 เป็นต้นฮาร์มอนิกต่อมาคือทวีคูณทวีคูณของความถี่พื้นฐาน 261.6 Hz (เช่น 2 x 261.6 = 523, 3 x 261.6 = 785, 4 x 261.6 = 1,046)
ฉันใช้การแปลง DFT Logarithmic ที่แก้ไขแล้วเพื่อตรวจหาฮาร์โมนิกส์ที่เป็นไปได้ก่อนโดยค้นหาความถี่ที่มีระดับสูงสุด (ดูแผนภาพด้านล่าง) เนื่องจากวิธีการที่ผมรวบรวมข้อมูลสำหรับการเข้าสู่ระบบของฉัน DFT แก้ไขฉันไม่ได้ที่จะใช้ฟังก์ชั่น Windowing สัญญาณหรือไม่เพิ่มและทับซ้อนกัน และฉันได้สร้าง DFT เพื่อให้ช่องความถี่ของมันตั้งอยู่แบบลอการิทึมเพื่อปรับให้ตรงกับความถี่ที่ฮาร์มอนิกถูกสร้างโดยโน้ตบนกีตาร์แซกโซโฟน ฯลฯ
ตอนนี้ถูกเกษียณฉันได้ตัดสินใจที่จะปล่อยซอร์สโค้ดสำหรับเครื่องมือตรวจจับสนามของฉันภายในแอพพลิเคสาธิตฟรีที่เรียกว่าPitchScope เล่น PitchScope Player มีอยู่ในเว็บและคุณสามารถดาวน์โหลดไฟล์ปฏิบัติการสำหรับ Windows เพื่อดูอัลกอริทึมของฉันที่ทำงานบนไฟล์ mp3 ที่คุณเลือก ลิงค์ด้านล่างไปที่ GitHub.com จะนำคุณไปสู่ซอร์สโค้ดเต็มของฉันซึ่งคุณสามารถดูวิธีตรวจจับฮาร์โมนิกด้วยการแปลง DFT แบบลอการิทึมแบบกำหนดเองแล้วมองหาพาร์ติชัน (ฮาร์โมนิก) ที่ความถี่ตรงกับความสัมพันธ์ สนาม'
อัลกอริทึมการตรวจจับ Pitch ของฉันเป็นจริงสองขั้นตอน: ก) ขั้นแรกตรวจพบScalePitch ('ScalePitch' มีค่าระยะห่างที่เป็นไปได้ 12 ค่า: {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) และหลังจากกำหนด ScalePitch แล้วOctaveจะถูกคำนวณโดยการตรวจสอบฮาร์โมนิกทั้งหมดสำหรับโน้ต 4 คู่ที่เป็นไปได้ อัลกอริทึมถูกออกแบบมาเพื่อตรวจจับระยะห่างที่โดดเด่นที่สุด (โน้ตดนตรี) ในช่วงเวลาใดก็ตามในไฟล์ MP3 โพลีโฟนิก ที่มักจะสอดคล้องกับบันทึกของโซโล่บรรเลง ผู้ที่สนใจในซอร์สโค้ด C ++ สำหรับอัลกอริทึมการตรวจจับระยะห่าง 2 ระดับของฉันอาจต้องการเริ่มต้นที่ฟังก์ชัน Estimate_ScalePitch () ภายในไฟล์ SPitchCalc.cpp ที่ GitHub.com
https://github.com/CreativeDetectors/PitchScope_Player
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
ด้านล่างเป็นภาพของ Logarithmic DFT (สร้างโดยซอฟต์แวร์ C ++ ของฉัน) เป็นเวลา 3 วินาทีของกีตาร์โซโลในการบันทึกเสียง MP3 แบบโพลีโฟนิค มันแสดงให้เห็นว่าฮาร์มอนิกปรากฏอย่างไรสำหรับโน้ตแต่ละอันของกีตาร์ในขณะที่เล่นโซโล สำหรับโน้ตแต่ละอันเกี่ยวกับ DFT ลอการิทึมนี้เราสามารถเห็นฮาร์โมนิกหลายตัวที่ขยายในแนวตั้งเพราะแต่ละฮาร์มอนิกจะมีความกว้างเวลาเท่ากัน หลังจากกำหนดโน้ตคู่ของโน้ตแล้วเรารู้ความถี่ของพื้นฐาน
แผนภาพด้านล่างแสดงให้เห็นถึงอัลกอริทึมการตรวจจับคู่ซึ่งฉันพัฒนาขึ้นเพื่อเลือกบันทึกคู่ที่ถูกต้อง (นั่นคือพื้นฐานที่ถูกต้อง) เมื่อมีการกำหนด ScalePitch สำหรับบันทึกย่อนั้น ผู้ที่ต้องการเห็นวิธีการใน C ++ ควรไปที่ฟังก์ชัน Calc_Best_Octave_Candidate () ภายในไฟล์ชื่อ FundCandidCalcer.cpp ซึ่งมีอยู่ในซอร์สโค้ดของฉันที่ GitHub