Перейти к содержанию

БИХ-фильтр

Фильтр с бесконечной импульсной характеристикой (БИХ, IIR) вычисляет новый выход из входного отсчёта и своих прошлых выходов. Простейший вариант — экспоненциальное сглаживание — встроен в датчики давления Bosch и легко пишется в прошивке.

Обновлено Редакция GAW

БИХ-фильтр (фильтр с бесконечной импульсной характеристикой, infinite impulse response, IIR) — цифровой фильтр, у которого новый выход зависит не только от входных отсчётов, но и от предыдущих выходов. Из-за этой обратной связи отклик на одиночный импульс теоретически длится бесконечно, отсюда название.

Самый распространённый БИХ-фильтр — первого порядка, или экспоненциальное сглаживание. В таком виде он встроен в барометры Bosch BMP280 и BME280:

yn=yn−1⋅(c−1)+xncy_n = \frac{y_{n-1} \cdot (c - 1) + x_n}{c}

где xn — новый отсчёт АЦП, yn−1 — прошлый выход фильтра, c — коэффициент. Чем он больше, тем сильнее сглаживание и тем медленнее отклик. Bosch приводит, за сколько отсчётов выход проходит 75 % скачка:

Коэффициент cОтсчётов до 75 % скачка
1 (фильтр выключен)1
22
45
811
1622

Фильтр подавляет кратковременные возмущения — Bosch приводит в пример хлопок двери или порыв ветра, — не требуя от микроконтроллера ни вычислений, ни лишних чтений по шине. По сути это цифровой аналог RC-фильтра нижних частот: коэффициент играет роль постоянной времени, выраженной в отсчётах. Вместе с передискретизацией он снижает шум измерения; как сочетать настройки в датчиках давления — в статье «Датчики давления BMP280, BME280 и BMP390».

Частые вопросы

Чем БИХ-фильтр отличается от скользящего среднего?

Скользящее среднее — фильтр с конечной импульсной характеристикой: он усредняет последние N отсчётов, и для этого их нужно хранить. БИХ-фильтр хранит только прошлый выход и учитывает всю историю с экспоненциально убывающими весами — поэтому он экономен по памяти и вычислениям, но его отклик на скачок никогда формально не заканчивается.

Как выбрать коэффициент фильтра?

Компромиссом между шумом и скоростью. По таблице Bosch для BMP280 с коэффициентом 4 выход проходит 75 % скачка за 5 отсчётов, с 16 — за 22. Шум давления в режиме ultra high resolution падает при этом с 1,3 Па без фильтра до 0,5 и 0,2 Па. Для высотомера нужен быстрый отклик, для метеостанции — сильное сглаживание.

Как написать такой фильтр в прошивке?

Одной строкой: y = y + (x − y) / c, где x — новый отсчёт, y — выход, c — коэффициент. Это та же формула Bosch, переписанная иначе. Если c — степень двойки, деление в целочисленной арифметике заменяют сдвигом; при первом отсчёте выход инициализируют входом, чтобы не ждать разгона от нуля.

Источники

  1. Bosch Sensortec. BMP280 Digital Pressure Sensor: Data sheet (BST-BMP280-DS001-26, revision 1.26, October 2021) — разд. 3.3.3: data_filtered = (data_filtered_old · (c − 1) + data_ADC) / c; табл. 6 — число отсчётов до 75 % скачка: 1, 2, 5, 11, 22 при c = 1, 2, 4, 8, 16; табл. 8 — шум давления с фильтром
  2. Bosch Sensortec. BME280 Combined humidity and pressure sensor: Data sheet (BST-BME280-DS001-24, February 2024) — тот же фильтр для давления и температуры; сценарии с выбором коэффициента

Нашли ошибку?