Monthly Archives: Nisan 2016

Sayısal Filtre ile Sensör/Veri Değerlerini Yumuşatmak

Düşünebileceğimiz her sistem için temel bileşenler sistemin girdileri ve çıktılarıdır. Sistem, belli girdiye karşılık kendi dinamiğine göre belli bir çıkış üretir. Bunu vücudumuzdan elektroniğe, doğadan yazılıma kadar herşeye genişletebiliriz. Tüm bu sistemlerde çoğunlukla çıktılara odaklanıyoruz ve çıktıları istediğimiz şekilde elde etmeye çalışıyoruz. Özellikle kendi geliştirdiğimiz sistemlerde ( elektronik, mekanik, yazılım, .. ) kontrol biraz daha bizim elimizde olduğu için istediğimiz çıktıları elde etmek için sürekli çalışıyoruz. Peki ya girdiler her zaman istediğimiz gibi mi? Her girdiyi olduğu gibi değerlendirmek zorunda mıyız? Aslında değil. Çoğu zaman istediğimiz çıktıyı elde etmek için girdiyi de sistemimize uygun hale getirmek gerekir. Örneğin, elimizdeki bir sensör ile ortamın karbonmonoksit oranını 4-20 ma akım bilgisi olarak alıyorsak, bu bilgiyi sadece 0-10 volt gerilim bilgisini anlayan elektronik sistemimizde değerlendiremeyiz. Girdilerde en çok karşılaşılan sorunlardan biri de ‘gürültü’ dediğimiz ve çeşitli sebeplerden dolayı oluşan olağan dışı , düzensiz ve diğer girdi değerleriyle uyuşmayan değerlere sahip girdilerdir. Özel olarak, bu durumu elektronik alanına indirgersek,  sensörlerden alınan girdileri örnek verebiliriz. İdeal çalışma koşullarının sağlanamadığı durumlarda , bazen aşırı artış veya azalış yapan değerler alabiliriz. Sensör , fiziksel değişkende ( sıcaklık, nem vs. ) belli bir değerin civarında sürekli değişen bir girdi de üretebilir. Bu durumda böyle bir girdiden nasıl daha normal değerler alabiliriz? Sensörü değiştirmeyeceğiz. İdeal çalışma ortamını da sağlayamıyoruz. Bu durumda çözüm; filtrelerdir. Filtrelerin temel amacı, bir girdinin istenmeyen kısmını ihmal etmek yada sadece istenen kısmın değerlendirilmesini sağlamaktır. Elektronik ve yazılımsal sistemlerde özel olarak bu işi yerine getiren filtreler, sayısal filtrelerdir. Birçok sayısal filtre türü var. En basiti, “basit yürüyen ortalamalı filtre”lerdir. Mantığı ise, girdinin son N adet değerini tutup bunların ortalamasını almak. Ve bunu her yeni gelen değerde yeniden yapmak. Bu makalenin asıl konusu olan filtreler ise “Üstsel artan ağırlıklı yürüyen ortalama” filtreleridir. Bu filtrenin avantajı, çıktıyı üretmek için sadece bir değer saklamaya ihtiyaç duyması ve filtrelemeyi bir çarpım ve bir de toplama işlemi ile gerçekleştirmesidir. Buradan anlaşılacağı üzere, bu tip filtre bellek dostu olup , kaynakları kısıtlı sistemler (mikrodenetleyiciler ..) için oldukça uygundur. Bir önceki basit yürüyen ortalamalı filtrede ise N adet değer depolanıp  N adet toplama işlemi yapılmaktadır.

Üstsel artan ağırlıklı yürüyen ortalama filtrelerinin formülü şu şekildedir :

formul1

Burada:

  •  α katsayısı, ağırlıkların azalma derecesini ifade eder ve 0 ile 1 arasında değer alır.
  • Ytt anındaki girdi değeri
  • St ise t anındaki çıktı değeridir.

α = 1/N alınarak aşağıdaki gibi modifiye edilmiş yeni yürüyen ortalama formülünü bulabiliriz:

formul2
Bu formül , herhangi bir programlama dilinde (Python, C, PLC Ladder, DDC Logic vs.) çok basitçe gerçekleştirilebilir.

Her filtrede olduğu gibi bu filtrede de gecikme olmaktadır ve filtreden çıkan değer, girdinin asıl değerinin biraz gerisinde kalır. Bu gecikmeyi istenen seviyede tutmak için farklı N değerleri ile sonuçlar izlenerek uygun N değeri bulunabilir.

Çoğu elektronik kontrol sistemi sayısal filtre seçeneğini hazır sunarak gelmektedir. Ancak bu seçeneği sunmayan sistemlerle karşılaştığımızda yada bir yazılım sistemi geliştirme aşamasında, gürültülü olan yada aşırı hızlı değişen sensör/veri değerleri için kendimiz tarafından bir sayısal filtre uygulamamız gerekebilir. Bu durumda yapılacak en basit ve iyi çözüm, üstsel artan ağırlıklı yürüyen ortalama algoritmasını kullanmaktır.

Kaynak : https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average

https://en.wikipedia.org/wiki/Moving_average#Modified_moving_average