November 26th, 2013

3 метра

Цифровые фильтры

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

Часто в микроконтроллерных и прочих приложениях нужно организовать простой цифровой фильтр для входного сигнала. Чаще всего это измеренный сигнал с какого-нибудь датчика, АЦП и т.п.

До текущего момента я всегда пользовался так называемым скользящим средним. Принцип прост - берем последние скажем N измерений и считаем их среднее, принимая результат текущим значением. И так с каждым новым измерением. Сгладить сигнал при этом получается хорошо, но есть одно но - для этого способа нужно много памяти, т.к. требуется хранить все N последних измерений. Если их 10-20 то это обычно не проблема, а если 1000 или 10000? Кроме того надо еще много считать. Для счета используем либо простой алгоритм, но очень много вычислений каждый раз, либо чуть более сложный алгоритм, но считать поменьше.

Есть же альтернативный способ организовать сглаживающий фильтр (ФНЧ).

Берем некий коэффициент К от 0 до 1. И считаем по следующей формуле:
[фильтрованное значение] = [фильтрованное значение]*K + [исходное значение]*(1-K);
Проще говоря, мы придаем некоторый вес каждому следующему измерению. В случае если К=0 мы получим исходные данные, без сглаживания, если же К=1 то на выходе мы всегда получим ноль, что конечно не очень хорошо. Выбор К зависит от частоты дискретизации и от того, насколько сильное сглаживание вы хотите получить

Плюс этого метода очевиден - нам не надо хранить никаких объемных данных в памяти. Минус - желательны операции с плавающей точкой (хотя при этом число вычислений сведено к минимуму).

Пример работы фильтра(К=0.95) в спойлере.

[Картинка]
promo alex_avr2 july 2, 2018 13:00 41
Buy for 200 tokens
Думаю многие слышали рассказы про огромные бункеры под Москвой, подземные города, секретное метро на случай ядерной войны. Многое в этих рассказах очевидно преувеличено, что-то придумано, но безусловно, основаны они не на пустом месте. Совсем недавно небольшой кусочек этих подземных тайн был…