Moving Average Filter (ковзне середнє)

Програми для ARDUINO DUE
Відповісти
Аватар користувача
radioman
Site Admin
Повідомлень: 133
З нами з: 28 вересня 2020, 12:01
Звідки: Тернопіль
Дякував (ла): 8 разів
Подякували: 6 разів

Moving Average Filter (ковзне середнє)

Повідомлення radioman »

Ковзне середнє або рухоме середнє (англ. moving average) - це проста методика, котра використовується для згладжування сигналу, видалення шуму (практично, це - фільтр НЧ).
Єдиним реальним параметром, яким можна керувати в фільтрі ковзного середнього, є розмір вікна. Якщо вікно занадто маленьке, сигнал всерівно може залишитись занадто "зашумленим"; однак, якщо вікно завелике, критична інформація в сигналі може бути втрачена і значно збільшиться затримка між вхідними і вихідними даними.
Для цілочисельних значень кількість вимірювань, для оптимізації виконання коду, краще брати з ступеню двійки (2, 4, 8, 16, 32 ...), так як компілятор, в даному випадку, заміняє ділення на зсув, котрий виконується набагато швидше.

Код: Виділити все

//Moving Average Filter
//https://maker.pro/arduino/tutorial/how-to-clean-up-noisy-sensor-data-with-a-moving-average-filter

//#define IN_PIN A0
#define WINDOW_SIZE 8			//Розмір вікна

int INDEX = 0;
int VALUE = 0;
int SUM = 0;
int READINGS[WINDOW_SIZE];
int AVERAGED = 0;
int intData = 0;
void setup() {
  //pinMode(IN_PIN, INPUT);
  Serial.begin(9600);
}

void loop() {

  if (intData++ >= 255) intData = 0;      // Симуляція вхідних даних

  SUM = SUM - READINGS[INDEX];           // Remove the oldest entry from the sum
  VALUE = intData;			// Нові дані з симулятора
  //VALUE = analogRead(IN_PIN);         // Read the next sensor value
  READINGS[INDEX] = VALUE;              // Add the newest reading to the window
  SUM = SUM + VALUE;                    // Add the newest reading to the sum
  INDEX = (INDEX + 1) % WINDOW_SIZE;    // Increment the index, and wrap to 0 if it exceeds the window size

  AVERAGED = SUM / WINDOW_SIZE;        // Divide the sum of the window by the window size for the result
  Serial.print("VALUE=");
  Serial.print(VALUE);
  Serial.print(", AVERAGED=");
  Serial.println(AVERAGED);

  delay(100);
}
Відповісти