Въведение
При работа със сензори в микроконтролерни системи често се сблъскваме с проблема за шумни измервания. Независимо дали използваме температурни датчици, ултразвукови сензори, аналогови входове, акселерометри или датчици за налягане, получените данни рядко са напълно стабилни. Причините могат да бъдат електромагнитни смущения, шум в захранването, неточности в АЦП преобразувателя или външни фактори от околната среда.
За да получим по-надеждни измервания, се използват различни алгоритми за цифрова обработка на сигнала. Сред най-популярните филти при платформи като Arduino, ESP32 и ESP8266 са Медиален Филтър (Median Filter) и Trimmed Mean Filter. Те са сравнително лесни за реализиране, изискват малко изчислителни ресурси и осигуряват значително по-стабилни резултати.
Тези филтри намират приложение при:
- Температурни сензори (DS18B20, LM35, NTC);
- Ултразвукови сензори (HC-SR04);
- Сензори за налягане;
- Аналогови измервания чрез ADC;
- Акселерометри и жироскопи;
- Сензори за влажност;
- Индустриални измервателни системи.
Основната идея е да се вземат няколко последователни измервания и чрез математическа обработка да се елиминират случайните отклонения. Интересно видео на тази тематика е: Arduino Медиален Филтър (Median Filter): FIX HC-SR04 Distance Sensor Noise & Outliers
В общ вид измерванията могат да бъдат представени като:
X = S + N
където:
- X е измерената стойност;
- S е реалната стойност на сигнала;
- N е шумът.
Целта на филтъра е максимално да намали влиянието на N, без да изкривява полезния сигнал S.
Друг цифров филтър за плавно изглаждане на сигнала е EMA филтър. Може да прочетете повече за неговия принцип на работа в статията ни: Изглаждане на данни с EMA филтър на ESP32 с MicroPython.
Медиален филтър и принцип на работа
Медиалният филтър е един от най-ефективните методи за премахване на единични аномалии (outliers) в измерванията. Вместо да изчислява средна стойност, както правят много други филтри, той избира средната стойност след сортиране на всички измервания.
Алгоритъмът работи по следния начин:
- Вземат се N измервания.
- Всички стойности се сортират във възходящ ред.
- Избира се елементът в средата на сортирания масив.
- Тази стойност се приема за резултат от филтрацията.
Пример
Да разгледаме следните измервания:
1, 25, 24, 26, 150, 25
След сортиране получаваме:
1, 24, 25, 25, 26, 150
Средната стойност в сортирания масив е: 25
Следователно резултатът от медиалния филтър е: 25
Забележете, че грешното измерване от 1 и 150 не влияе на крайния резултат.
Ако използвахме обикновена аритметична средна стойност:
(1+25 + 24 + 26 + 150 + 25) / 6 = 41.88
Получаваме сериозно изкривяване на измерването което изобщо не е малко. Поради тази причина само сренаоаритметичната стойност сама по себе си не е достатъчна за прецизно измерване.
Математически модел на Медиален Филтър
Нека имаме множество от измервания:
x₁, x₂, x₃, …, xₙ
След сортиране:
x(1) ≤ x(2) ≤ … ≤ x(n)
Медианата е:
Median = x((n+1)/2)
за нечетен брой елементи.
Предимства
- Отлично премахва единични пикове.
- Устойчив е на аномални измервания.
- Подходящ за шумни сензори.
- Не изисква сложна математика.
Недостатъци
- Изисква сортиране на масива.
- По-бавен е при голям брой измервания.
- Не е най-доброто решение при непрекъснат гаусов шум.
Практическо приложение
Медиалният филтър е особено полезен при:
- HC-SR04 ултразвукови сензори;
- датчици за разстояние;
- GPS измервания;
- индустриални датчици със случайни грешни импулси.
Trimmed Mean Filter и принцип на работа
Trimmed Mean Filter представлява комбинация между медиален филтър и обикновено осредняване. Идеята е първо да се премахнат най-малките и най-големите стойности, след което да се изчисли средна стойност от останалите измервания.
Този подход позволява едновременно:
- елиминиране на “екстремни” стойности;
- запазване на повече информация от измерванията;
- по-гладък резултат в сравнение с медиалния филтър.
Алгоритъм
- Събират се N измервания.
- Стойностите се сортират.
- Премахват се определен брой от най-малките стойности.
- Премахват се определен брой от най-големите стойности.
- Изчислява се средната стойност на останалите елементи.
Пример
Измервания:
22, 150, 23, 24, 25, 26, 27
След сортиране:
22, 23, 24, 25, 26, 27, 150
Премахваме двете най-малко и двете най-големи стойност:
24, 25, 26
Изчисляваме средно-аритметична стойност:
(24+25+26) / 3 = 25
Получаваме реалистичен резултат въпреки наличието на грешно измерване или добавен шум.
Математически модел
Нека след сортиране имаме:
x(1), x(2), …, x(n)
Премахваме k елемента от началото и края.
Тогава:
Trimmed Mean = (Σ x(i)) / (n – 2k)
където сумата се изчислява върху останалите елементи.
Предимства
- Комбинира устойчивостта на медианата със стабилността на средната стойност.
- Намалява влиянието на екстремни стойности.
- Осигурява плавни измервания.
- Подходящ за аналогови входове.
Недостатъци
- Изисква сортиране.
- Необходимо е правилно избиране на броя премахвани стойности.
- Малко по-сложен е за реализация.
Практическо приложение
Trimmed Mean Filter е подходящ за:
- температурни сензори;
- измерване на напрежение;
- токови измервания;
- сензори за налягане;
- акселерометри и IMU модули;
- мониторинг на батерии.
При ESP32 и ESP8266 често се използва за филтриране на ADC измервания, тъй като техните аналогови входове могат да бъдат чувствителни към шум.
Сравнение между двата филтъра
| Характеристика | Медиален филтър | Trimmed Mean Filter |
|---|---|---|
| Премахва единични аномалии | Отлично | Отлично |
| Гладкост на сигнала | Средна | Висока |
| Изчислителна сложност | Средна | Средна |
| Подходящ за ADC | Добър | Отличен |
| Подходящ за HC-SR04 | Отличен | Добър |
| Запазване на динамиката | Средно | Добро |
Пример на MicroPython и обяснение на Mean Filter и Trimmed Mean Filter
Примерен код Mean Filter и Trimmed Mean Filter и MicroPython
from machine import ADC, Pin
from time import sleep_ms
# ADC вход (GPIO34)
adc = ADC(Pin(34))
# Настройки за ESP32
adc.atten(ADC.ATTN_11DB)
adc.width(ADC.WIDTH_12BIT)
def median_filter(samples):
"""
Връща медианата от сортиран масив с 11 елемента.
"""
data = sorted(samples)
return data[len(data) // 2]
def trimmed_mean_filter(samples):
"""
Взема петте средни стойности от 11 измервания
и връща тяхната средноаритметична стойност.
"""
data = sorted(samples)
# Избиране на петте централни елемента
middle_values = data[3:8]
return sum(middle_values) / len(middle_values)
while True:
# Събиране на 11 измервания
readings = []
for _ in range(11):
readings.append(adc.read())
sleep_ms(10)
median_value = median_filter(readings)
trimmed_mean_value = trimmed_mean_filter(readings)
print("--------------------------------")
print("Raw values :", readings)
print("Median Filter :", median_value)
print("Trimmed Mean :", round(trimmed_mean_value, 2))
sleep_ms(1000)Обяснение на алгоритъма
В този пример се демонстрират едновременно два от най-популярните статистически методи за филтриране на шумни измервания – Median Filter и Trimmed Mean Filter. Целта е от аналоговия вход на ESP32 да бъдат взети 11 последователни измервания, след което върху тях да бъдат приложени двата алгоритъма и резултатите да бъдат сравнени.

Събиране на измерванията
Програмата започва с последователно изчитане на 11 стойности от аналоговия вход. Между отделните измервания е добавено кратко закъснение от 10 ms, което позволява да се уловят реални изменения в сигнала и намалява вероятността няколко последователни стойности да бъдат напълно еднакви.
След приключване на измерванията всички стойности се записват в списък:
readings = []Примерен набор от измервания може да изглежда така:
1200, 1210, 1198, 1220, 1195, 4000, 1205, 1212, 1188, 1199, 50
Тук ясно се виждат две аномални стойности – 50 и 4000, които могат да бъдат резултат от електромагнитно смущение, шум в захранването или грешка при преобразуването на сигнала.
Работа на Median Filter
След събирането на всички стойности функцията median_filter() ги сортира във възходящ ред:
50, 1188, 1195, 1198, 1199, 1200, 1205, 1210, 1212, 1220, 4000
Тъй като разполагаме с 11 измервания, медианата се намира на позиция:
(11 + 1) / 2 = 6
Шестият елемент в сортирания списък е:
1200
Следователно резултатът от медиалния филтър е:
Median Filter = 1200
Основното предимство на този метод е, че единични грешни измервания практически не влияят върху крайния резултат. Независимо дали в списъка присъства стойност 4000 или 10000, медианата ще остане близка до реалната стойност на сигнала.
Работа на Trimmed Mean Filter
След сортирането на стойностите функцията trimmed_mean_filter() премахва трите най-малки и трите най-големи измервания.
От първоначалните 11 стойности остават само петте централни елемента:
1198, 1199, 1200, 1205, 1210
Върху тях се изчислява средноаритметична стойност:
(1198 + 1199 + 1200 + 1205 + 1210) / 5
Резултатът е:
1202.4
Този подход съчетава предимствата на медианата и осредняването. От една страна премахва екстремните стойности, а от друга използва повече информация от наличните измервания, което води до по-плавен и стабилен резултат.
Защо са избрани точно 11 измервания?
Използването на нечетен брой измервания позволява лесно определяне на медианата. При 11 стойности винаги съществува един централен елемент, който може директно да бъде използван като резултат от медиалния филтър.
Освен това структурата от 11 измервания позволява удобно премахване на три стойности от всяка страна на сортирания масив и запазване на пет централни стойности за Trimmed Mean Filter.
Кога кой филтър е по-подходящ?
Ако системата е подложена на редки, но силни смущения, например при ултразвукови датчици или индустриални сензори, медиалният филтър обикновено дава най-добри резултати.
Ако измерванията съдържат постоянен шум и се търси по-плавен изходен сигнал, Trimmed Mean Filter често е по-добрият избор, защото използва повече информация от измерванията и реагира по-естествено на плавни промени в сигнала.
Поради тази причина Trimmed Mean Filter се използва много често при аналогови входове на ESP32, ESP8266 и Arduino, където е необходимо да се намали шумът без да се губи чувствителността към реалните промени в измерваната величина.
Заключение
Медиалният филтър и Trimmed Mean Filter са сред най-полезните техники за обработка на данни от сензори в системи, базирани на Arduino, ESP32 и ESP8266. И двата метода позволяват значително намаляване на шума и подобряване на качеството на измерванията без необходимост от сложни математически изчисления или мощен хардуер.
Медиалният филтър е отличен избор, когато е необходимо премахване на единични грешни измервания и внезапни пикове в сигнала. Trimmed Mean Filter от своя страна предлага по-плавни резултати и е особено подходящ за аналогови измервания, при които присъства постоянен шум.
Изборът между двата подхода зависи от конкретното приложение, но в много случаи те могат успешно да подобрят точността и надеждността на всяка измервателна система, изградена върху популярните микроконтролерни платформи.
