avatar_Hattuşa

Moving Average Filter (hareketli ortalama Filtresi)

Başlatan Hattuşa, 11 Eylül 2021, 21:20:56

Hattuşa

Dim OkunanAdc As Word
Dim Sonuc As Word
Dim Sonraki As Float
Dim Onceki As Float
Symbol Katsayi =0.2


Main:
OkunanAdc =ADIn 0
DelayUS 50
Sonraki =(OkunanAdc *Katsayi) +(Onceki *(1-Katsayi))
Onceki =Sonraki
Sonuc =Sonraki *1
DelayMS 10
GoTo Main

buradaki katsayı değeri sıfırdan büyük 1 den küçük olmalıdır şartı var.
@ete hocam size sormak istediğim konu şu;
diyelim ki ilk filtrede katsayiyi 0.2 aldık, aşağıdaki filtre ile arasında farkı nedir?
Dim OkunanAdc As Word
Dim Sonuc As Word


Main:
OkunanAdc =ADIn 0
DelayUS 50
Sonuc =((Sonuc *8) +(OkunanAdc *2))/10
DelayMS 10
GoTo Main

bu arada filtre stabil bir adc okuması yoksa uygulandığında işe yarıyor

ete

Üstteki kod değişken katsayı ile çalışabiliyor. Alttaki ise sabit katsayı uyguluyor. Üsttekinde katsayıyı 0,2 alırsan alttaki formül ile eşdeğer hale geliyor iki formülde aynı sonuçları üretir.
Örnek verelim.
İlk çalışmada önceki=0 olacağı için sonraki=ADC*0,2 olur. Diyelimki 800 okuyoruz adc den. Sonraki=160 olacaktır. İkinci okumaya geçildiğinde (yine 800 okunmuş olsun) Sonraki=160+128=288 olacaktır.

Şimdi ikinci formüle geçelim. İlk okumada sonuç=0 başlayacak O halde Sonuç=(800x2)/10 =160 bulunur. İkinci okumada Sonuc=((160*8)+(800*2))/10=288 bulunacaktır.
Aslında ikinci formüle bakarsan 8/10=0,80 dir ve Önceki*(1-Katsayının) aynısıdır. 800x2/10 ise  ADC*Katsayının aynısıdır.

Ete

Hattuşa

#2
Ete hocam yukarıdaki filtre sinyaldeki ripple parazitlerde oldukça işe yarıyor ne varki sinyaldeki osilasyonda işe yaramıyor. iki resim ekliyorum. 1 resim rippleden kastım olan parazitler, 2 resim ise similasyonda ben sinüs sinyali girdim adc okunan sinyalin üzerine ki bu tip parazitlerde daha stabil okuma yapmak için neler yapmak gerekir? nette arama yapabilmek için belki de doğru kelimeyi bulamadım, bu arada sinyalde analog filtreler elbette vazgeçilmezdir ve ben analog olarak kullanılacak filtreleri kastedmiyorum.






