C Dilinde Exponential Moving Average (EMA) Filter Nedir, Nasıl Uygulanır?
Merhaba! 😊 Bugünkü yazımızda hem elektronikçiler hem de yazılımcılar için oldukça faydalı olan Exponential Moving Average (EMA) filtresini inceleyeceğiz. Özellikle gürültülü sensör verilerini yumuşatmak ve daha kararlı ölçümler elde etmek isteyenler için C dilinde bu filtrenin nasıl uygulanacağını adım adım göstereceğim.
Exponential Moving Average (EMA) Filtresi Nedir?
EMA filtresi, geçmiş verilerle birlikte yeni gelen verileri ağırlıklı bir şekilde birleştirerek daha pürüzsüz bir çıkış sinyali elde etmemizi sağlar. Burada “exponential” (üstel) ifadesi, yeni veriye daha fazla, eski verilere ise giderek azalan ağırlık verilmesi anlamına gelir.
Matematiksel Tanım
EMA filtresi şu formülle ifade edilir:
EMA(n) = α * YeniVeri(n) + (1 - α) * EMA(n-1)
- EMA(n): Şu anki filtrelenmiş değer
- YeniVeri(n): Şu anki ölçüm/sensör değeri
- EMA(n-1): Bir önceki filtrelenmiş değer
- α (alfa): 0 ile 1 arasında bir katsayı, filtre hassasiyetini belirler
Neden EMA Kullanılır?
Birçok uygulamada ham veriler çok fazla gürültü içerir. Örneğin:
- ADC ile ölçülen sıcaklık sensör verileri
- Jiroskop veya ivmeölçer (IMU) verileri
- Motor akım ve voltaj ölçümleri
Bu gibi durumlarda, veriyi doğrudan kullanmak yerine EMA filtresi ile yumuşatmak daha anlamlıdır. Böylece:
- Veri dalgalanmaları azalır ✅
- Trendler daha net görülür 📈
- Kod tarafında basit bir algoritma ile uygulanır ⚡
EMA ile Basit Moving Average (SMA) Arasındaki Fark
Sıklıkla EMA ile Simple Moving Average (SMA) karşılaştırılır. SMA’da belirli sayıda eski veri toplanır ve ortalaması alınır. EMA ise:
- Eski verileri saklamaz (daha az RAM kullanır)
- Daha az işlem gücü gerektirir
- Son veriye daha fazla ağırlık verdiği için daha hızlı tepki verir
Özellik | SMA | EMA |
---|---|---|
Hafıza Kullanımı | Yüksek (N veri tutar) | Düşük (tek değer tutar) |
Tepki Hızı | Daha yavaş | Daha hızlı |
Hesaplama Yükü | Toplama + Bölme | Çarpma + Toplama |
C Dilinde EMA Filtresi Nasıl Uygulanır?
Temel Kod Örneği
#include <stdio.h> float EMA_Filter(float new_value, float alpha) { static float ema = 0; // Başlangıç değeri ema = (alpha * new_value) + ((1 - alpha) * ema); return ema; } int main() { float sensor_data[] = {10, 12, 15, 14, 13, 20, 18}; int data_size = sizeof(sensor_data) / sizeof(sensor_data[0]); float alpha = 0.2; // Filtre hassasiyeti for(int i = 0; i < data_size; i++) { float filtered = EMA_Filter(sensor_data[i], alpha); printf("Ham Veri: %.2f -> Filtrelenmiş: %.2f\n", sensor_data[i], filtered); } return 0; }
Yukarıdaki örnekte:
alpha = 0.2
seçildi. Bu durumda yeni veri %20 etkili olurken, geçmiş veri %80 oranında korunur.static float ema
, fonksiyon çağrıları arasında eski değeri saklar.- Her ölçüm geldiğinde filtre otomatik güncellenir.
α (Alpha) Değeri Nasıl Seçilir?
Alpha değeri filtrenin hızlı mı, yavaş mı tepki vereceğini belirler:
- α ≈ 0.1 → Daha yavaş, daha yumuşak filtre (gürültüyü azaltır, ama gecikme artar)
- α ≈ 0.5 → Orta hassasiyet, hem hızlı hem dengeli
- α ≈ 0.9 → Çok hızlı tepki, ama gürültü daha az bastırılır
Pratikte, sensör tipine ve uygulamaya göre α ayarlanır.
Gerçek Hayat Örneği
Bir sıcaklık sensörü saniyede 100 ölçüm yapıyor ve her ölçümde ±2°C gürültü var. Eğer ham veriyi doğrudan kullanırsak ekranda sürekli dalgalanan değerler görürüz. Ancak EMA filtresi kullanıldığında:
- Ekranda daha stabil bir sıcaklık değeri görünür 🌡️
- Küçük dalgalanmalar ortadan kalkar
- Değişimler daha akıcı yansır
Avantajlar ve Dezavantajlar
Avantajları
- Kolay implementasyon (tek satır formül yeterli)
- Düşük hafıza ve işlem gücü ihtiyacı
- Gerçek zamanlı sistemler için ideal
Dezavantajları
- Trend değişimlerine gecikmeli tepki verir
- Alpha değeri doğru seçilmezse ya çok gürültülü ya da çok yavaş tepki verebilir
Sonuç
Exponential Moving Average (EMA) filtresi, sensör verilerini yumuşatmak için C dilinde kolayca uygulanabilecek güçlü bir yöntemdir. Hafif, hızlı ve esnek olması sayesinde hem gömülü sistemlerde hem de masaüstü uygulamalarında yaygın olarak kullanılır. Uygulamanıza göre doğru α değerini seçerek siz de daha kararlı ve güvenilir sonuçlar elde edebilirsiniz 🚀.
🔖 Terimler Sözlüğü
Terim | Açıklama |
---|---|
EMA | Exponential Moving Average – Üstel hareketli ortalama filtresi |
α (Alpha) | Filtrenin yeni veriye verdiği ağırlık (0–1 arasında) |
SMA | Simple Moving Average – Basit hareketli ortalama filtresi |
ADC | Analog-Dijital Çevirici |