Moving Average Filter
Lab 4: Moving Average Filter
วัตถุประสงค์
Noise Reduction: ข้อมูล sensor มี noise ต้องกรอง
Smoother Data: ข้อมูลราบเรียบขึ้นสำหรับ motion detection
Circular Buffer: โครงสร้างข้อมูลสำคัญใน Embedded
จะได้เรียนรู้อะไร
Moving Average: ค่าเฉลี่ยเคลื่อนที่
Circular Buffer: เก็บข้อมูลแบบวนรอบ
Optimized Sum: ไม่ต้องบวกใหม่ทุกครั้ง
1. หลักการ Moving Average Filter
Moving Average = ค่าเฉลี่ยของ N samples ล่าสุด

1.1 สูตรหลักของ Moving Average (ค่าเฉลี่ยของ N ตัวล่าสุด)
ให้ x[k] คือ sample ล่าสุด ณ เวลา k และใช้หน้าต่างยาว N
ตัวอย่าง (N=5):
samples = [9.8, 9.9, 10.1, 9.7, 9.8]
average = (9.8 + 9.9 + 10.1 + 9.7 + 9.8) / 5 = 9.86
ข้อดี:
ลด noise แบบสุ่ม
ข้อมูลราบเรียบขึ้น
ข้อเสีย:
มี delay (latency)
ตอบสนองช้าลง
1.1.1 สูตรด้วยตัวแปร sum
ถ้า buffer เต็มแล้ว: ลบค่าที่จะถูกเขียนทับออกจาก
sumใส่ค่าใหม่ แล้วบวกเข้า
sumค่าเฉลี่ย =
sum / count
เขียนเป็น LaTeX ได้แบบนี้ (เมื่อ buffer เต็มแล้ว count=N):
กรณีช่วงเริ่มต้นที่ยังไม่ครบ N ตัว (เหมือน count++ ในโค้ด):
1.2 Circular Buffer Visualization
1.2.1 สูตร “Circular Buffer index” (head ที่วนด้วย modulo)
ในโค้ดมีประมาณ:
(ใช้สื่อว่า index วนกลับไป 0 เมื่อครบหน้าต่าง)
โหลด Project Code จาก AIC Github Repo เพื่อเปิดบน VSCode IDE
2. เปิดโปรเจกต์ aic-psoc-edge-epc2-imu-filter
เปิดไฟล์ proj_cm33_ns/sensor_hub_daq_task.c และศึกษาโครงสร้าง:
เพิ่ม Include
Important Macros and Variables
สร้างฟังก์ชัน Raw accelerometer Conversion ชื่อ lsb_to_mp2()
สร้างฟังก์ชัน Magnitude Calcuation ชื่อ calculate_magnitude()
สร้างฟังก์ชัน Filter
สร้างฟังก์ชัน Motion Detection ชื่อ detect_motion()
สร้างฟังก์ชัน Motion State Conversion ชื่อ get_motion_string()
3. เขียน Main Task Loop
Create Sensor Hub DAQ Task Function
4. Build และ Flash
Output ที่คาดหวัง
จบ Session 2 | ต่อไป: Session 3: LVGL Display
Last updated
Was this helpful?