Gönderen Konu: arduino dijital filtre  (Okunma sayısı 1029 defa)

Çevrimdışı sayangku

  • Kıdemli
  • ****
  • İleti: 226
arduino dijital filtre
« : 23 Eylül 2017, 00:45:06 »
sa arkadaşlar ben dijital filtreye merak sardım gerçekten önemli bir şey oldugunu anladım
hem basit olsun hemde uygulama yapabilim diye bendeki arduino sensor baglayip denemek istiyorum
şuanda analog sinyalden gelen bilgiyi bu kodla iyi bir şekilde filtreyebilirmiyim

static const byte analogPin = A0;
static const int MaxCount = 100;
int currentCount = 0;
long sum = 0;

void loop()
    {
     if(currentCount < MaxCount)
       {
         currentCount++;
         sum += analogRead(analogPin);
        }
      else
         {
           int avg = sum / MaxCount;
           int sample = analogRead(analogPin);
           int delta = sample - avg;
          lcd.print(delta);
 
           }
      delay(10);
   }

kalman olsun hareketli filtreler olsun bunları araştırdım şuanda uygulayabilcek düzeyde degilim bende
böyle bişi buldum konu hakkında fikrinizi almak istiyorum
devremde donanımsal olarak alçak geçiren filtre var bide bunu eklesem ne olur osiloskop yok bende
farkı anlayamayablirim oyuzden sordum

dijital filtre konusunda tavsiyeleriniz nelerdir
nasıl basitten baslarım   kaynakları okuyorum ama anladım var anlamadım var uygulamasını nasıl yapcam
kafamda deli sorular var mesela bi kod buldum netten
http://www.mcufreak.com/arduino-kalman-filtresi-uygulamasi/
nekadar dogru bilmiyorum

Çevrimdışı sımışka

  • Yeni Üye
  • *
  • İleti: 15
Ynt: arduino dijital filtre
« Yanıtla #1 : 23 Eylül 2017, 01:50:11 »
Median filtresine bakabilirsin.
Örneğin ;
Alıntı
ADC nin aldığı değerlerin ise sırasıyla 996, 1718, 1002, 993, 1692, 1003 olduğunu düşünelim. Değerlere şöyle bir göz attığımızda 1718 ile 1692 nin gürültü olduğunu veya yanlış ölçtüğünü rahatlıkla söyleyebiliriz. Diğerleri ise asıl olması gereken 1000 değerinden çok az sapmıştır ve bunlarıda ölçüm hatası olarak adlandırabiliriz. Bu 6 sayının ortalamasını aldığımızda ise 1234 sayısını elde ederiz. Yani 6 adet okuma sonunda filtrelenmiş değer 1234 dür. Birde ortanca filtresini uygulayarak bakalım.

Sayıları tekrar yazarsak 996, 1718, 1002, 993, 1692, 1003 . Bu sayıları 3 erli gruplar halinde ele alıp her 3 erli grubun ortancasını asıl sayı ile yer değiştirelim. Yanlız ilk ve son sayılar için kendilerini birer kez daha yazarak 3 er grup oluşturacağız.

1. gurup: ilk sayı 2 kez yazılarak 996, 996, 1718 bu üç sayının ortancası 996 dır. O halde ilk sayının yeni değeri ( değişmedi ) 996 dır.

2. gurup: 996, 1718, 1002 bu üç sayının ortancası 1002 dır. O halde ikinci sayının yeni değeri ( değişti ) 1002 dir.

3. gurup: 1718, 1002, 993 bu üç sayının ortancası 1002 dır. O halde üçüncü sayının yeni değeri ( değişmedi ) 1002 dir.

4. gurup: 1002, 993, 1692 bu üç sayının ortancası 1002 dır. O halde dördüncü sayının yeni değeri ( değişti ) 1002 dir.

5. gurup: 993, 1692, 1003 bu üç sayının ortancası 1003 dür. O halde beşinci sayının yeni değeri ( değişti ) 1003 dür.

6. gurup: son sayı 2 kez yazılarak 1692, 1003, 1003 bu üç sayının ortancası 1003 dür. O halde son sayının yeni değeri ( değişmedi ) 1003 dür.

Buna göre 996, 1718, 1002, 993, 1692, 1003 sayılarının yeni değerleri 996, 1002, 1002, 1002, 1003, 1003 dür. Görüldüğü üzere gürültüden kaynaklı 1718 ve 1692 sayıları kaybolmuştur. Yeni değerlerin ortalaması ise 1001,3 dür.

Değerleri ortanca filtresine sokmadan önce ortalama 1234 idi, ortanca filtresi sonucundaki ortalama ise 1001,3 oldu. Görüldüğü gibi ortaca filtresinden sonra değerlerin ortalamasını almak ile değerlerin ortalamasını doğrudan almak arasında ciddi bir fark var.

Çevrimdışı sayangku

  • Kıdemli
  • ****
  • İleti: 226
Ynt: arduino dijital filtre
« Yanıtla #2 : 23 Eylül 2017, 04:08:40 »
hocam öncelikle böyle bir yöntem anlattıgınız için teşekkür ederim uygulamada ben bir dizin oluşturmam gerek sanırım kod dökmem zor olucak  tecrübesiz oldugum için bu arada anlattıgınız sistem aklıma çok yattı
« Son Düzenleme: 23 Eylül 2017, 04:09:50 Gönderen: sayangku »

Çevrimdışı baran123

  • Profesyonel Üye
  • *****
  • İleti: 1956
Ynt: arduino dijital filtre
« Yanıtla #3 : 23 Eylül 2017, 04:29:07 »
"Complementary Filter"

Çevrimdışı sayangku

  • Kıdemli
  • ****
  • İleti: 226
