Медіанний фільтр (Median Filter size of 3)

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

Медіанний фільтр (Median Filter size of 3)

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

Для обробки сигналів, що піддаються впливу імпульсних перешкод використовують медіанну фільтрацію , тобто на вихід фільтру проходить середнє значення, а максимальне та мінімальне відкидаються. Найпростішою є медіана з 3 значень. Ось її реалізація авторства Nigel Jones:

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

// Вхідні дані 
int intA;
int intB;
int intC;

// Медіанний фільтр (фільтр пікового шуму)
  /* https://embeddedgurus.com/stack-overflow/tag/median-filter/ */
  /*Проводимо перше сортування за спаданням:if (A<B) and (A<C),
    то вважаємо A – найменшим елементом і далі вибираємо між B і С,
    найменший елемент є медіаною і видаємо його на вихід*/
  if ((intA <= intB) && (intA <= intC))
  {
    intMiddle[intCs] = (intB <= intC) ? intB : intC;
  }
  /*Якщо умова при першому сортуванні не виконується,
    тоді проводимо друге сортування за спаданням: if (B<A) and (B<C),
    тоді вважаємо B – найменшим елементом і далі вибираємо між A і С,
    найменший елемент є медіаною і видаємо його на вихід*/
  else if ((intB <= intA) && (intB <= intC))
  {
    intMiddle[intCs] = (intA <= intC) ? intA : intC;
  }
  /*Якщо умови по першому і другому сортуванню не виконуються,
    тоді проводимо третє сортування за спаданням між  A і B,
    найменший елемент є медіаною і видаємо його на вихід*/
  else
  {
    intMiddle[intCs] = (intA <= intB) ? intA : intB;
  }
В моїй програмі, у зв'язку із реалізацією квадратурного детектора, використовується двомірний масив даних. Замість запису і читання даних з масиву intMiddle[intCs] можна використати звичайну змінну, наприклад intMiddle.
Цей код можна просто вставити в програму, а можна використовувати як функцію :

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

uint16_t middle_of_3(uint16_t a, uint16_t b, uint16_t c)
{
 uint16_t middle;

 if ((a <= b) && (a <= c))
 {
   middle = (b <= c) ? b : c;
 }
 else if ((b <= a) && (b <= c))
 {
   middle = (a <= c) ? a : c;
 }
 else
 {
   middle = (a <= b) ? a : b;
 }
 return middle;
}
pawa
Повідомлень: 75
З нами з: 28 вересня 2020, 20:26
Дякував (ла): 1 раз
Подякували: 5 разів

Re: Медіанний фільтр (Median Filter size of 3)

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

Можна так.

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

public int getMedian(int a, int c, int b)
{
    if ((a < c & c < b) || (b < c & c < a)) return c;
    if ((c < a & a < b) || (b < a & a < c)) return a;
    return b;
}
Відповісти