КИХ и БИХ - это типы цифровых фильтров.
С конечной и бесконечной импульсными характеристиками.
Под фильтром КИХ с прямоугольным окном понимают обычный массив усреднения с кольцевым заполнением.
Алгоритм фильтрации совершенно примитивен.
Определяете массив с размерностью входящих данных.
Определяете указатель заполнения этого массива.
Каждое входящее измерение заполняете массив по текущему указателю и находите среднее значение всего массива. Оно и будет выходным значением фильтра.
Увеличиваете на 1 указатель и сбрасываете его в 0, если он превысил размеры массива.
Ожидаете следующее входящее значение.
Все.
Остается добавить, что частота поступления данных должна быть минимум в 2 раза выше верхней частоты помехи. А длину фильтра (количество элементов массива) лучше всего выбирать так, чтобы произведение периода между соседними отсчетами на количество элементов массива было кратно периоду помехи (1/Fпомехи). В таком случае нули АЧХ цифрового фильтра попадут как раз на частоты помехи, обеспечивая практически идеальную фильтрацию.
Так как основная помеха - это 50 Гц и ее гармоники (100, 150, 200 и т.д.), выбор длины буфера кратным 20 мс обеспечит последнее условие. А частоту дискретизации (поступления данных) можно определить как удвоенную частоту верхней фильтруемой гармоники. Например 400 Гц, значит отсчеты можно делать 800 штук в секунду (период=1,25мс), что даст нам при длине буфера 16 элементов как раз 16*1,25 мс=20 мс.
Итого. Задаем период отсчетов АЦП 1,25 мс, заноcим данные в кольцевой буфер типа int16_t buffer[16]; (или uint16_t buffer[16];) находим среднее на КАЖДЫЙ входящий отсчет и получаем идеальный результат.
ЗЫ. Выбор длины буфера равным степени 2 (выше 2^4=16) дает возможность при расчете среднего значения заменить деление правым арифметическим сдвигом на степень этой самой двойки (выше на >>4). И учтите, что арифметический сдвиг отличается от логического тем, что слева происходит заполнение значением старшего разряда, а не нулем. Это справедливо, если буфер ЗНАКОВОГО типа. А если беззнакового, то годится простой логический сдвиг.