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

ESP32 Audio Spectrum Analyzer แสดง Frequency Bars บน CrowPanel 3.5 นิ้ว
DIY ESP32 Audio Spectrum Analyzer แสดง Frequency Spectrum บน CrowPanel 3.5" HMI Display
Key Takeaways
  • 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 บนหน้าจอ

Audio Input
รับสัญญาณ AC จากแหล่งเสียง
↓
Bias / Coupling Circuit
เตรียมสัญญาณให้ ADC ของ ESP32 อ่านได้
↓
GPIO35 ADC
Sample Audio Signal
↓
FFT
วิเคราะห์ Frequency Content
↓
Frequency Bands
รวม FFT Bins เข้าเป็นแต่ละ Bar
↓
480×320 TFT
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

อย่าสับสนกับ CrowPanel รุ่นใหม่: Elecrow มี CrowPanel 3.5" หลาย Revision และมีรุ่น Advance ที่ใช้ ESP32-S3 แต่ Project นี้อ้างอิง CrowPanel 3.5" HMI ESP32 รุ่น Basic จึงไม่ควรนำ Specification ของรุ่น S3 มาปนกับ Project นี้

Hackaday ยังตั้งข้อสังเกตว่า Concept ไม่ได้ผูกติดกับ CrowPanel เท่านั้น Display อื่นอาจให้ผลใกล้เคียงได้ แต่จะต้องแก้ Code และ Configuration ให้ตรงกับ Hardware นั้น

Audio Signal เข้า ADC ของ ESP32 อย่างไร?

รายละเอียด ESP32 CrowPanel และวงจรประกอบใน Audio Spectrum Analyzer
Project ใช้ GPIO35 เป็น Audio ADC Input พร้อมวงจร Passive เพื่อเตรียม Signal ก่อนเข้า 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 ที่ไม่เหมาะสม
Source ไม่ได้ระบุ Maximum Audio Input Level: ไม่มีค่า Maximum Vpp หรือ Vrms ที่ยืนยันใน Project จึงไม่ควรนำ Speaker Output หรือ Signal ที่ไม่ทราบระดับแรงดัน มาต่อ GPIO35 โดยตรงจากการคาดเดา

จาก Audio Signal ไปเป็น Spectrum Bars ได้อย่างไร?

หลัง Audio เข้า ADC แล้ว ESP32 จะ Sample Signal เป็นชุดตัวเลขตามเวลา จากนั้น Code ใช้ FFT เพื่อคำนวณ Magnitude ของ Frequency Bin ต่าง ๆ

ใน Source Code 32 Bars ขั้นตอนหลักคือ:

Sample ADC
อ่าน GPIO35 ตาม Sampling Rate ที่กำหนด
↓
Remove DC Midpoint
Code หาค่าเฉลี่ยของ Samples แล้วลบออกจากข้อมูล
↓
Hamming Window
ใช้ Windowing ก่อนทำ FFT
↓
FFT + Magnitude
แปลง Sample ไปเป็นข้อมูล Frequency
↓
Frequency Bands
รวม Bin เข้าเป็นช่วง Frequency ของแต่ละ Bar
↓
Display Processing
Apply Noise Floor, Smoothing, Fall Speed และ Peak
↓
Render 32 Bars
วาด 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
เหตุผลของ Dual FFT: ฝั่ง Low ใช้ Sampling Rate ต่ำกว่าเพื่อให้ Resolution ต่อ Frequency Bin ละเอียดขึ้น ขณะที่ฝั่ง High ต้องใช้ Sampling Rate สูงกว่า เพื่อครอบคลุม Frequency ไปถึง 20 kHz

Comment ใน Source Code ระบุ Resolution โดยประมาณ: Low FFT ราว 15.6 Hz ต่อ Bin และ High FFT ราว 156 Hz ต่อ Bin

ตัวเลขเหล่านี้อธิบาย FFT Configuration ไม่ใช่ Accuracy Specification: Project ไม่ได้ให้ Measurement Error หรือ Frequency Accuracy ที่ผ่าน Calibration จึงไม่ควรนำ Bin Resolution ไปตีความว่าเครื่องวัด Frequency ได้แม่นยำเท่ากับ Instrument ในห้อง Lab

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 ในการแสดงผล

