Существуют ли библиотеки сглаживания сигналов для Arduino?

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

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

Я ищу библиотеки, которые могут выполнять эффективное сглаживание. Существуют ли библиотеки сглаживания сигналов для Arduino (Uno)?

13 голосов | спросил asheeshr 16 FebruaryEurope/MoscowbSun, 16 Feb 2014 17:57:37 +0400000000pmSun, 16 Feb 2014 17:57:37 +040014 2014, 17:57:37

4 ответа


8

Microsmooth - это библиотека сглаживания среднего веса, которая в настоящее время разрабатывается мной.

Он все еще работает, и цель состоит в том, чтобы сделать его легким с точки зрения памяти и быстро. Библиотека предоставляет несколько фильтров для сглаживания:

  • Простая скользящая средняя
  • Экспоненциальное скользящее среднее
  • Накопительное скользящее среднее
  • Фильтр Savitzky Golay
  • Алгоритм Рамера Дугласа Пеккера
  • Калмогоров Зурбенко Фильтр

Чтобы использовать библиотеку, загрузите и добавьте ее в исходный каталог. Кроме того, добавьте следующую строку в исходный файл:

#include "microsmooth.h"
ответил asheeshr 7 MarpmFri, 07 Mar 2014 18:14:23 +04002014-03-07T18:14:23+04:0006 2014, 18:14:23
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);
}
ответил David Cary 26 MarpmWed, 26 Mar 2014 21:37:55 +04002014-03-26T21:37:55+04:0009 2014, 21:37:55
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
ответил TheDoctor 16 FebruaryEurope/MoscowbSun, 16 Feb 2014 18:45:56 +0400000000pmSun, 16 Feb 2014 18:45:56 +040014 2014, 18:45:56
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 .

Пример, взятый на странице библиотеки Ардуино:

#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 16 FebruaryEurope/MoscowbSun, 16 Feb 2014 20:34:31 +0400000000pmSun, 16 Feb 2014 20:34:31 +040014 2014, 20:34:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132