Kalman Filtresi Sonucu Sabitleme

Başlatan ugurer, 30 Kasım 2016, 22:43:05


ugurer

@muhittin_kaplan ve @tekosis yorumlarınız için teşekkür ederim. Medyan ortalamayı hiç denememiştim ona da bakınıyım biraz. @muhittin_kaplan hocam sizin kullandığınız yöntemi de deneyeceğim en kısa sürede sonuçları buraya yazarım. İlginiz için teşekkürler.

ugurer

@muhittin_kaplan hocam belirttiğiniz linkleri inceledim en sonunda desteğiniz için teşekkür ederim fakat istediğim gibi bir sonuç elde edemedim maalesef klasik ortalama almayla aynı hızda çalışıyor ve picklere karşı istediğim seviyede hassas çalşmıyor.
@tekosis  hocam medyan filtreyi de araştırdım fakat kendi kodlarıma nasıl ekleyeceğimi bulamadım maalesef, örnek olarak alabileceğim bir yerler var mıdır ?


muhittin_kaplan

#18
unutulan geçmiş, moving average, median average  bildiğiniz fifo ortalama.
http://www.muhittinkaplan.com/?p=22

ugurer

hocam tekrar ölçüm sonuçlarını paylaşıyorum hareketli ortalama için,


Yani anlamıyorum nerede hata var sizin dediğiniz gibi yapıyorum ama hiç bir iyileşme olmuyor. Sol taraf klasik ortalama sağ tarafta hareketli ortalama için.
kodlar https://www.picproje.org/index.php/topic,32011.msg224288.html bu linktekinin birebir aynısı.

muhittin_kaplan

ortalama derinliği kaç hocam
(image şeklinde değilde text liste atarsanız ölçüm değerlerini bakalım hocam)

berat23

bence olayı iyi analiz etmek lazım. sonra metod belirlenir.

mesela sizin durum gauss gürültülü bir ölçüme benziyor. gürültünün istatistiği bilinirse kalman bize en optimum estimation'u verir. moving average ya da benzeri low pass yapılar gürültüyü yumuşatır ama öte yandan gecikmeler yaşatır. zaten bilmediğin bir gürültüyü low pass ile ki bu gauss ise mümkün değil filtreleyemezsin. ama şu var, eğer süren sonsuz ve girişin sabitse ortalama alırsan sonuç en düşük hatalıdır. bizim sistemde giriş değişken ve gerçek zamanlı olduğundan smoothing filter uygun değildir. yani ortalama ile filtrelersin ama yakışıklı olmaz.

bize en uygun çözümün kalman türevi estimator'lar olduğunu anladık. şimdi kalman der ki ben sana en az mse ile estimation yaparım. bu şu demek değl, çıkış hep ideal ortalamada kalacak. elbette girişe bağlı olarak değişecek ve bu değişime 1-2 digit gibi bir sınır çizemesiniz. kalman deyince ben şunu da sorgularım; state  space modeli sistemi tanımlamada yeterli mi, ya da measurement ve process noise'ları nasıl belirlendi. zira kalman bu istatistikleri bilirse işini yapar.

biraz daha temele dönelim, dedik ki kalman filtremiz mükemmel, sorun yok. yine istenenden fazla gürültü varsa temelde dönmek lazım. eğer benim ölçüm sistemim fazla gürültülü ise kalman harikalar yaratamaz. demek ki ölçen devremde bir hata var ki ben istediğim doğruluğu sağlayamıyorum.

öte yandan bu kadar mühendislik yapmak yerine gecikmeleri göze alıp sanayi stayla 10-15 tap moving average koymak ta bir çözüm olabilir.

ugurer

Anlıyorum hocam. Ölçüm dengesiz olduğu için yani elektronik kısım iyi filtrelenmediği için kalman istediğim sonucu veremiyor. Anladığım kadarıyla bu durumda en iyi çözüm bol örnekleme alıp ortalama almak baya bir yol denedim fakat istediğim sonuçlara yaklaşamadı. Bu arada konuyla alakalı güzel bir makale buldum ilgilenen arkadaşlar için paylaşıyım.
http://www.analog.com/en/analog-dialogue/articles/a-reference-design-for-weigh-scales.html

