มีไลบรารีการปรับสัญญาณให้เรียบสำหรับ Arduino หรือไม่?


14

ฉันกำลังทำงานกับหุ่นยนต์มือถือที่ควบคุมผ่านลิงค์ไร้สาย 2.4 GHz ตัวรับสัญญาณเชื่อมต่อกับ Arduino Uno ซึ่งทำหน้าที่เป็นออนบอร์ดเป็นตัวควบคุมหลัก ช่องสัญญาณอินพุตที่สำคัญที่สุด (และหลัก) ที่มาจากเครื่องรับจะสร้างสัญญาณที่มีเสียงดังมากซึ่งนำไปสู่การเปลี่ยนแปลงเล็กน้อยในเอาต์พุตของแอคทูเอเตอร์แม้ว่าจะไม่จำเป็นก็ตาม

ป้อนคำอธิบายรูปภาพที่นี่
                    พล็อตของอินพุตของ Arduino ในช่วงเวลา 30 วินาที

ฉันกำลังมองหาห้องสมุดที่สามารถทำงานได้อย่างราบรื่น มีไลบรารีการปรับสัญญาณให้เรียบสำหรับ Arduino (Uno) หรือไม่?


ไม่ทราบว่าคุณสามารถค้นหาห้องสมุดประเภทนี้ได้หรือไม่ แต่ฉันเกรงว่าสิ่งเหล่านี้อาจต้องใช้พลังงาน CPU มากสำหรับ Arduino ฉันควรเลือกโซลูชันอิเล็กทรอนิกส์ (ตัวกรองสัญญาณความถี่ต่ำ) หากเป็นไปได้
jfpoilpret

ฉันอยู่กับ jfpoilpret เกี่ยวกับเรื่องนี้ ฉันคิดว่าคุณต้องการโซลูชันอิเล็กทรอนิกส์ ฉันจะลองใช้ตัวเก็บประจุความเสถียร (ฟิลเตอร์กรองความถี่ต่ำแบบง่าย) ฉันถือว่าคุณกำลังใช้แชแนล adc ดังนั้นคุณควรใส่ cap จากช่องนี้ลงกราวด์ เริ่มต้นด้วยค่าประมาณ 100pf และทำงานจากที่นั่น
John b

คำตอบ:


8

Microsmoothเป็นไลบรารี่ที่มีสัญญาณปรับขนาดเบาในขณะนี้ซึ่งฉันกำลังพัฒนา

มันยังคงทำงานต่อไปและเป้าหมายก็คือการทำให้มันมีน้ำหนักเบาในแง่ของหน่วยความจำและรวดเร็ว ห้องสมุดมีตัวกรองหลายตัวสำหรับการปรับให้เรียบ:

  • ค่าเฉลี่ยเคลื่อนที่อย่างง่าย
  • ค่าเฉลี่ยเคลื่อนที่ที่อธิบาย
  • ค่าเฉลี่ยเคลื่อนที่สะสม
  • ตัวกรอง Savitzky Golay
  • อัลกอริทึม Ramer Douglas Pecker
  • ตัวกรอง Kalmogorov Zurbenko

หากต้องการใช้ไลบรารีให้ดาวน์โหลดและเพิ่มลงในไดเรกทอรีต้นทาง รวมทั้งเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ต้นฉบับของคุณ:

#include "microsmooth.h"

สวัสดีฉันมีปัญหาในการใช้ห้องสมุดของคุณ คุณจะไม่ใช้ "นำเข้าห้องสมุด ... " เพื่อนำเข้าห้องสมุดของคุณใช่ไหม ฉันพยายามคัดลอกแหล่งที่มาลงในโฟลเดอร์. io ของฉัน แต่ฉันได้รับข้อผิดพลาดเกี่ยวกับการหายไปของ automicrosmooth.h, อนุกรมไม่ได้ถูกกำหนดและหายไป ';' ห้องสมุดนี้ยังทำงานอยู่หรือไม่? ขอบคุณ
waspinator

@waspinator ขออภัยด้วย แก้ไขข้อผิดพลาด ขอบคุณสำหรับความคิดเห็น!
asheeshr

7

ฉันคิดว่าฉันเห็นหนามแหลมเสียงตัวอย่างจำนวนมากในสัญญาณรบกวนของคุณ

มัธยฐานฟิลเตอร์ทำได้ดีกว่าในการกำจัดเสียงแหลมตัวอย่างเดียวมากกว่าตัวกรองเชิงเส้นใด ๆ (ดีกว่าฟิลเตอร์กรองความถี่ต่ำ, ค่าเฉลี่ยเคลื่อนที่, ค่าเฉลี่ยเคลื่อนที่แบบถ่วงน้ำหนัก ฯลฯ ในแง่ของเวลาตอบสนองและความสามารถในการเพิกเฉยต่อเสียงรบกวนตัวอย่างเดียว)

ในความเป็นจริงมีไลบรารีที่ปรับสัญญาณได้หลายแบบสำหรับ Arduino ซึ่งส่วนใหญ่จะมีตัวกรองแบบมัธยฐาน

ไลบรารี่สัญญาณที่ arduino.cc:

ไลบรารี่สัญญาณที่ github:

หุ่นยนต์ของคุณใช้งานสิ่งนี้ได้ไหม (ค่ามัธยฐานของ 3 นั้นใช้พลังงาน 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

ค่อนข้างดีสิ่งที่ตัวกรอง FIRธรรมดาทำได้ด้วยค่าการแตะทั้งหมดที่ตั้งค่าไว้ที่ 1 การเล่นกับค่าก๊อกสามารถปรับปรุงสัญญาณเพิ่มเติมได้ แต่ต้องใช้คณิตศาสตร์ที่สูงขึ้น
jippie

หมายเหตุ: ลิงค์ที่สองคำนวณค่าเฉลี่ยเคลื่อนที่สะสมซึ่งไม่ใช่ตัวเลือกที่ใช้งานได้จริงสำหรับการควบคุมแอคทูเอเตอร์โดยเฉพาะลิงค์ที่อาจเกี่ยวข้องกับการเริ่มและหยุดบ่อย สัญญาณที่ราบเรียบจะติดตามค่าสูงสุดของสัญญาณจริงตามระยะขอบ
asheeshr

2

คุณสามารถกรองสิ่งนี้ด้วยระบบดิจิตอลโดยใช้ตัวกรองผ่านความถี่ต่ำ:

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

เปลี่ยน 0.99 เพื่อเปลี่ยนความถี่ตัด (ใกล้ถึง 1.0 คือความถี่ต่ำกว่า) การแสดงออกที่แท้จริงสำหรับค่านั้นคือ exp (-2 * pi * f / fs) โดยที่ f คือความถี่ cutoff ที่คุณต้องการและ fs คือความถี่ที่ข้อมูลถูกสุ่มตัวอย่างที่

"ตัวกรองดิจิทัล" ประเภทอื่นคือตัวกรองเหตุการณ์ มันทำงานได้ดีกับข้อมูลที่มีค่าผิดปกติ เช่น 9,9,8,10,9,25,9 ตัวกรองเหตุการณ์คืนค่าบ่อยที่สุด สถิตินี้เป็นโหมด

ค่าเฉลี่ยทางสถิติเช่นค่าเฉลี่ยโหมด ฯลฯ .. สามารถคำนวณได้โดยใช้ห้องสมุดเฉลี่ย Arduino

ตัวอย่างที่นำมาจากหน้า 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
โปรดทราบว่าสิ่งนี้จะช้ามากเนื่องจากมีการปลดเปลื้องจำนวนมากเพื่อลอยและย้อนกลับ
Connor Wolf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.