Ynt: arduino dijital filtre
« Yanıtla #4 : 23 Eylül 2017, 05:24:14 »
baran123 hocam "Complementary Filter" açıklarmısınız internetten baktım ama tam anlayamadım dogrusu
bazıları kalman filtreden iyi diyor bu dogrumu
« Son Düzenleme: 23 Eylül 2017, 05:25:18 Gönderen: sayangku »

Çevrimdışı sayangku

  • Kıdemli
  • ****
  • İleti: 226
Ynt: arduino dijital filtre
« Yanıtla #5 : 23 Eylül 2017, 05:32:21 »
hocam adc portu olan a1 portuna dijital filtre uygulmam gerek ortalama alarak nasıl yapabilirim
bana kodlu örnek verebiirmisiniz ezber yapmıcam yada bi projede kullanmıcam maksat işin işleyici
ögrenmek kodu okumak şuan bilgiyi teori olarak görüyorum ama uygulayamiyorum malesef

Çevrimdışı sayangku

  • Kıdemli
  • ****
  • İleti: 226
Ynt: arduino dijital filtre
« Yanıtla #6 : 23 Eylül 2017, 05:52:13 »
/* Sensor smoothing
   by Eric Forman [www.ericforman.com]
   Original version 2008, updated May 2012

   Smooths sensor readings by adding only a fraction of new values.
   The more the new value is divided, the smaller the change, thus a smoother result
   As with any smoothing function, the more you smooth, the slower the response time
*/

int   sensorPin = 0;                    // sensor input pin
int   rawVal = 0;                       // sensor raw value
float smoothedVal = 0.0;                // sensor smoothed value
//float smoothedVal2 = 0.0;             // add additional sensors if you want
float smoothStrength = 5;               // amount of smoothing (default 10)

void setup() {
  Serial.begin(9600);
}

void loop() {
    rawVal = analogRead(sensorPin);
    delay(10);                          // tiny delay to give ADC time to recover

    smoothedVal = smooth(rawVal, smoothedVal);

    // you probably will only use the smoothed value, but print both to compare:
    Serial.print(rawVal);
    Serial.print(",");
    Serial.print(round(smoothedVal));     // * truncates float decimal places *
    Serial.println();
}

float smooth(int t_rawVal, float t_smoothedVal) {
    return  t_smoothedVal + ((t_rawVal - t_smoothedVal) + 0.5) / smoothStrength;  // +0.5 for rounding
}

Çevrimdışı sayangku

  • Kıdemli
  • ****
  • İleti: 226
Ynt: arduino dijital filtre
« Yanıtla #7 : 23 Eylül 2017, 08:07:24 »
bitane buldum kalman filtre

Çevrimdışı digiman

  • Kıdemli
  • ****
  • İleti: 357
Ynt: arduino dijital filtre
« Yanıtla #8 : 23 Eylül 2017, 17:10:32 »
Ortanca degerler buyuk sayilara denk gelseydi 1718 vs gibi sonuc cok farkli cikardi bence ornek biraz yaniltici olmus.Gozden kacirdigim bir nokta mi var?
Âlimin afeti, kendini büyük görmesidir.

Çevrimdışı berat23

  • Emektar
  • *****
  • İleti: 619
Ynt: arduino dijital filtre
« Yanıtla #9 : 24 Eylül 2017, 02:15:07 »
dijital filtre konusunda tavsiyeleriniz nelerdir
nasıl basitten baslarım   kaynakları okuyorum ama anladım var anlamadım var uygulamasını nasıl yapcam
kafamda deli sorular var mesela bi kod buldum netten
http://www.mcufreak.com/arduino-kalman-filtresi-uygulamasi/
nekadar dogru bilmiyorum


şu linkteki kalman uygulaması kalman nasıl kullanılmaz dersi olmuş, hatta yanlış bilgiler de var. burdan kalman öğrenilmez.

dijital filtre öğrenmek ile her dijital filtreyi kastediyorsanız o işin skalası çok büyük. bence biraz temel gidin, sadece dijtal diye kalman ile kayar ortalama aynı sınıfın elemanı değiller.

Çevrimdışı baran123

  • Profesyonel Üye
  • *****
  • İleti: 1956
Ynt: arduino dijital filtre
« Yanıtla #10 : 24 Eylül 2017, 09:00:39 »
Tabiki kalman daha iyi bir sonuç verir fakat uygulaması pek kolay değildir.
Complementary daha basittir ve uygulaması kolaydır.
Verdiği sonuç ise yapısına göre bir hayli iyidir.

Sanırım kalman içinde biraz olasık teorisi gibi bir takım "olasılık" konuları var.

http://www.pieter-jan.com/node/11

Çevrimdışı sımışka

  • Yeni Üye
  • *
  • İleti: 15
Ynt: arduino dijital filtre
« Yanıtla #11 : 24 Eylül 2017, 12:59:53 »
Ortanca degerler buyuk sayilara denk gelseydi 1718 vs gibi sonuc cok farkli cikardi bence ornek biraz yaniltici olmus.Gozden kacirdigim bir nokta mi var?

@digiman

Bir olasılık dağılımı simetrik olmayıp, çarpıklık gösteriyorsa, medyan, aritmetik ortalamadan daha uygun bir merkezsel konum ölçüsüdür. Simetrik olmama, sıralanmış veri değerleri için ya en küçük değerlerin ya da en büyük değerlerin diğerlerinden çok daha fazla uzaklaşması ile ortaya çıkar. Bu beklenmedik küçük veya büyük değerlere aykırı değer  adı verilir. Eğer veri dağılımı asitmetrik olan aykırı değerler kapsıyorsa, medyan aritmetik ortalamaya nazaran daha güçlü  bir merkezsel konum ölçüsü halini alır.