Apakah ada perpustakaan pemulusan sinyal untuk Arduino?

14

Saya bekerja pada robot seluler yang dikendalikan melalui tautan nirkabel 2,4 GHz. Penerima terhubung ke Arduino Uno yang berfungsi sebagai pengontrol utama. Saluran input yang paling kritis (dan utama) yang berasal dari penerima menghasilkan sinyal yang sangat bising, yang menyebabkan banyak perubahan kecil dalam output aktuator, meskipun ini tidak diperlukan.

masukkan deskripsi gambar di sini
                    Alur input Arduino dalam interval 30 detik.

Saya mencari perpustakaan yang dapat melakukan perataan yang efisien. Apakah ada perpustakaan pemulusan sinyal yang tersedia untuk Arduino (Uno)?

asheeshr
sumber
Tidak tahu apakah Anda dapat menemukan perpustakaan semacam ini tapi saya khawatir ini mungkin membutuhkan daya CPU yang besar untuk Arduino. Saya lebih suka menggunakan solusi elektronik (low-pass filter) jika memungkinkan.
jfpoilpret
Saya dengan jfpoilpret pada ini. Saya pikir Anda memerlukan solusi elektronik. Saya akan mencoba kapasitor stabilisasi, (filter low pass sederhana). Saya berasumsi Anda menggunakan saluran ADC, jadi Anda harus membatasi dari saluran ini ke ground. Mulailah dengan nilai sekitar 100pf, dan lanjutkan dari sana.
John b

Jawaban:

8

Microsmooth adalah perpustakaan pemulusan sinyal lighweight yang saat ini sedang dikembangkan oleh saya.

Itu masih sedang dikerjakan dan tujuannya adalah membuatnya ringan dalam hal memori dan cepat. Perpustakaan menyediakan beberapa filter untuk menghaluskan:

  • Simple Moving Average
  • Rata-rata Bergerak Eksponensial
  • Kumulatif Rata-Rata Bergerak
  • Savitzky Golay Filter
  • Algoritma Ramer Douglas Pecker
  • Filter Kalmogorov Zurbenko

Untuk menggunakan perpustakaan, unduh dan tambahkan ke direktori sumber. Juga, tambahkan baris berikut ke file sumber Anda:

#include "microsmooth.h"
asheeshr
sumber
Hai, saya mengalami masalah dalam menggunakan perpustakaan Anda. Anda tidak akan menggunakan "Impor Perpustakaan ..." untuk mengimpor perpustakaan Anda, bukan? Saya mencoba hanya menyalin sumber ke folder .ino saya, tapi saya mendapatkan kesalahan tentang hilang automicrosmooth.h, Serial tidak didefinisikan, dan hilang ';'. Apakah perpustakaan ini masih berfungsi? Terima kasih
waspinator
@waspinator Maaf tentang itu. Memperbaiki kesalahan. Terima kasih untuk umpan baliknya!
asheeshr
7

Saya rasa saya melihat banyak lonjakan noise sampel tunggal dalam sinyal berisik Anda.

Filter median tidak lebih baik dalam menghilangkan lonjakan noise sampel tunggal daripada filter linear. (Ini lebih baik daripada filter low pass, rata-rata bergerak, rata-rata bergerak tertimbang, dll. Dalam hal waktu respons dan kemampuannya untuk mengabaikan pencuri kebisingan sampel-tunggal seperti itu).

Sebenarnya, ada banyak perpustakaan pemulusan sinyal untuk Arduino, banyak di antaranya termasuk filter median.

perpustakaan pemulusan sinyal di arduino.cc:

perpustakaan pemulusan sinyal di github:

Apakah sesuatu seperti ini berfungsi di robot Anda? (Median-of-3 membutuhkan daya CPU yang sangat sedikit, dan karenanya cepat):

/*
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);
}
David Cary
sumber
4

Sudahkah Anda mencoba filter low pass? Saya menemukan contoh di sini yang lain di sini .

Kedua perpustakaan ini memiliki daftar data yang sedang dibaca dari sensor analog pilihan Anda yang dirata-rata. Setiap nilai sensor baru ditambahkan ke daftar, dan yang terakhir dibuang, seperti ini:

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
Dokter
sumber
Cukup banyak apa yang dilakukan filter FIR sederhana dengan semua nilai tap diatur ke 1. Mengotak-atik nilai tap dapat meningkatkan sinyal lebih lanjut, tetapi membutuhkan matematika yang lebih tinggi.
jippie
Catatan: Tautan kedua menghitung rata-rata bergerak kumulatif yang bukan pilihan praktis untuk kontrol aktuator, terutama yang mungkin melibatkan start dan stop yang sering. Sinyal yang dihaluskan akan selalu mengikuti nilai puncak dari sinyal aktual dengan margin yang cukup.
asheeshr
2

Anda dapat memfilter ini secara digital menggunakan filter low pass:

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

Ubah 0,99 untuk mengubah frekuensi pemutusan (lebih dekat ke 1,0 adalah frekuensi lebih rendah). Ekspresi aktual untuk nilai tersebut adalah exp (-2 * pi * f / fs) di mana f adalah frekuensi cutoff yang Anda inginkan dan fs adalah frekuensi data sampel.

Tipe lain dari "filter digital" adalah filter acara. Ia bekerja dengan baik pada data yang memiliki outlier; misalnya 9,9,8,10,9,25,9. Filter peristiwa mengembalikan nilai yang paling sering. Secara statistik ini adalah mode.

Statistik rata-rata seperti Mean, Mode dll. Dapat dihitung dengan menggunakan Arduino Average Library .

Contoh yang diambil dari halaman Perpustakaan Arduino disebut:

#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);
}
akellyirl
sumber
1
Perhatikan bahwa ini akan sangat lambat, karena melakukan banyak gips implisit untuk mengapung dan kembali.
Connor Wolf