Чи є бібліотеки згладжування сигналу для Arduino?


14

Я працюю над мобільним роботом, керованим по бездротовому каналу 2,4 ГГц. Приймач підключений до Arduino Uno, який служить на борту головним контролером. Найбільш критичний (і основний) вхідний канал, що надходить від приймача, видає дуже галасливий сигнал, що призводить до безлічі незначних змін на виході виконавчих механізмів, навіть якщо вони не потрібні.

введіть тут опис зображення
                    Графік введення Arduino через інтервал 30 секунд.

Я шукаю бібліотеки, які можуть виконувати ефективне згладжування. Чи існують бібліотеки згладжування сигналу для Arduino (Uno)?


Не знаю, чи зможете ви знайти такі бібліотеки, але я боюся, що для Arduino це може знадобитися значною потужністю процесора. Я б скоріше пішов з електронним рішенням (фільтр низьких частот), якщо це можливо.
jfpoilpret

Я з jfpoilpret з цього приводу. Я думаю, що вам потрібно електронне рішення. Я б спробував стабілізатор конденсатора, (простий фільтр низьких частот). Я припускаю, що ви використовуєте adc-канал, тому вам слід покласти кришку від цього каналу до землі. Почніть зі значень близько 100pf і працюйте з цього моменту.
Іван б

Відповіді:


8

Microsmooth - це бібліотека згладжування сигналів легкої ваги, яка зараз розробляється мною.

Над цим ще працюють, і мета - зробити його легким з точки зору пам’яті та швидкості. Бібліотека пропонує кілька фільтрів для згладжування:

  • Просте ковзаюче середнє
  • Експоненціальна ковзаюча середня
  • Сукупна середня ковзна середня
  • Фільтр Савіцького Голая
  • Алгоритм Рамера Дугласа Пекера
  • Фільтр Калмогорова Зурбенко

Щоб користуватися бібліотекою, завантажте та додайте її до вихідного каталогу. Також додайте наступний рядок у вихідний файл:

#include "microsmooth.h"

Привіт, у мене проблеми з використанням вашої бібліотеки. Ви не використовуєте "Імпорт бібліотеки ...", щоб імпортувати свою бібліотеку? Я спробував просто скопіювати джерело в папку .ino, але я отримую помилки з приводу відсутності automicrosmooth.h, серійного не визначеного та відсутнього ';'. Ця бібліотека все ще працює? Дякую
waspinator

@waspinator Вибачте за це. Виправлені помилки. Дякуємо за відгук!
asheeshr

7

Я думаю, що у вашому галасливому сигналі я бачу багато одноразових шумових вискоків.

Середній фільтр краще допомагає позбутися одноразових шумових шипів, ніж будь-який лінійний фільтр. (Це краще, ніж будь-який фільтр низьких частот, ковзний середній показник, середньозважена ковзаюча середня величина тощо з точки зору часу його реакції та здатності ігнорувати подібні вибірки шумових вибірок на одному зразку).

Насправді існує багато бібліотек згладжування сигналів для Arduino, багато з яких містять середній фільтр.

бібліотеки згладжування сигналів на arduino.cc:

бібліотеки згладжування сигналу в github:

Чи щось подібне працює у вашого робота? (Середній показник 3 вимагає дуже малої потужності процесора, а значить, і швидкої):

/*
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

Ви спробували фільтр низьких частот? Я знайшов приклад тут ще один тут .

Обидві ці бібліотеки мають перелік даних, що зчитуються з аналогового датчика на ваш вибір, який є усередненим. Кожне нове значення датчика додається до списку, а останнє викидається таким чином:

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

Приблизно те, що робить простий фільтр FIR зі всіма значеннями крана, встановленими на 1. Зміщення зі значеннями кранів може додатково покращити сигнал, але вимагає більш високої математики.
jippie

Примітка: Друга ланка обчислює сукупну ковзну середню, яка не є практичним вибором для управління приводом, особливо та, яка може включати часті пуски та зупинки. Згладжений сигнал завжди буде доволі відставати від пікового значення фактичного сигналу.
asheeshr

2

Ви можете фільтрувати цей цифровий фільтр, використовуючи фільтр низьких частот:

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

Змініть 0,99, щоб змінити частоту відсічення (ближче до 1,0 - нижча частота). Фактичним виразом для цього значення є exp (-2 * pi * f / fs), де f - потрібна частота відсічення, а fs - частота, на яку відбираються дані.

Інший тип "цифрового фільтра" - це фільтр подій. Він добре працює на даних, які мають пережиті люди; наприклад 9,9,8,10,9,25,9. Фільтр подій повертає найчастіше значення. Статистично це режим.

Статистичні середні показники, такі як середнє значення, режим тощо., Можуть бути обчислені за допомогою середньої бібліотеки Arduino .

Приклад, взятий зі сторінки бібліотеки Arduino, посилався на:

#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
Зауважте, що це буде дуже повільно, оскільки це робить безліч неявних кидків, щоб плавати і назад.
Вонор Коннор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.