ESP32 Spectrum Analyzer: แยกเสียง 20 Hz–20 kHz ขึ้นจอ 3.5 นิ้ว
เมื่อก่อนการทำ Spectrum Analyzer สวย ๆ ในโปรเจกต์ DIY อาจต้องใช้ Hardware หลายส่วน แต่ Project ของ Mirko “mircemk” Pavleski แสดงให้เห็นว่า ESP32 บน CrowPanel 3.5 นิ้ว สามารถรับ Audio ผ่าน ADC, ทำ FFT และวาด Spectrum แบบ 32 Bars บนจอ 480×320 ได้ในตัวเดียว
จุดน่าสนใจคือ Project ไม่ได้ใช้ Dedicated Spectrum Analyzer IC แต่ให้งานตั้งแต่ Sampling, Frequency Analysis ไปจนถึง Graphics Rendering เกิดบน ESP32 โดยเพิ่มวงจร Passive เพียงไม่กี่ชิ้นที่ Audio Input
- Project ใช้ CrowPanel 3.5" HMI ESP32 Display ความละเอียด 480×320
- Audio Signal ถูกป้อนเข้า ADC ที่ GPIO35
- Input ถูก Bias ไว้ประมาณ 1.6 V ด้วย Resistor 100 kΩ สองตัว
- มี Capacitor สำหรับ Block DC และ 1 kΩ Resistor ตามวงจรของผู้สร้าง
- 32-bar Version แยก FFT เป็น Low และ High Frequency สองชุด
- Low FFT ใช้ 256 Samples ที่ 4 kHz สำหรับช่วงประมาณ 20 Hz–2 kHz
- High FFT ใช้ 256 Samples ที่ 40 kHz สำหรับช่วงประมาณ 2 kHz–20 kHz
- มี Noise-floor Calibration ตอน Startup และต้องให้ Audio Input เงียบในช่วงนั้น
- ผู้สร้างระบุเองว่า Project นี้เน้น Visual Effect ไม่ใช่ Precision Audio Instrument
ESP32 Audio Spectrum Analyzer ตัวนี้คืออะไร?
Spectrum Analyzer ทำหน้าที่แยกให้เราเห็นว่า Audio Signal มีพลังงานกระจายอยู่ตาม Frequency ต่าง ๆ อย่างไร แทนที่จะมอง Signal เป็น Waveform เดียวตามเวลา
ใน Project นี้ ESP32 อ่าน Audio จาก ADC แล้วใช้ FFT หรือ Fast Fourier Transform เพื่อเปลี่ยนข้อมูลจาก Time Domain ไปเป็น Frequency Domain ก่อนรวม Frequency Bin ต่าง ๆ เข้ากับ Bars บนหน้าจอ
รับสัญญาณ AC จากแหล่งเสียง
เตรียมสัญญาณให้ ADC ของ ESP32 อ่านได้
Sample Audio Signal
วิเคราะห์ Frequency Content
รวม FFT Bins เข้าเป็นแต่ละ Bar
Render Spectrum, Peak และ Animation
CrowPanel 3.5" ทำหน้าที่อะไร?
Hackaday ระบุว่า Project ใช้ CrowPanel 3.5" ซึ่งรวม ESP32 เข้ากับ Touchscreen LCD ความละเอียด 480×320 ทำให้ไม่ต้องแยก Microcontroller Board และ Display Module เป็นคนละชิ้น
CrowPanel 3.5" รุ่น Basic ที่ Original Project ใช้อ้างอิง ใช้ ESP32-WROVER-B และจอ TFT Controller ตระกูล ILI9488 ตามข้อมูลของ Elecrow
Hackaday ยังตั้งข้อสังเกตว่า Concept ไม่ได้ผูกติดกับ CrowPanel เท่านั้น Display อื่นอาจให้ผลใกล้เคียงได้ แต่จะต้องแก้ Code และ Configuration ให้ตรงกับ Hardware นั้น
Audio Signal เข้า ADC ของ ESP32 อย่างไร?
Audio เป็นสัญญาณ AC ซึ่งมีส่วนของ Waveform ที่แกว่งทั้งเหนือและต่ำกว่าจุดอ้างอิง แต่ ADC ของ Microcontroller ต้องอ่านสัญญาณในช่วงที่เหมาะสมกับ Input ของมัน
Original Project จึง Bias GPIO35 ไว้ประมาณ 1.6 V ด้วย Resistor 100 kΩ สองตัว ทำให้ Audio Waveform แกว่งอยู่รอบ Reference Level นี้
| ส่วนของ Input | หน้าที่ตาม Source |
|---|---|
| GPIO35 | ADC Input สำหรับ Audio Signal |
| 2× 100 kΩ | สร้าง Reference / Bias ประมาณ 1.6 V |
| Capacitor | Block DC Component ที่อาจมากับ Audio Input |
| 1 kΩ Resistor | ผู้สร้างระบุว่าใช้ช่วยป้องกัน Input จาก Signal ที่ไม่เหมาะสม |
จาก Audio Signal ไปเป็น Spectrum Bars ได้อย่างไร?
หลัง Audio เข้า ADC แล้ว ESP32 จะ Sample Signal เป็นชุดตัวเลขตามเวลา จากนั้น Code ใช้ FFT เพื่อคำนวณ Magnitude ของ Frequency Bin ต่าง ๆ
ใน Source Code 32 Bars ขั้นตอนหลักคือ:
อ่าน GPIO35 ตาม Sampling Rate ที่กำหนด
Code หาค่าเฉลี่ยของ Samples แล้วลบออกจากข้อมูล
ใช้ Windowing ก่อนทำ FFT
แปลง Sample ไปเป็นข้อมูล Frequency
รวม Bin เข้าเป็นช่วง Frequency ของแต่ละ Bar
Apply Noise Floor, Smoothing, Fall Speed และ Peak
วาด Spectrum บน TFT
Code ยังใช้ Frequency Band แบบ Logarithmic เพื่อกระจายพื้นที่ของ Bars ให้เหมาะกับ Frequency Range ที่กว้าง ตั้งแต่ระดับสิบ Hz ไปจนถึงหลาย kHz
ทำไม 32 Bars ต้องใช้ FFT สองช่วง?
ถ้าใช้ Sampling Rate ชุดเดียวครอบคลุมตั้งแต่ 20 Hz ถึง 20 kHz จะต้อง Trade-off ระหว่างการครอบคลุม High Frequency กับ Frequency Resolution ของ Low Frequency
Version 32 Bars ของ Project จึงแบ่งงานเป็น FFT สองชุด
| FFT | Samples | Sampling Rate | ช่วงที่ใช้ใน Code | Bars |
|---|---|---|---|---|
| Low FFT | 256 | 4,000 Hz | 20 Hz–2 kHz | 0–15 |
| High FFT | 256 | 40,000 Hz | 2 kHz–20 kHz | 16–31 |
Comment ใน Source Code ระบุ Resolution โดยประมาณ: Low FFT ราว 15.6 Hz ต่อ Bin และ High FFT ราว 156 Hz ต่อ Bin
24 Bars กับ 32 Bars ต่างกันอย่างไร?
Original Project ให้ Source Code สอง Version
24-bar Version
ผู้สร้างอธิบายว่าเป็น Standard Version สำหรับ Spectrum Display แบบ 24 Bars
32-bar Version
ใช้การ Process ที่เฉพาะกว่า โดยแบ่งช่วง 20 Hz–20 kHz ออกเป็น Low และ High Frequency แล้วประมวลผลสองส่วนแยกกัน
บทความนี้จึงใช้ 32-bar Version เป็นตัวอธิบาย Technical Flow หลัก เพราะ Source Code ของ Version นี้ระบุ Sampling Configuration และ Noise Calibration ไว้ชัดเจน
ทำไมเปิดเครื่องแล้วต้องให้ Audio เงียบ?
Source ระบุว่าช่วงแรกหลัง Startup ต้องให้ Audio Input อยู่ที่ Zero เพราะ Firmware กำลังวัด Noise Floor
ใน 32-bar Code มี:
- NOISE_CAL_FRAMES = 12
- NOISE_MARGIN = 1.5
Firmware ทำ FFT ทั้ง Low และ High หลาย Frame ระหว่างช่วง Calibration แล้วเก็บระดับ Noise ต่อ Bar เพื่อนำมาใช้เป็น Threshold ในการแสดงผล
Stereo Version ใช้ CrowPanel สองจออย่างไร?
Original Project เรียกงานนี้ว่า Stereo Audio Spectrum Analyzer และ Components List ระบุ CrowPanel 3.5" จำนวน 2 จอ
Source Code 32 Bars ที่ตรวจสอบได้ แสดงชื่อบนหน้าจอว่า: Spectrum Analyzer [L]
จึงสอดคล้องกับแนวทางที่แต่ละ Display ใช้รับและแสดง Audio Channel แยกกัน
Spectrum นี้แม่นแค่ไหน?
จุดนี้ผู้สร้างอธิบายตรงมากว่า Project ไม่ได้ตั้งใจเป็น Precise Audio Instrument แต่เน้นเป็น Visual Addition ให้ระบบเสียง
การ Process ยังจงใจทำให้ Extreme Low และ High Frequency เด่นขึ้นเมื่อเทียบกับ Midrange เพื่อให้ภาพ Spectrum ดูน่าสนใจมากขึ้น
ดังนั้นคำที่เหมาะกับ Project นี้คือ DIY Audio Spectrum Visualizer หรือ Spectrum Analyzer เพื่อการแสดงผล มากกว่าเครื่องมือวิเคราะห์ Audio สำหรับงาน Measurement
ใช้ Arduino IDE และ Library อะไร?
Original Project ระบุให้เลือก Board:
ESP32 DEV Module
Code ใช้ Library หลักที่ตรวจสอบได้ ได้แก่:
- Arduino Core
- TFT_eSPI
- arduinoFFT
CrowPanel ยังมี Hardware Revision ต่างกัน ดังนั้นหาก Board ที่ใช้อยู่ไม่ตรงกับ Revision ของผู้สร้าง ควรตรวจ Pin Assignment และ Documentation ของ Elecrow ก่อนแก้ Configuration
FFT Configuration ใน Code
ส่วน Configuration ด้านล่างมาจาก Source Code ของ 32-bar Version และแสดงค่าหลักที่กำหนดโครงสร้างของ Spectrum
#define SCREEN_WIDTH 480
#define SCREEN_HEIGHT 320
#define NUM_BARS 32
#define ADC_PIN 35
#define SAMPLES_LOW 256
#define SAMPLING_LOW 4000
#define SAMPLES_HIGH 256
#define SAMPLING_HIGH 40000
#define NUM_BARS_LOW 16
#define NUM_BARS_HIGH 16
#define NOISE_CAL_FRAMES 12
#define NOISE_MARGIN 1.5f
Source Code ยังตั้ง ADC เป็น 12-bit และใช้ ADC_11db ใน Version ที่ตรวจสอบ แต่บทความนี้จะไม่ใช้ค่าดังกล่าวไปอนุมาน Maximum Audio Input Voltage เพราะ Source ไม่ได้ให้ค่าที่รองรับไว้
ปรับ Movement ของ Bars ได้ตรงไหน?
ผู้สร้างตั้งใจให้ Code ปรับ Visual Behavior ได้ และวาง Parameter หลักไว้ช่วงต้นของโปรแกรม
ใน 32-bar Source มีตัวอย่าง Parameter เช่น:
- Peak Hold Frames
- Fall Speed
- Peak Fall Speed
- Rise Smoothing
- Noise Margin
Parameter เหล่านี้มีผลกับการตอบสนองและ Animation ของ Bars มากกว่าการเปลี่ยน Hardware
ดู ESP32 Spectrum Analyzer ทำงานจริง
วิดีโอของผู้สร้างแสดงการทำงานของ CrowPanel กับ Audio Signal และการตอบสนองของ Spectrum Bars ในสถานการณ์ใช้งานจริง
Maker ได้อะไรจาก Project นี้?
1. Analog Signal เข้า MCU ต้องคิดเรื่อง Bias
Audio ไม่ได้เป็น Logic HIGH/LOW และไม่ควรต่อเข้า ADC โดยไม่คำนึงถึง Reference Level Project นี้จึงเป็นตัวอย่างของ AC Coupling และ Bias ก่อนเข้า Microcontroller
2. Sampling Rate เปลี่ยนสิ่งที่ FFT มองเห็น
Low และ High FFT ใช้ Sampling Rate คนละค่า เพื่อจัดการ Trade-off ระหว่าง Frequency Resolution และ Frequency Range
3. FFT Result ยังไม่ใช่ UI
หลังได้ Magnitude แล้ว ยังต้องแบ่ง Bands, จัดการ Noise, Smooth Movement, Peak Hold และ Render Graphics ก่อนจะกลายเป็น Spectrum ที่คนดูเข้าใจได้
4. Visualizer กับ Measurement Instrument ต่างกัน
Project นี้แสดงให้เห็นว่าการออกแบบ Visual Response อาจจงใจ Weight Frequency บางช่วงเพื่อความสวยงาม ซึ่งต่างจากเครื่องมือ Measurement ที่ต้องรักษาความถูกต้องตาม Reference ที่กำหนด
5. ESP32 ทำ DSP และ Graphics พร้อมกันได้ใน Project เดียว
จาก ADC Sampling ไปถึง FFT และ TFT Rendering ทั้งหมดถูกรวมอยู่บน Platform เดียว จึงเป็น Project ที่เชื่อม Embedded Programming, Digital Signal Processing และ Display Graphics เข้าด้วยกัน
โปรเจกต์นี้มีหลายขั้น แนะนำอ่านต้นฉบับควบคู่กัน
โดยเฉพาะส่วน Audio Input, TFT_eSPI Configuration และ Source Code ของแต่ละ Version ควรเปิด Original Project ประกอบก่อนต่อ Hardware จริง
FAQ: คำถามที่พบบ่อย
1. Project นี้ใช้บอร์ดอะไร?
ใช้ Elecrow CrowPanel 3.5" HMI ESP32 Display โดย Project อ้างอิงรุ่น Basic ที่ใช้ ESP32-WROVER-B
2. หน้าจอมีความละเอียดเท่าไร?
Hackaday และ Source Code ระบุ 480×320
3. Audio เข้า ESP32 ที่ GPIO ไหน?
Project ใช้ GPIO35 เป็น ADC Input
4. ทำไมต้อง Bias Audio ที่ประมาณ 1.6 V?
เพื่อยก Audio AC Signal ให้แกว่งรอบ Reference Level ที่ ADC สามารถอ่านได้ตามวงจรของ Project
5. ใช้ Resistor ค่าเท่าไรใน Bias Circuit?
Source ระบุ 100 kΩ สองตัวสำหรับสร้าง Reference และมี 1 kΩ Resistor ใน Audio Input Circuit
6. Capacitor ทำหน้าที่อะไร?
ผู้สร้างระบุว่าใช้ Block DC Component ที่อาจมากับ Input Signal
7. Project แสดง Frequency ตั้งแต่เท่าไรถึงเท่าไร?
Source ระบุ Range ประมาณ 20 Hz–20 kHz สำหรับ 32-bar Version
8. ทำไมต้องมี FFT สองชุด?
Low FFT ใช้ Sampling 4 kHz เพื่อให้ Resolution ฝั่ง Frequency ต่ำละเอียดขึ้น ส่วน High FFT ใช้ 40 kHz เพื่อครอบคลุมไปถึง 20 kHz
9. ใช้ FFT กี่ Samples?
32-bar Code ใช้ 256 Samples สำหรับ Low FFT และ 256 Samples สำหรับ High FFT
10. ใช้ Library FFT อะไร?
Source Code ใช้ arduinoFFT
11. ใช้ Display Library อะไร?
ใช้ TFT_eSPI และผู้สร้างแนะนำให้ใช้ Library Configuration ที่ให้มากับ Project
12. ทำไมต้องเปิดเครื่องตอน Audio เงียบ?
เพราะ Firmware ทำ Noise-floor Calibration ในช่วง Startup และเก็บค่า Noise Floor ไว้ใช้ระหว่างการทำงาน
13. Spectrum แสดง dB ได้แม่นยำหรือไม่?
Source ไม่ได้ให้ dB Calibration หรือ Accuracy Specification และผู้สร้างระบุเองว่า Project ไม่ใช่ Precise Audio Instrument
14. ใช้ CrowPanel เพียงจอเดียวได้หรือไม่?
Code ที่ตรวจสอบได้สามารถแสดง Spectrum หนึ่ง Channel ขณะที่ Original Stereo Project ระบุ CrowPanel จำนวนสองจอ
15. ใช้จอ ESP32 รุ่นอื่นแทนได้ไหม?
Hackaday ระบุว่า Concept ไม่ได้มีอะไรผูกติดกับ CrowPanel โดยเฉพาะ แต่การใช้ Hardware อื่นอาจต้องแก้ Display Configuration และ Code ให้ตรงกับ Board นั้น
16. ต่อ Speaker Output เข้า GPIO35 โดยตรงได้หรือไม่?
Source ไม่ได้ระบุ Maximum Input Amplitude หรือรับรองการต่อ Speaker Output โดยตรง จึงไม่ควรทำโดยไม่ทราบ Signal Level และข้อจำกัดของ Hardware
References / แหล่งข้อมูลต้นฉบับ
จาก Audio Signal สู่ FFT และ Graphics บน ESP32
Project นี้เป็นตัวอย่างที่ดีของการรวม Analog Input, Digital Signal Processing และ TFT Graphics ไว้ใน Embedded Project เดียว
หากกำลังทำ ESP32 Display, Audio Visualizer หรือ Signal-processing Project สามารถสอบถามทีม Globalbyte เรื่อง Development Board, Display, Module และอุปกรณ์ที่เหมาะกับ Project ได้