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

y[k]  =  1Ni=0N1x[ki]y[k]  =   \frac{1}{N}\sum_{i=0}^{N-1} x[k-i]

ตัวอย่าง (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):

S[k]  =  S[k1]    x[kN]  +  x[k]S[k]  =  S[k−1]  −  x[k−N]  +  x[k]
y[k]  =  S[k]Ny[k]  =  \frac{S[k]}{N}

กรณีช่วงเริ่มต้นที่ยังไม่ครบ N ตัว (เหมือน count++ ในโค้ด):

y[k]  =  S[k]count,โดยที่ count=min(k+1,N)y[k]  =  \frac{S[k]}{\text{count}}, \quad \text{โดยที่ } \text{count}=\min(k+1,\,N)

1.2 Circular Buffer Visualization

1.2.1 สูตร “Circular Buffer index” (head ที่วนด้วย modulo)

ในโค้ดมีประมาณ:

head(head+1)modNhead←(head+1) mod N

(ใช้สื่อว่า 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 ที่คาดหวัง



✍️ Exercise

  1. Adjustable Window Size : สร้าง filter ที่สามารถเปลี่ยน window size ได้

  2. Dual Filter : สร้าง filter 2 ตัว สำหรับ raw magnitude และ deviation


จบ Session 2 | ต่อไป: Session 3: LVGL Display

Last updated

Was this helpful?