Moving Average Filter

Lab 4: Moving Average Filter

วัตถุประสงค์

  • เพิ่ม Circular Buffer สำหรับเก็บข้อมูล

  • เพิ่มฟังก์ชัน Moving Average Filter

  • ลด noise ของข้อมูล sensor gพื่อ “ทำให้ข้อมูลจาก sensor นิ่งขึ้น” โดยลด noise แบบสุ่ม

4.1 Concept: Moving Average Filter

Moving Average = ค่าเฉลี่ยของ N samples ล่าสุด

สูตรหลักของ 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)

  • ตอบสนองช้าลง

4.2 เพิ่มโค้ดใน sensor_hub_daq_task.c

อันนี้คือ “ความหมาย” ของ moving average แบบตรงตัว (เหมือนที่เขียนในหัวข้อ concept)


4.2.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)

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

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

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

(ใช้สื่อว่า index วนกลับไป 0 เมื่อครบหน้าต่าง)

4.3 เพิ่มการเรียกใช้ใน Main Loop

4.4 Output ที่คาดหวัง


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

Last updated

Was this helpful?