Có bất kỳ thư viện làm mịn tín hiệu cho Arduino?


14

Tôi đang làm việc trên một robot di động được điều khiển thông qua liên kết 2,4 GHz không dây. Bộ thu được kết nối với Arduino Uno phục vụ trên bo mạch làm bộ điều khiển chính. Kênh đầu vào quan trọng nhất (và chính) đến từ máy thu tạo ra tín hiệu rất nhiễu, dẫn đến nhiều thay đổi nhỏ trong đầu ra của bộ truyền động, mặc dù không cần thiết.

nhập mô tả hình ảnh ở đây
                    Âm mưu đầu vào của Arduino trong khoảng thời gian 30 giây.

Tôi đang tìm kiếm các thư viện có thể thực hiện làm mịn hiệu quả. Có thư viện làm mịn tín hiệu nào có sẵn cho Arduino (Uno) không?


Không biết bạn có thể tìm thấy loại thư viện này không nhưng tôi e rằng chúng có thể cần nhiều năng lượng CPU cho Arduino. Tôi muốn đi với một giải pháp điện tử (bộ lọc thông thấp) nếu có thể.
jfpoilpret

Tôi với jfpoilpret về điều này. Tôi nghĩ bạn cần một giải pháp điện tử. Tôi sẽ thử một tụ điện ổn định, (bộ lọc thông thấp đơn giản). Tôi giả sử bạn đang sử dụng kênh adc, vì vậy bạn nên đặt giới hạn từ kênh này xuống đất. Bắt đầu với các giá trị khoảng 100pf và làm việc từ đó.
John b

Câu trả lời:


8

Microsmooth là một thư viện làm mịn tín hiệu ligh weight hiện đang được phát triển bởi tôi.

Nó vẫn đang được làm việc và mục đích là làm cho nó nhẹ về bộ nhớ và nhanh. Thư viện cung cấp nhiều bộ lọc để làm mịn:

  • Trung bình di chuyển đơn giản
  • Trung bình di chuyển theo cấp số nhân
  • Trung bình di chuyển tích lũy
  • Bộ lọc Golay Savitzky
  • Thuật toán Ramer Douglas Pecker
  • Bộ lọc Kalmogorov Zurbenko

Để sử dụng thư viện, tải xuống và thêm nó vào thư mục nguồn. Ngoài ra, thêm dòng sau vào tệp nguồn của bạn:

#include "microsmooth.h"

Xin chào, tôi đang gặp sự cố khi sử dụng thư viện của bạn. Bạn sẽ không sử dụng "Nhập thư viện ..." để nhập thư viện của mình phải không? Tôi đã cố gắng chỉ sao chép nguồn vào thư mục .ino của mình, nhưng tôi gặp lỗi về việc thiếu automicrosmooth.h, Nối tiếp không được xác định và thiếu ';'. Thư viện này có còn hoạt động không? Cảm ơn
waspinator

@waspinator Xin lỗi về điều đó. Đã sửa lỗi. Cảm ơn vì bạn đã phản hồi!
asheeshr

7

Tôi nghĩ rằng tôi thấy rất nhiều nhiễu nhiễu mẫu đơn trong tín hiệu nhiễu của bạn.

Bộ lọc trung vị giúp loại bỏ các nhiễu nhiễu mẫu đơn tốt hơn bất kỳ bộ lọc tuyến tính nào. (Nó tốt hơn bất kỳ bộ lọc thông thấp nào, trung bình di chuyển, trung bình di chuyển có trọng số, v.v. về thời gian đáp ứng và khả năng bỏ qua các ngoại lệ nhiễu đơn mẫu như vậy).

Trên thực tế, có nhiều thư viện làm mịn tín hiệu cho Arduino, nhiều thư viện bao gồm bộ lọc trung vị.

thư viện làm mịn tín hiệu tại arduino.cc:

thư viện làm mịn tín hiệu tại github:

Một cái gì đó như thế này sẽ làm việc trong robot của bạn? (Trung vị của 3 yêu cầu rất ít năng lượng CPU và do đó nhanh):

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

Bạn đã thử một bộ lọc thông thấp? Tôi tìm thấy một ví dụ ở đây một cái khác ở đây .

Cả hai thư viện này đều có một danh sách dữ liệu được đọc từ cảm biến tương tự bạn chọn, tính trung bình. Mỗi giá trị cảm biến mới được thêm vào danh sách và giá trị cuối cùng được loại bỏ, như sau:

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

Khá nhiều thứ mà bộ lọc FIR đơn giản thực hiện với tất cả các giá trị nhấn được đặt thành 1. Việc thay đổi các giá trị vòi có thể cải thiện tín hiệu hơn nữa, nhưng đòi hỏi toán học cao hơn.
jippie

Lưu ý: Liên kết thứ hai tính toán trung bình di chuyển tích lũy không phải là lựa chọn thực tế cho điều khiển bộ truyền động, đặc biệt là liên kết có thể liên quan đến khởi động và dừng thường xuyên. Tín hiệu được làm mịn sẽ luôn theo dõi giá trị cực đại của tín hiệu thực tế bằng một lề khá.
asheeshr

2

Bạn có thể lọc kỹ thuật số này bằng bộ lọc thông thấp:

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

Thay đổi 0,99 để thay đổi tần số cắt (gần với 1.0 là tần số thấp hơn). Biểu thức thực tế cho giá trị đó là exp (-2 * pi * f / fs) trong đó f là tần số cắt bạn muốn và fs là tần số mà dữ liệu được lấy mẫu tại.

Một loại "bộ lọc kỹ thuật số" khác là bộ lọc sự kiện. Nó hoạt động tốt trên dữ liệu có các ngoại lệ; ví dụ: 9,9,8,10,9,25,9. Một bộ lọc sự kiện trả về giá trị thường xuyên nhất. Theo thống kê đây là chế độ.

Các trung bình thống kê như Trung bình, Chế độ, v.v. có thể được tính bằng Thư viện trung bình Arduino .

Một ví dụ được lấy từ trang Thư viện Arduino được đề cập đến:

#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
Lưu ý rằng điều này sẽ rất chậm, vì nó đang thực hiện rất nhiều diễn biến ngầm để nổi và quay lại.
Sói Connor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.