Arduino için sinyal yumuşatma kütüphaneleri var mı?


14

Kablosuz 2,4 GHz bağlantı üzerinden kontrol edilen bir mobil robot üzerinde çalışıyorum.Alıcı, ana kontrolör olarak yerleşik Arduino Uno'ya bağlı. Alıcıdan gelen en kritik (ve ana) giriş kanalı çok gürültülü bir sinyal üretir, bu da gerekli olmasa da aktüatörlerin çıkışında çok sayıda küçük değişikliğe yol açar.

resim açıklamasını buraya girin
                    Arduino'nun girişinin 30 saniyelik bir aralıkta çizimi.

Verimli yumuşatma yapabilen kütüphaneler arıyorum. Arduino (Uno) için sinyal yumuşatma kütüphaneleri var mı?


Bu tür kütüphaneleri bulabilecek misiniz bilmiyorum ama korkarım ki bunlar bir Arduino için çok fazla CPU gücüne ihtiyaç duyabilir. Mümkünse elektronik bir çözüm (düşük geçiş filtresi) ile tercih ederim.
jfpoilpret

Bu konuda jfpoilpret ile birlikteyim. Bence elektronik bir çözüme ihtiyacınız var. Bir stabilizasyon kapasitörü denerdim (basit alçak geçiren filtre). Bir adc kanalı kullandığınızı varsayıyorum, bu yüzden bu kanaldan toprağa bir başlık koymalısınız. 100pf civarındaki değerlerle başlayın ve oradan çalışın.
John b

Yanıtlar:


8

Microsmooth şu anda benim tarafımdan geliştirilen hafif bir sinyal yumuşatma kütüphanesidir.

Halen üzerinde çalışılmaktadır ve amaç bellek açısından hızlı ve hızlı hale getirmektir. Kütüphane, düzgünleştirme için birden fazla filtre sağlar:

  • Basit Hareketli Ortalama
  • Üstel Hareketli Ortalama
  • Kümülatif Hareketli Ortalama
  • Savitzky Golay Filtresi
  • Ramer Douglas Pecker Algoritması
  • Kalmogorov Zurbenko Filtresi

Kütüphaneyi kullanmak için indirin ve kaynak dizine ekleyin. Ayrıca, kaynak dosyanıza aşağıdaki satırı ekleyin:

#include "microsmooth.h"

Merhaba, kitaplığınızı kullanırken sorun yaşıyorum. Kütüphanenizi içe aktarmak için "Kütüphaneyi İçe Aktar ..." ifadesini kullanmazsınız değil mi? Sadece kaynağı .ino klasörüne kopyalamayı denedim, ancak automicrosmooth.h eksik, Seri tanımlanmadı ve ';' eksik hakkında hatalar alıyorum. Bu kütüphane hala çalışıyor mu? Teşekkürler
waspinator

@waspinator Bunun için üzgünüm. Hatalar düzeltildi. Geri dönüşünüz için teşekkür ederiz!
asheeshr

7

Gürültülü sinyalinizde çok sayıda tek örnekli gürültü ani olduğunu düşünüyorum.

Medyan filtre, tek örnekli gürültü sivri uçlarından kurtulmada doğrusal filtrelerden daha iyidir. (Yanıt süresi ve bu tür tek örnekli gürültü başak uçlarını göz ardı etme yeteneği açısından düşük geçişli filtreden, hareketli ortalamadan, ağırlıklı hareketli ortalamadan vb. Daha iyidir).

Aslında, birçoğu medyan bir filtre içeren Arduino için birçok sinyal yumuşatma kütüphanesi vardır.

arduino.cc'deki sinyal yumuşatma kütüphaneleri:

github'da sinyal yumuşatma kütüphaneleri:

Robotunuzda böyle bir şey çalışır mı? (Median-of-3 çok az CPU gücü gerektirir ve bu nedenle hızlıdır):

/*
median_filter.ino
2014-03-25: started by David Cary
*/

int median_of_3( int a, int b, int c ){
    int the_max = max( max( a, b ), c );
    int the_min = min( min( a, b ), c );
    // unnecessarily clever code
    int the_median = the_max ^ the_min ^ a ^ b ^ c;
    return( the_median );
}

int newest = 0;
int recent = 0;
int oldest = 0;

void setup()
{
    Serial.begin(9600);
    // read first value, initialize with it.
    oldest = random(200);
    recent = oldest;
    newest = recent;
    Serial.println("median filter example: ");
}

void loop()
{
    // drop oldest value and shift in latest value
    oldest = recent;
    recent = newest;
    newest = random(200);

    Serial.print("new value: ");
    Serial.print(newest, DEC);

    int median = median_of_3( oldest, recent, newest );

    Serial.print("smoothed value: ");
    Serial.print(median, DEC);
    Serial.println("");

    delay(5000);
}

4

Düşük geçişli bir filtre denediniz mi? Bir örnek buldum burada bir bir tane burada .

Bu kütüphanelerin her ikisinin de, seçtiğiniz analog sensörden okunan verilerin bir listesi vardır. Her yeni sensör değeri listeye eklenir ve sonuncusu şu şekilde atılır:

List: 3 4 3 3 4 3 5 3 2 3 4 3 
new reading added. old one thrown out
      /--                     /--
List: 5 3 4 3 3 4 3 5 3 2 3 4
list averaged

Basit bir FIR filtresinin 1'e ayarlanmış tüm musluk değerleri ile yaptığı hemen hemen.
jippie

Not: İkinci bağlantı , aktüatör kontrolü için pratik bir seçim olmayan kümülatif hareketli ortalamayı , özellikle de sık sık başlatma ve durdurmayı içerebilen bir ortalama hesaplar . Düzeltilen sinyal her zaman gerçek sinyalin tepe değerini oldukça fark eder.
asheeshr

2

Bunu düşük geçiş filtresi kullanarak dijital olarak filtreleyebilirsiniz:

int valueFilt = (1-0.99)*value + 0.99*valueFilt;

Kesme frekansını değiştirmek için 0,99'u değiştirin (1,0'a yakın daha düşük frekanstır). Bu değer için gerçek ifade exp'dir (-2 * pi * f / fs); burada f, istediğiniz kesme frekansıdır ve fs, verilerin örneklendiği frekanstır.

Başka bir tür "dijital filtre" bir olay filtresidir. Aykırı değerleri olan veriler üzerinde iyi çalışır; örneğin 9,9,8,10,9,25,9. Bir olay filtresi en sık kullanılan değeri döndürür. İstatistiksel olarak bu mod.

Ortalama, Mod vb. Gibi istatistiksel ortalamalar Arduino Ortalama Kütüphanesi kullanılarak hesaplanabilir .

Arduino Kütüphanesi sayfasından alınan bir örnek:

#include <Average.h>
#define CNT 600
int d[CNT];

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

void loop()
{
  int i;

  for(i=0; i<CNT; i++)
  {
    d[i] = random(500);
  }  

  Serial.print("Mean: ");
  Serial.print(mean(d,CNT),DEC);
  Serial.print(" Mode: ");
  Serial.print(mode(d,CNT),DEC);
  Serial.print(" Max: ");
  Serial.print(maximum(d,CNT),DEC);
  Serial.print(" Min: ");
  Serial.print(minimum(d,CNT),DEC);
  Serial.print(" Standard deviation: ");
  Serial.print(stddev(d,CNT),4);
  Serial.println("");
  Serial.println("");

  delay(5000);
}

1
Bunun çok yavaş olacağını unutmayın, çünkü yüzmek ve geri dönmek için çok fazla örtülü döküm yapıyor.
Connor Wolf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.