- PVSM.RU - https://www.pvsm.ru -

Рекурсивный фильтр скользящего среднего

Рекурсивный фильтр скользящего среднего - 1

Да, дорогой читатель, такое тоже бывает, и может быть вкусно и полезно!

Как ты уже наверняка знаешь, дорогой читатель, существует два способа построения цифровых фильтров. Это рекурсивные фильтры, они же фильтры с бесконечной импульсной характеристикой (БИХ), и трансверсальные фильтры, они же фильтры с конечной импульсной характеристикой (КИХ). Самым простым и широко используемым фильтром КИХ является «фильтр скользящего среднего». Результат фильтрации такого фильтра, есть среднее арифметическое последних N отсчетов входного сигнала.

Рекурсивный фильтр скользящего среднего - 2

Или, в развернутом виде, для N=4:

Рекурсивный фильтр скользящего среднего - 3

Функция на языке С реализующая фильтр скользящего среднего:

#define N (4)
int filter(int a)
  {
  static int m[N];
  static int n;
  m[n]=a;
  n=(n+1)%N;
  a=0;
  for(int j=0;j<N;j++){a=a+m[j];}
  return a/N;
  }
 

Комплексный коэффициент передачи фильтра скользящего среднего, нормированный относительно частоты дискретизации, определится как преобразование Фурье от импульсной характеристики:

Рекурсивный фильтр скользящего среднего - 4

График амплитудно-частотной характеристики (АЧХ), нормированной относительно частоты дискретизации, при различных значениях длинны фильтра (N=4;8;16), приведен на рисунке:

Рекурсивный фильтр скользящего среднего - 5

Соответственно, график фазо-частотной характеристики (ФЧХ):

Рекурсивный фильтр скользящего среднего - 6

Данный фильтр нашел широкое применение в обработке сигналов, отчасти благодаря своей простоте, но самое главное его свойство — линейная фазо-частотная характеристика, и, соответственно, постоянное во всей полосе частот время запаздывания сигнала. Этот фильтр трансформирует амплитудный спектр сигнала, не затрагивая фазовый, что делает удобным его использование в системах регулирования. Фильтр скользящего среднего, благодаря своей линейной переходной характеристике, широко применяется при линейной интерполяции, передискретизации сигнала и т.п.

Главный недостаток фильтра скользящего среднего — вычислительная сложность, пропорциональная длине фильтра N. Для решения этой проблемы существует рекурсивный фильтр скользящего среднего. То есть, фильтр, имеющий те же характеристики, что и классический фильтр скользящего среднего, но реализованный по рекурсивной схеме. Такие типы фильтров широко известны в узких кругах, и называются: рекурсивные фильтры с линейной ФЧХ [Введение в цифровую фильтрацию. Под. ред. Богнера Р. М: 1976] или CIC-фильтры [DspLib [1]]. Существует научная школа проф. Турулина И.И. [РГБ [2]], занимающаяся исследованием подобных фильтров.
Покажем способ построения рекурсивного фильтра скользящего среднего на примере фильтра длинной N=4. Впоследствии нетрудно будет обобщить результаты на произвольную длину фильтра.

Как было отмечено выше, значение n-ного отсчета сигнала на выходе фильтра можно определить как:

Рекурсивный фильтр скользящего среднего - 7

А значение предыдущего, ((n-1)-го) отсчета:

Рекурсивный фильтр скользящего среднего - 8

Вычтем из первого выражения второе, в результате получим:

Рекурсивный фильтр скользящего среднего - 9

Нетрудно сообразить, что при произвольной длине фильтра N, уравнение запишется в следующем виде:

Рекурсивный фильтр скользящего среднего - 10 (1)

На основании приведенного уравнения можно записать код фильтра на языке С, но сначала мы выполним проверку наших выкладок. Найдем частотные характеристики рекурсивного фильтра скользящего среднего, для чего выполним Z-преобразование уравнения фильтра. Хочу напомнить дорогому читателю, что для выполнения Z-преобразования необходимо заменить переменные (xn,yn) их Z-отображениями (X,Y), каждое понижение индекса переменной на единицу соответствует умножению Z-1.

Рекурсивный фильтр скользящего среднего - 11

Решим полученное уравнение относительно Y/X –коэффициента передачи фильтра

Рекурсивный фильтр скользящего среднего - 12

Перейдем из Z-области в частотную область, заменив Рекурсивный фильтр скользящего среднего - 13 на Рекурсивный фильтр скользящего среднего - 14, и получим комплексный коэффициент передачи:

Рекурсивный фильтр скользящего среднего - 15

Построим график модуля комплексного коэффициента передачи (АЧХ фильтра), при различных значениях N=4,8,16:

Рекурсивный фильтр скользящего среднего - 16

А также аргумент комплексного коэффициента передачи (ФЧХ фильтра):

Рекурсивный фильтр скользящего среднего - 17

Как видно из приведенных графиков, частотные характеристики классического фильтра скользящего среднего и рекурсивного фильтра скользящего среднего полностью совпадают.

Перейдем к реализации фильтра. При непосредственной реализации по уравнению фильтра (1) в условиях целочисленной арифметики возможны некоторые трудности. При выполнении операции деления на N в целочисленной арифметике возникает потеря значащих разрядов, что приводит к нелинейным искажениям сигнала на выходе фильтра. Для разрешения этих трудностей необходимо исключить операцию деления из рекуррентного уравнения фильтра. Для чего умножим обе части уравнения фильтра (1) на N.

Рекурсивный фильтр скользящего среднего - 18

В полученном выражении выполним подстановку:

Рекурсивный фильтр скользящего среднего - 19
Рекурсивный фильтр скользящего среднего - 20

В результате уравнение фильтра (1) преобразуется в систему уравнений:

Рекурсивный фильтр скользящего среднего - 21
Рекурсивный фильтр скользящего среднего - 22

На основании системы уравнений фильтра запишем код, реализующий фильтр на языке С.

#define N (4)
int filter(int x)
  {
  static int n;
  static int m[N];
  static int y;
  y=y+(x-m[n]);
  m[i]=x;
  n=(n+1)%N;
  return y/N;
  }

Стоит отметить, что любители «совершенного кода» могут наложить ограничивающие требования на длину фильтра N. При длине фильтра, равной степеням двойки (2,4,8,16…), можно заменить операцию деления (/) арифметическим сдвигом (>>), операцию остаток от деления (%) — побитовой конъюнкцией (&).

Заключение.
Дорогой читатель, целью данной публикации не столько познакомить тебя с рекурсивным фильтром скользящего среднего, очень может быть, что ты про него прекрасно знаешь. Цель данной публикации познакомить тебя, дорогой читатель, с некоторыми практическими приемами анализа и синтеза цифровых фильтров. Посмотри, как просто мы перешли от трансверсального фильтра к рекурсивному, и Z-преобразование не так страшно, как его малюют. Надеюсь также, что метод повышения точности вычисления рекуррентных выражений в условиях целочисленной арифметики будет полезен тебе.
Успехов тебе, дорогой читатель!

Автор: IBAH_II

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/251723

Ссылки в тексте:

[1] DspLib: http://www.dsplib.ru/content/cic/cic.html

[2] РГБ: http://search.rsl.ru/ru/record/01000274721

[3] Источник: https://habrahabr.ru/post/325590/