Arduino를위한 신호 평활 라이브러리가 있습니까?


14

무선 2.4GHz 링크를 통해 제어되는 모바일 로봇에서 작업 중입니다. 수신기는 메인 컨트롤러 역할을하는 Arduino Uno에 연결되어 있습니다. 수신기에서 나오는 가장 중요한 (및 주) 입력 채널은 잡음이 매우 많은 신호를 생성하므로, 필요하지 않더라도 액츄에이터의 출력이 많이 변경됩니다.

여기에 이미지 설명을 입력하십시오
                    30 초 간격으로 Arduino 입력 플롯.

효율적인 스무딩을 수행 할 수있는 라이브러리를 찾고 있습니다. Arduino (Uno)에 사용할 수있는 신호 평활 라이브러리가 있습니까?


이런 종류의 라이브러리를 찾을 수 있는지 모르겠지만 Arduino의 CPU 성능이 많이 필요할 수도 있습니다. 가능하다면 전자 솔루션 (로우 패스 필터)을 사용하고 싶습니다.
jfpoilpret

나는 이것에 jfpoilpret와 함께 있습니다. 전자 솔루션이 필요하다고 생각합니다. 안정화 커패시터 (간단한 저역 통과 필터)를 사용해보십시오. 나는 당신이 adc 채널을 사용하고 있다고 가정 하므로이 채널에서 접지로 캡을 넣어야합니다. 약 100pf의 값으로 시작하여 거기서부터 작업하십시오.
John b

답변:


8

Microsmooth 는 현재 저에 의해 개발중인 lighweight 신호 평활 라이브러리입니다.

그것은 여전히 ​​연구 중이며 목표는 메모리와 빠른 측면에서 경량화하는 것입니다. 라이브러리는 스무딩을위한 여러 필터를 제공합니다.

  • 단순 이동 평균
  • 지수 이동 평균
  • 누적 이동 평균
  • 사 비츠 키 골 레이 필터
  • 라머 더글러스 페커 알고리즘
  • 칼 모고 로프 주르 벤코 필터

라이브러리를 사용하려면 라이브러리를 다운로드하여 소스 디렉토리에 추가하십시오. 또한 소스 파일에 다음 행을 추가하십시오.

#include "microsmooth.h"

안녕하세요, 도서관 이용에 문제가 있습니다. 라이브러리 가져 오기에 "라이브러리 가져 오기 ..."를 사용하지 않습니까? 소스를 내 .ino 폴더로 복사하려고 시도했지만 automicrosmooth.h 누락, Serial이 정의되지 않았으며 ';'이 누락되었다는 오류가 발생합니다. 이 라이브러리가 여전히 작동합니까? 감사
waspinator

@waspinator 죄송합니다. 오류를 수정했습니다. 피드백을 주셔서 감사합니다!
asheeshr

7

잡음이 많은 신호에 많은 단일 샘플 노이즈 스파이크가 있다고 생각합니다.

중앙값 필터는 선형 필터보다 단일 샘플 노이즈 스파이크를 제거하는 데 더 좋습니다. (응답 시간 및 단일 샘플 노이즈 스파이크 이상 값을 무시하는 기능 측면에서 저역 통과 필터, 이동 평균, 가중 이동 평균 등이 좋습니다.)

실제로 Arduino에는 많은 신호 평활 라이브러리가 있으며 그 중 다수에는 중간 필터가 포함되어 있습니다.

arduino.cc의 신호 평활 라이브러리 :

github의 신호 평활 라이브러리 :

로봇에서 이와 같은 것이 작동합니까? (중앙값의 중앙값은 CPU 전력이 거의 필요하지 않으므로 빠릅니다) :

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

모든 탭 값을 1로 설정 한 상태에서 간단한 FIR 필터의 기능 은 거의 같습니다. 탭 값을 조정하면 신호를 더 향상시킬 수 있지만 더 높은 연산이 필요합니다.
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 Average Library를 사용하여 계산할 수 있습니다 .

Arduino Library 페이지에서 가져온 예제는 다음과 같습니다.

#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
플로팅 및 다시 많은 암시 적 캐스트를 수행하기 때문에 이것은 매우 느릴 것입니다.
코너 울프
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.