bu filtre algoritmasından bir şeyler çıkarabilirmiyim diye düşünüyorum. Yani (uzun yazmak istemiyorum ama);
katsayi değişkenini önceki değerlere göre sürekli yenileyerek daha stabil hala getirilebilir mi?
şimdi katsayı sabitken ve 0,2 alınmışken;
en son okunan adc değerinden 2 tane, öncekinden 8 tane alınıp toplanıp 10 a bölünerek bir ortalama alınıyor mantıken bu böyle olduğunu düşünüyorum.
peki;
ben adc okuttuktan sonra okunan adc değerini bir önceki adc değeri ile karşılaştırıp aradaki farka göre katsayı değişkenini değiştirsem. yani fark =abs(okunanAdc -sonuc dediğimde fark değeri çok ise son okunan adc değerinden daha az diğerinden daha çok hesaplamaya katarak farkın çok olduğu durumda değişimin daha az oluşmasına zorlarsak daha stabil mi olur diye düşünüyorum. tabi matematik özürlü olduğumuz için ve çok fazla if komutu kullanmadan bunu nasıl yapabiliriz diye yardım istiyordum

ete

Açıkçası osilasyon filtreleme konusu ile pek uğraşmadım. Genelde uyguladığım yöntemler ripple tipi taşmaları filtre edecek yöntemler ki bunlar;
- ortalama almak ki bu konuda yine genelde 30 okuma yapıp ortalamasını alırım.
- Yine 30 okuma yapıp küçükten büyüğe doğru sıraya dizme ve ardından alttan ve üstten belirli adet okumayı atarak ortada kalanları toplayıp ortalamasını almak. Örnek vereyim 30 okuma yap. Sıraya sok. İlk 5 adedini at (en küçükler) ve sondan da 5 adedini at bunlar en büyükler, ortada kalan 20 adedi topla ve ortalamasını al şeklinde.
Aslında elinde parazitli kaynak var ise bunu deneyerek görmen ve en doğru filtreyi seçmen daha doğru olur diye düşünüyorum. Tabiiki parazit dediğin şey lineer eğriden alta ve üste sapan okumalar ise ortalama işini düzeltecektir diye düşünürüm. Formüllü şekilde işi epeyce düzeltir.
Sana öneride bulunacak kadar tecrübem yok bu nedenle kendin bir şeyler bulmaya çalış derim.
Kullandığın formüllerde katsayının etkisini değiştirerek görebilirsin. Temel mantık yeni okunanın %20 sini al önceki okunanın %80'ini alıp birleştir. Böylece yeni okumanın etkisini minimuma indirmiş oluyor formül. Katsayı arttıkça etki de artacaktır. Ama mantığım bana şunu söylüyor. bir önceki okunan da kusurlu ise bu yönteminbir faydası olmayacaktır. Bu sistem iki okuma arasındaki farklılıkları ortadan kaldırabilir ama osilasyonda etkisi olacağını sanmıyorum. Bana göre osilasyon bir filtreleme konusu olamaz ancak ve ancak analog olarak onu engelleyecek bir sistem bulmak belki daha doğru olur.

ete

Hattuşa

yanıtınız için teşekkür ederim, hocam iş-güc yok bu aralar bari kendimizi geliştirelim diye uğraşıyoruz.
Bahsettiğiniz gibi elbette kendimizce filtreleme teknikleri uyguluyoruz kısmen başarılı oluyor ama bazen
 de dezavantajları da olmuyor değil, mesela; kritik sinyal okumalarında 1mS lik kesme oluşturup kesme anında  adc yi okutup ortalamasını alıp 20-30 arraylık bir dizeye atıp unutulan geçmiş fltresi ve peşinden de buble short yaptığımızda eldeki sonuc çok mükemmel oluyor ve kesme içerisinde ki okunan adc leri de FIFO mantığında kullanıp yani ilk giren ilk çıkar gibi kullandığımızda herşey normal ancak dezavantaj olarak tepki hızı yavaşlıyor, yani sinyaldeki değişim 0,5 sn gecikmeler oluyor.
sonuc olarak bizde acaba boş dururken darral taylor gibi filtreler oluşturup bunu kütüphane şekline aldırabilirmiyiz çabasındayız.
şu sıralar acaba bizde mi yoksa heryer de mi bir durağanlık var bilmiyorum. hayırlısı bakalım

mehmet

Buradaki float kodunu lazım oldukça
kullanıyorum.
Kendinize göre değiştirebilirsiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

ete

Oradaki fload kodu zaten ilk formülün aynısını uyguluyor.
Formül y(i)= β∗x(i)+(1-β)∗y(i-1) şeklinde 
yukarıdaki ilk formül ise  Sonraki =(OkunanAdc *Katsayi) +(Onceki *(1-Katsayi))  şeklinde şimdi eşleştirelim.
Y(i) bizim SOnraki hesaplanacak olan değerimiz, β ise filtre katsayımız. O halde;
β∗x(i) hesabı ile (OkunanAdc *Katsayi)  hesabı bir birinin aynısıdır terimler farklı yanlızca işlev aynı. (1-β)∗y(i-1) ile (Onceki *(1-Katsayi)) de bir birinin aynı işi yapıyor. Dolayısıyla iki formül bir birinin aynısıdır. Odaklanılacak konu ise filtre katsayısının küçük bir değer olarak alınmış olması. Buda bize şunu anlatıyor. Ufaktan başlayarak katsayı denemesi yapıp sonuçta uygun bir değer bulunabilir. Şahsi fikrim 0,10 - 0,20 aralığında bir değer seçilmesi yönünde.

Ete

ete

Az evvel EXCEL kullanarak bir deneme yaptım. Yaklaşık 50 adet ADC okumasını 500-800 aralığında değişik değerler olacak şekilde aldım. Aralara 550-750-800-650 gibi sapmalı değerler yerleştirdim. Sona doğru okuma farklılıklarını 700-703-701-700-698 gibi küçük farklara denk getirdim.
Başlangıç katsayı değerimi =0,05 aldım ve sonucu grafiğe çevirip baktım.  Okunan gerçek değer çizgisi epeyce zigzag lı gitmesine rağmen hesaplanan sonuç daha aşağıdan çok düzgün şekilde yükselen bir eğri çizdi.
Katsayıyı 0,10 aldım buda gerçek okuma değerlerine yaklaşan düzgünce bir eğri çizdi ve sonuna doğru doğruya benzedi ve gerçek okunan ile aynı seviyeye geldi denilebilir.
Katsayıyı 0,15 yaptım pek bir şey farketmedi.
Katsayıyı 0,20 yaptım  linearite pek değişmesede orjinal okumanın iniş çıkışlarına uyum sağlamaya başladı filtre çizgisi. Bu, bana katsayının büyük geldiğinin bir işareti gibi geldi.
Daha büyük değerlerde filtreli çizgi filtresize doğru yaklaşıyor ve sapmaları da yavaş yavaş göstermeye başlıyor. Bu işlem sonucunda 0,15 lik katsayının benim okuma sistemime ideal geldiğini anladım. Kısaca kriter olarak iki farklı katsayı değeri çizgide bir değişiklik göstermiyor ise ip ucunuz budur ve o iki değerden birisini alabilirsiniz. Bende %10 ,le %15 lik değer ler aynı sonucu verdi ben tercihen %15 dedim. Çünki bir yandan da orjinal okuma çizgisi ile filtre çizgisinin bir birine mümkün olduğunca yakın olmasını isterim. Katsayınınbüyümesi bunu sağladığına bakıp büyük olanı seçmekte yarar görüyorum.
Bu durumda Mümkünse okuma değerlerini en azından 50 okuma yapıp eproma kayıt etmek ve bunları alıp EXCEL de benzer bir çalışma yapıp en uygun katsayıyı gözlemlemek akıllıca olur derim.

Ete

fzf

Slm analog ölçüm yaptım bir cıhazda digital filtremeleri denedin işe yaramadı soyle yAPsam yazılımda anolog girişe bak deger 1 okudu diyelim peşinden tekrar git bak deyip deger yine 1 ise eşitleyip ekrana yollasak eğer tekrar degeri okuyup 1.2 ise tekrar bakmak için yoladıgımıDa 1.2 ise ekrana basaak degilse bekletsek tamamen eşitlige bakmak gibi bir yazılım bize filtreleme yapmış olurmuyuz degerli ustaların yorumlarını bekliyorum tşk

ete

Bu yöntem bir filtre değil ve çok sağlıklı bir yöntem değil gibi. Yanlızca üst üste iki okumanın eşit olmasını beklemekten başka bir şey değil. Ancak ikinci okuma birinciden farklı ise onu ilk okuma kabul edip üçüncünün aynı olmasını bekliyor olacaksınki bu sürekli artan adc girişlerinde ekrana pek fazla bilgi yansımayacak anlamına gelir.

Filtreleme için kullanılabilecek yöntemleri açıklamıştım ama yenidenbelirteyim.
1. Ortalama almak. Bunun için 30 okuma yapıp okunanları toplamak ve sonunda toplamı 30 a bölerek ortalama almak bir yöntemdir. Nispeten iyi netice vermektedir.

2. Yine 30 adet okuma yapıp okunanları küçükten büyüğe doğru sıraya dizip alttan 5 adet üstten de 5 adet okumayı atıp ortada kalan 20 taneyi toplayıp ortalamasını almak da iyi bir yöntemdir.

3. Yeni okunan değerin sıklıkla sapma göstermesi durumunda etkisini azaltmak için yukarıda açıklanan katsayı kullanma metodunu kullanmak akıllıca olacaktır.

Hepsi bu kadar.
Ete

aRci

Merhaba,
Burada bahsettiğiniz ezel sayfasını paylaşabilirsiniz
Örnek olarak kullanmak istiyorum
Alıntı yapılan: ete - 13 Eylül 2021, 10:52:04Az evvel EXCEL kullanarak bir deneme yaptım. Yaklaşık 50 adet ADC okumasını 500-800 aralığında değişik değerler olacak şekilde aldım. Aralara 550-750-800-650 gibi sapmalı değerler yerleştirdim. Sona doğru okuma farklılıklarını 700-703-701-700-698 gibi küçük farklara denk getirdim.
Başlangıç katsayı değerimi =0,05 aldım ve sonucu grafiğe çevirip baktım.  Okunan gerçek değer çizgisi epeyce zigzag lı gitmesine rağmen hesaplanan sonuç daha aşağıdan çok düzgün şekilde yükselen bir eğri çizdi.
Katsayıyı 0,10 aldım buda gerçek okuma değerlerine yaklaşan düzgünce bir eğri çizdi ve sonuna doğru doğruya benzedi ve gerçek okunan ile aynı seviyeye geldi denilebilir.
Katsayıyı 0,15 yaptım pek bir şey farketmedi.
Katsayıyı 0,20 yaptım  linearite pek değişmesede orjinal okumanın iniş çıkışlarına uyum sağlamaya başladı filtre çizgisi. Bu, bana katsayının büyük geldiğinin bir işareti gibi geldi.
Daha büyük değerlerde filtreli çizgi filtresize doğru yaklaşıyor ve sapmaları da yavaş yavaş göstermeye başlıyor. Bu işlem sonucunda 0,15 lik katsayının benim okuma sistemime ideal geldiğini anladım. Kısaca kriter olarak iki farklı katsayı değeri çizgide bir değişiklik göstermiyor ise ip ucunuz budur ve o iki değerden birisini alabilirsiniz. Bende %10 ,le %15 lik değer ler aynı sonucu verdi ben tercihen %15 dedim. Çünki bir yandan da orjinal okuma çizgisi ile filtre çizgisinin bir birine mümkün olduğunca yakın olmasını isterim. Katsayınınbüyümesi bunu sağladığına bakıp büyük olanı seçmekte yarar görüyorum.
Bu durumda Mümkünse okuma değerlerini en azından 50 okuma yapıp eproma kayıt etmek ve bunları alıp EXCEL de benzer bir çalışma yapıp en uygun katsayıyı gözlemlemek akıllıca olur derim.

Ete

ete

Dosya ilişiktedir. Libre_office ile kullanıyorum.
Ete

Hattuşa

hocam buradaki katsayi değerlerinin (0,15 ve 0,85) değerlerinin okunan ile bir önceki okunan farkına göre yeniden hesaplanması ile oluşturulduğunda ve formule yerleştirildiğinde daha stabil bir sonuç elde edilebileceğine inanıyorum, Burada ki amaç filtreli değerinin merkezden kaçmasını minimuma indirmek olduğunu düşünüyorum. özetlersek; aradaki fark düştükçe katsayı değerlerinin %50 ye %50 yakın olması fark arttıkça da katsayının da merkezden uzaklaşması mantıklı olacaktır.

ete

Aslında rastgele girilen değerlere bakıp pek karar vermek de doğru değil.
Ben girdiğim rakamlarda sapma miktarlarını biraz abarttım. Hiç bir ADC bir girişi 800 diğerini 750 okumaz ancak çok hızlı değişen değerlerde bu olabilir. Ben olayın şeklini görebilmek adına böyle yaptım.
Gerçek değerleri kayda alıp (en azından 100-200 değeri sıra ile eproma kaydedip onları tabloya geçirmek çok daha doğru olur. Böylece olayın ne kadar saptığını yada sapmadığını görebilirsiniz.
Ancak şu bir gerçek ki basit ifade ile düşünürsek formül yeni değerin katsayı oranındaki kısmını hesaplanan değere ekliyor bu nedenle sapmalarda katsayı oranında artıp çoğalabiliyorki katsayı zaten düşük olacağı için hesaplanan değer sapması epeyce aza indirgenmiş oluyor otomatikman.
Bence faydalı bir yöntem ama anlık değişim izlenen bir yerde faydadan çok zarar verebilir. O nedenle yöntemi uygun yerde kullanmak gerekir. Bir diğer sorun olabilecek meselede hesaplanan değerin ilk başlarda geriden geliyor olması. Bu nedenle programınbaşında en azından 30-40 okumayı yapıp ana değerlendirmeye daha sonra geçmek uygun olacaktır. Grafik her şeyi görsel olarak gösteriyor bu çok güzel bir özellik. Olayı sanki 3 boyutlu anlamanızı sağlıyor.

Ete

Hattuşa

hocam değerleri eprooma kaydetmiyorum, değerleri cep telefonuma gönderiyorum, orda oluşturduğum tablodan bakarak bu sonuca ulaştım. yalnız tablo 30-40 değeri gösteriyor ve ilk giren ilk çıkıyor, dediğiniz gibi adc okumasını enaz 300-500 okumadan sonra yansıtıyorum ki formul yerine anca oturuyor. 

Powered by EzPortal