Noise Floor ถูกวัดครั้งเดียวตอน Startup: Comment ใน Source Code ระบุว่า Noise Floor จะกลายเป็นค่าคงที่จนกว่าจะ Reset ไม่ได้ Adaptive ใหม่ตลอดเวลา
ถ้ามีเพลงหรือ Signal เข้าในช่วง Calibration: ค่าที่ระบบมองว่าเป็น Noise Floor อาจถูกกำหนดจาก Signal ที่ไม่ใช่ Noise จริง จึงควรทำตามคำแนะนำของผู้สร้างและให้ Input เงียบตอนเริ่มต้น

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 แยกกัน

Source ที่ตรวจไม่ได้ให้ Right-channel Wiring แบบ Step-by-step: บทความนี้จึงไม่สร้าง GPIO หรือ Circuit ของ Channel ขวาเพิ่มขึ้นเอง หากสร้าง Stereo Version ควรตรวจ Original Project และ Wiring ของผู้สร้างควบคู่กัน

Spectrum นี้แม่นแค่ไหน?

จุดนี้ผู้สร้างอธิบายตรงมากว่า Project ไม่ได้ตั้งใจเป็น Precise Audio Instrument แต่เน้นเป็น Visual Addition ให้ระบบเสียง

การ Process ยังจงใจทำให้ Extreme Low และ High Frequency เด่นขึ้นเมื่อเทียบกับ Midrange เพื่อให้ภาพ Spectrum ดูน่าสนใจมากขึ้น

อย่าอ่าน Scale บนจอเป็นค่า Measurement แบบ Calibrated: แม้ UI จะมี Frequency และ dB-style Scale แต่ Source ไม่ได้ให้ Calibration Reference, dB Accuracy, Frequency-response Accuracy, THD หรือ SNR ของระบบ

ดังนั้นคำที่เหมาะกับ 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
TFT_eSPI Configuration สำคัญ: ผู้สร้างระบุให้ใช้ TFT_eSPI Library ที่ให้มากับ Project เพราะถูกตั้งค่าให้เข้ากับ Hardware นี้โดยเฉพาะ การใช้ Configuration อื่นอาจทำให้ Display ทำงานไม่ตรงกับ Source

CrowPanel ยังมี Hardware Revision ต่างกัน ดังนั้นหาก Board ที่ใช้อยู่ไม่ตรงกับ Revision ของผู้สร้าง ควรตรวจ Pin Assignment และ Documentation ของ Elecrow ก่อนแก้ Configuration

FFT Configuration ใน Code

ส่วน Configuration ด้านล่างมาจาก Source Code ของ 32-bar Version และแสดงค่าหลักที่กำหนดโครงสร้างของ Spectrum

32-bar FFT Configuration จาก Source
#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

อีกมุมที่น่าสนใจ: Project ไม่ได้จบที่ “ทำ FFT สำเร็จ” แต่ยังมีการปรับ Rendering เช่น Smoothing, Peak Hold และลักษณะ Bar ให้ภาพเคลื่อนไหวดูเป็น Audio Visualizer มากขึ้น

ดู 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 ได้

Disclaimer: บทความนี้เป็นการสรุปและเรียบเรียงจากแหล่งข้อมูลภาษาอังกฤษ อาจมีความคลาดเคลื่อน กรุณาตรวจสอบ Source ต้นฉบับก่อนลงมือทำ Project นี้ถูกออกแบบเป็น DIY Audio Visualizer และผู้สร้างระบุว่าไม่ใช่ Precise Audio Instrument เนื่องจากมีการปรับ Processing เพื่อให้ Low และ High Frequency เด่นขึ้นสำหรับ Visual Effect Source ไม่ได้ให้ Maximum Audio Input Voltage, Maximum Vpp/Vrms, dB Accuracy, Frequency Accuracy, ADC Measurement Accuracy, THD หรือ SNR จึงไม่ควรใช้เป็นเครื่องมือ Measurement ที่ผ่าน Calibration และไม่ควรต่อ Audio Source ที่มีระดับแรงดันไม่ทราบค่า หรือ Speaker Output เข้ากับ GPIO35 โดยตรงจากการคาดเดา นอกจากนี้ CrowPanel มีหลาย Hardware Revision ควรตรวจ Board Revision และใช้ TFT_eSPI Configuration ที่ตรงกับ Hardware ก่อน Upload Firmware

 

แท็ก


Blog posts