Acoustic Hacking: Pure Code DTMF Decoder
"Tone Decoders" ส่วนใหญ่ใช้วิธีลัดโดยอาศัยชิปฮาร์ดแวร์เฉพาะ (เช่น MT8870) ในการประมวลผลทางคณิตศาสตร์ Pure Code DTMF Decoder บังคับให้ชิป ATmega328P 16MHz ของ Arduino สุ่มตัวอย่างอินพุตแบบอะนาล็อกอย่างเข้มข้น และรันการวิเคราะห์สเปกตรัมทางคณิตศาสตร์แบบเรียลไทม์ โดยทำงาน Goertzel Algorithm ได้ในตัว

Bypassing the analogRead() Speed Limit
ในการตรวจจับความถี่เสียงได้สูงถึง 1500Hz นั้น Arduino จะต้องทำการสุ่มตัวอย่างหลายร้อยครั้งต่อมิลลิวินาที ฟังก์ชัน analogRead() มาตรฐานใช้เวลาทำงานนานกว่า 100 ไมโครวินาที ซึ่งช้าเกินไปมากสำหรับการประมวลผลเสียง!
- การจัดการ ADC โดยตรง: คุณต้องใช้ C++ ขั้นสูงเพื่อเขียน Prescaler bits ระดับ Assembly ภายในชิป ATmega ใหม่
- ด้วยการตั้งค่ารีจิสเตอร์
ADCSRAคุณจะโอเวอร์คล็อก Analog-to-Digital Converter อย่างหนัก ทำให้ความเร็วในการสุ่มตัวอย่างเพิ่มขึ้นจาก 9kHz เป็นเกือบ 38kHz!
The Matrix Detection (Goertzel)
โทน DTMF เป็นการผสมผสานของความถี่สองความถี่ที่แน่นอน (เช่น การกด "3" จะส่งออก 697Hz + 1477Hz)
- Arduino จะเติมอาร์เรย์ด้วยตัวอย่างเสียงความเร็วสูง
- มันจะรันสมการ Goertzel ทางคณิตศาสตร์เจ็ดสมการพร้อมกันอย่างรวดเร็ว เพื่อค้นหาความถี่ไฮแบนด์สี่ความถี่และความถี่โลว์แบนด์สามความถี่ที่เฉพาะเจาะจง
- หากขนาดของ 697Hz และ 1477Hz ผ่านเกณฑ์ที่กำหนดไว้ในโค้ดพร้อมกัน มันจะพิมพ์
Key Pressed: 3!ไปยัง Serial Monitor
The Absolute Minimum Hardware
- Arduino Uno (หรือ Mega สำหรับบัฟเฟอร์ RAM เพิ่มเติม)
- Electret/MEMS Microphone Breakout (MAX4466): แนะนำเป็นอย่างยิ่งให้มีการขยายสัญญาณในตัว เนื่องจากไมโครโฟนเปล่าจะผลิตสัญญาณที่เล็กเกินไปที่ Arduino จะอ่านได้อย่างแม่นยำ
- (คำเตือน: โปรเจกต์นี้ต้องมีการเพิ่มประสิทธิภาพอย่างหนัก คำสั่ง
Serial.printที่ผิดพลาดในลูปใดๆ จะทำลายจังหวะเวลาที่แม่นยำซึ่งจำเป็นสำหรับการสุ่มตัวอย่างเสียงในทันที)