Arduino etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Arduino etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

4 Eylül 2025 Perşembe

C Dilinde Exponential Moving Average (EMA) Filter Nedir, Nasıl Uygulanır?

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.

Dalgalı sensör verisi ve EMA filtresi ile yumuşatılmış verinin karşılaştırmalı grafiği

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

📌 Ekstra Kaynaklar

9 Haziran 2025 Pazartesi

C Dilinde Moving Average Filter (Hareketli Ortalama Filtresi) Nedir, Nasıl Uygulanır?

Hareketli Ortalama Filtresi (Moving Average Filter), sinyal işleme ve veri analizi alanlarında en çok tercih edilen basit ve etkili filtrelerden biridir. Gürültülü verilerin pürüzsüzleştirilmesi, ani değişimlerin yumuşatılması ve sensör okumalarının stabilize edilmesi gibi birçok uygulama alanında kullanılır. Özellikle gömülü sistemlerde, mikrodenetleyicilerde ve gerçek zamanlı uygulamalarda, C dili ile kolayca uygulanabilir olması sayesinde oldukça popülerdir.

Hareketli Ortalama Filtresi Nedir?

Kısaca, hareketli ortalama filtresi, belirli bir pencere (örneğin N örnek) içerisindeki verilerin aritmetik ortalamasını alarak yeni bir çıktı üretir. Böylece, kısa süreli gürültüler ve ani değişimler filtrelenmiş olur.

Matematiksel olarak:
Y[n] = (X[n] + X[n-1] + ... + X[n-(N-1)]) / N
Burada:

  • Y[n]: Filtrelenmiş çıktı

  • X[n]: En yeni giriş değeri

  • N: Pencere boyutu (window size)


Avantajları ve Dezavantajları

Avantajlar:

  • Basit ve hızlı algoritma

  • Bellek ve işlemci gereksinimi düşük

  • Gerçek zamanlı uygulamalara uygun

Dezavantajlar:

  • Ani değişimleri geciktirir (faz kayması)

  • Büyük pencerelerde tepki yavaştır

  • Herkese uyan tek boyutlu çözüm değildir; pencere boyutu dikkatle seçilmelidir


C Dilinde Moving Average Filter Nasıl Uygulanır?

Aşağıda, hareketli ortalama filtresinin C dilinde farklı şekillerde uygulanışı anlatılmaktadır.

1. Temel Uygulama: Döngüyle Ortalama Alma

Kullanımı:

Eksisi:

Her yeni örnekte tüm pencereyi toplar, bu da işlemciyi yorar.


2. Kayan Pencere ile Optimizasyon (Dairesel Buffer Kullanımı)

Dairesel (circular) buffer ve kayan toplam yaklaşımıyla işlem yükü azaltılabilir.

Kullanımı:

Avantajı:

  • Her örnek için sadece iki toplama/çıkarma işlemi gerekir.

  • Özellikle gömülü sistemlerde çok daha hızlıdır.


3. Uygulama Alanları

  • Sensör verilerinin düzeltilmesi (ör. sıcaklık, ivmeölçer)

  • Finansal zaman serilerinde veri yumuşatma

  • Gürültülü sinyal filtreleme (ör. ADC verisi)

  • Otomotivde, tıbbi cihazlarda, endüstriyel kontrol sistemlerinde


Pencere Boyutu (Window Size) Nasıl Seçilmeli?

  • Küçük pencere (örn. 3–5): Ani değişimlere daha duyarlı, az gecikme.

  • Büyük pencere (örn. 20–50): Daha yumuşak sonuç, daha fazla gecikme.

Kullanım amacınıza ve verinizin doğasına göre pencere boyutunu dikkatli seçmelisiniz.


Kodun Tamamı: Basit Moving Average Filter Kütüphanesi

Sonuç

Hareketli ortalama filtresi, basitliği ve etkililiğiyle öne çıkan bir filtreleme yöntemidir. C dilinde uygulanması da oldukça kolaydır. Kodunuzu ve pencere boyutunuzu ihtiyacınıza göre optimize ederek, birçok gerçek zamanlı uygulamada başarılı sonuçlar elde edebilirsiniz.

Sen de uygulaman için yukarıdaki örnekleri kolayca entegre edebilirsin!

26 Şubat 2024 Pazartesi

ESP32 ile Kristal veya Osilatör Kullanmadan RMII Üzerinden Ethernet Haberleşmesi ve İpuçları

İnternette gördüğüm ESP32 ve ethernet uygulamalarının çoğunda ethernet chipine kristal takarak uygulama çalıştırılmış. Bunun sinyal kalitesi açısından faydası olabilir ancak tek çözüm bu değil. ESP32 modüllerinden de ethernet için gerekli clock çıkışını alabilirsiniz.

Bunun için örnek devrede de gösterildiği gibi ESP32 ile ethernet chipinin clock uçlarını birleştirmek yeterli. Burada frekans 50 MHz mertebesinde olduğu için mümkün oldukça yakın olması önemli.

Benim yaptığım uygulamadan hat boyu yaklaşık 44 mm ve 2 adet via kullanılıyor. Buna rağmen sorunsuz bir şekilde sistemin çalıştığını gördüm.



ESP32 clock çıkışı için GPIO0, GPIO16, GPIO17 pinleri kullanılabilir.


Arduino arayüzünde varsayılan olarak clock ESP32'ye girecek şekilde tanımlanmıştır. Ethernet clock çıkışını tanımlamak için aşağıdaki satır kullanılabilir. Bu begin fonksiyonu üzerinden ethernet chipi, clock yönü ve pini seçilebilir.

ETH.begin(0,-1,23,18,ETH_PHY_LAN8720,ETH_CLOCK_GPIO17_OUT);

Kaynaklar;

  • https://docs.espressif.com/projects/esp-idf/en/release-v3.1/api-reference/ethernet/esp_eth.html
  • https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32d_esp32-wroom-32u_datasheet_en.pdf

C Dilinde Exponential Moving Average (EMA) Filter Nedir, Nasıl Uygulanır?

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ım...