tekosis

@ugurer kusura bakma yazamadım. aşağıda kaynak olarak kullandığım, medyan filtreyi anlatan siteyi veriyorum. sonrasında ise benim kullandığım, pek profesyonelce olmayan ama işime yarayan kodları paylaşıyorum. eğer sitede verilen örneği bir kalem kağıt ile sende çözersen verdiğim kodu da rahatlıkla anlarsın inşallah. hani profesyonel bir kod olduğundan değil, düzensiz olduğundan  :D

https://electronicsfreelancer.wordpress.com/2011/09/14/median-filter-ortanca-filtresi/

void adc_oku()
{
unsigned int ao_i=0;
unsigned int ao_j=0;
 sensor1voltaj=0;

  set_adc_channel(sensor1_kanali);
  delay_us(20);
  
  for(ao_i=1;ao_i<=8;ao_i++)
  {
  adc_deger[ao_i]=read_adc();// 8 adet örnek alınıyor(adc_deger[10] adet değer alıyor ama ben 1....8 arası olanları kullanıyorum)
  delay_ms(1);
  }

 adc_deger[0]=adc_deger[1]; // burada medyan filtreleme için gerekli olan soldaki ve sağdaki değer eklemeleri yapılıyor
 adc_deger[9]=adc_deger[8];// ilk değerin aynısı dizinin soluna, son değerin aynısı dizinin sağına ekleniyor.

    for(ao_j=0;ao_j<=9;ao_j++)   //buradan sonra yukarıda alınan 8 örneğin medyan filtrelemeye uygulanmış hali var
    {
    adc_deger_2[ao_j]=adc_deger[ao_j]; // örnekler yedekleniyor
    }

  for(ao_i=0;ao_i<=9;ao_i++)
  {
    for(ao_j=0;ao_j<=9;ao_j++)
    {
    adc_deger[ao_j]=adc_deger_2[ao_j];
    }

  if(adc_deger[ao_i]>adc_deger[ao_i+1])
  {
  adc_deger_yedek=adc_deger[ao_i+1];
  adc_deger[ao_i+1]=adc_deger[ao_i];
  adc_deger[ao_i]=adc_deger_yedek;
  }

  if(adc_deger[ao_i+1]>adc_deger[ao_i+2])
  {
  adc_deger_yedek=adc_deger[ao_i+2];
  adc_deger[ao_i+2]=adc_deger[ao_i+1];
  adc_deger[ao_i+1]=adc_deger_yedek;
  }

  if(adc_deger[ao_i]>adc_deger[ao_i+1])
  {
  adc_deger_yedek=adc_deger[ao_i+1];
  adc_deger[ao_i+1]=adc_deger[ao_i];
  adc_deger[ao_i]=adc_deger_yedek;
  }

  adc_deger_medyan[ao_i]=adc_deger[ao_i+1];
  }

  // burada medyan filtreleme tamamlandı. 
  
  adc_deger_medyan[8]=0; // en sağda kalan gereksiz değerleri alışkanlıktan sıfırlıyorum
  adc_deger_medyan[9]=0;

          adc_ortalama=0;
            for(ao_j=0;ao_j<=7;ao_j++)   // filtrelemeden geçirilmiş 8 değerin ortalaması alınıyor.
            {
            adc_ortalama = adc_ortalama + adc_deger_medyan[ao_j];
            }ao_j=0;
           adc_ortalama=adc_ortalama/8;
		   
		   }
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

berat23

#24
median filtreye gauss verirsen verdiğin gibi birşey alırsın. median, arada sırada gelen büyük hatalı verileri filtrelemek için ideal.

ayrıca örnek sayısını arttırıp filtreyi uzatmakta çözüm olmaz, neticede aynı kapıya çıkar. örneği arttırmadan filtre uzar ya da filtre boyu sabitken örnek azalırsa sonuç daha yumuşak olur.