โค้ด/สเก็ตช์นี้จะแสดงความถี่โดยประมาณ รวมถึงโน้ตดนตรีที่เล่นบนคีย์บอร์ดอิเล็กทรอนิกส์หรือแอปเปียโน สำหรับโปรเจกต์นี้ เอาต์พุตอนาล็อกจากโมดูลตรวจจับเสียงจะถูกส่งไปยังอินพุตอนาล็อก A0 ของ Arduino Uno จากนั้นสัญญาณอนาล็อกจะถูกสุ่มตัวอย่างและแปลงเป็นดิจิทัล (Quantized) โค้ดจะใช้เทคนิค Autocorrelation, การให้น้ำหนัก และการปรับแต่ง เพื่อหาความถี่พื้นฐาน (Fundamental Frequency) โดยใช้ข้อมูลจาก 3 คาบแรก จากนั้นความถี่พื้นฐานที่ได้จะถูกนำไปเปรียบเทียบกับความถี่โน้ตในช่วงอ็อกเทฟ 3, 4 และ 5 เพื่อหาโน้ตดนตรีที่มีความถี่ใกล้เคียงที่สุด สุดท้าย โน้ตที่คาดการณ์ไว้สำหรับความถี่ที่ใกล้ที่สุดจะถูกพิมพ์ออกมาที่หน้าจอ
ความวุ่นวายของคลื่นเสียงดิบ (Raw Audio Wave)
ต่างจากสัญญาณดิจิทัลที่สะอาดตา คลื่นเสียงอนาล็อกจากเครื่องดนตรีเนี่ยมันคือความโกลาหลของความถี่ที่ทับซ้อนกัน ฮาร์มอนิก และเสียงรบกวนหลังบ้าน จัดเต็ม
- ต่อ เซ็นเซอร์เสียง KY-038 หรือ ไมโครโฟนแบบอิเล็กเตร็ต MAX4466 เข้ากับพินอนาล็อก
A0ของ Arduino - Arduino ต้องสุ่มตัวอย่างแรงดันไฟฟ้าดิบให้เร็วมากๆ (เช่น 20,000 ครั้งต่อวินาที) โดยใช้การจัดการรีจิสเตอร์ ADC โดยตรง เพื่อเติมข้อมูลลงในอาร์เรย์ RAM ขนาดใหญ่
- ถ้าเอาไปพล็อตกราฟดู ข้อมูลพวกนี้จะดูเหมือนคลื่นรูปทรงประหลาดๆ ซับซ้อนวุ่นวายไปหมด
การถอดรหัสด้วยอัลกอริทึม FFT
หัวใจของการตรวจจับโน้ตอยู่ที่อัลกอริทึมทรงพลังอย่าง Fast Fourier Transform (FFT) โปรเจกต์นี้ใช้ Autocorrelation แต่หลักการก็คล้ายกับการวิเคราะห์ด้วย FFT
- มันรับเอาคลื่นเส้นเดียวที่ยุ่งเหยิงและซับซ้อนจากไมโครโฟน
- จากนั้นมันจะแยกย่อยเส้นนั้นทางคณิตศาสตร์ออกเป็นความถี่องค์ประกอบต่างๆ
- โปรโตคอลตรวจจับจุดสูงสุด (Peak Detection): โค้ดจะกวาดผ่านข้อมูลที่วิเคราะห์แล้วเพื่อหาความถี่พื้นฐาน
- ถ้าตรวจพบความถี่
439.8 Hzตรรกะของ Arduino ก็จะรู้ทันทีว่านั่นคือโน้ต A4 พื้นฐาน! - มันจะอัปเดตการแสดงผลทันที พิมพ์โน้ตที่ระบุได้ออกมา
สิ่งที่ต้องมีสำหรับการวิเคราะห์เสียง
- Arduino Uno/Nano (การคำนวณ Autocorrelation และ FFT จะผลักดันโปรเซสเซอร์ ATmega ให้ทำงานถึงขีดจำกัดเลยนะตัวนี้)
- ไมโครโฟนอนาล็อกที่เหมาะสม (เซ็นเซอร์เสียงดิจิทัลราคาถูกพวกนั้นให้เอาต์พุตแค่สัญญาณสูง/ต่ำเท่านั้น ใช้วิเคราะห์ความถี่ไม่ได้เด็ดขาด ต้องจับคลื่นรูปคลื่นอนาล็อกเต็มๆ เท่านั้น!)
- จอแสดงผล เช่น จอ OLED 0.96" SSD1306 แบบ I2C เพื่อแสดงผลโน้ตดนตรีที่ตรวจจับได้อย่างสวยงาม
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับโปรเจกต์นี้ สามารถหาข้อมูลเพิ่มเติมได้จากแหล่งข้อมูลที่เกี่ยวข้อง