Đôi khi những gì trông đơn giản không phải là đơn giản. Bạn có một phép đo khá phức tạp để làm, nhưng bạn muốn một kết quả đơn giản. Những gì bạn muốn đo không phải là hằng số, nó thay đổi theo thời gian. Tùy thuộc vào mức độ yêu cầu của bạn, bạn có thể tính toán một hoặc nhiều thuộc tính của mức tiêu thụ hiện tại. Những tính chất này sẽ giúp bạn giám sát hệ thống tốt hơn. Tôi đề xuất cho bạn 3 giải pháp khác nhau, với độ phức tạp tăng dần.
Giải pháp 1: Trung bình
Bạn muốn nhận được kết quả một giá trị -> lấy trung bình trong thời gian. Như đã được đề xuất bởi @akellyirl, hãy sử dụng bộ lọc thông thấp. Tính toán float y = alpha*input + (1-alpha)*y
cho từng mẫu, đâu alpha
là yếu tố làm mịn. Xem Wikipedia để biết chi tiết.
Giải pháp 2: Tối đa + Trung bình
Bạn rất thú vị trong việc lấy giá trị trung bình và giá trị tối đa. Theo dõi giá trị tối đa có thể thú vị cho kích thước thành phần chẳng hạn.
if (y > max)
max = y;
Giải pháp 3: Độ lệch chuẩn + Tối đa + Trung bình
Tại sao?
Xem biểu đồ dưới đây. Có 3 tín hiệu có hình dạng khác nhau. Một hình tam giác , một hình sin và tín hiệu tăng đột biến . Họ đều là những kỳ với cùng kỳ, cùng biên độ , cùng trung bình , và cùng một phút và tối đa . Nhưng, chúng có hình dạng khác nhau, và thực sự chúng có một câu chuyện hoàn toàn khác ...
Một trong những khác biệt là độ lệch chuẩn. Đó là lý do tại sao tôi khuyên bạn nên mở rộng số đo của mình và bao gồm độ lệch chuẩn. Vấn đề là cách tiêu chuẩn để tính toán nó là tiêu thụ CPU. Hy vọng, có một giải pháp.
Làm sao?
Sử dụng phương pháp biểu đồ . Xây dựng biểu đồ của tất cả các phép đo và trích xuất hiệu quả các số liệu thống kê (min, max, avg, độ lệch chuẩn) của tập dữ liệu. Các nhóm biểu đồ giá trị với nhau có cùng giá trị hoặc cùng một phạm vi giá trị. Ưu điểm là tránh lưu trữ tất cả các mẫu (tăng số lượng theo thời gian) và để tính toán nhanh trên một số lượng dữ liệu hạn chế.
Trước khi bắt đầu lấy số đo, hãy tạo một mảng để lưu trữ biểu đồ. Đó là mảng số nguyên 1 chiều, có kích thước 32 chẳng hạn:
int histo[32];
Tùy thuộc vào phạm vi của ampe kế, thích ứng dưới chức năng. Ví dụ: nếu phạm vi là 256mA, điều đó có nghĩa là bin 0 của biểu đồ sẽ được tăng theo giá trị từ 0 đến 8 mA, bin 1 theo giá trị trong khoảng từ 8 đến 16 mA, v.v ... Vì vậy, bạn sẽ cần một số nguyên để biểu diễn số thùng biểu đồ:
short int index;
Mỗi lần bạn lấy một mẫu, hãy tìm chỉ số bin tương ứng:
index = (short int) floor(yi);
Và tăng thùng này:
histo[index] += 1;
Để tính giá trị trung bình, hãy chạy vòng lặp này:
float mean = 0;
int N = 0;
for (i=0; i < 32 ; i++) {
mean = i * histo[i]; // sum along the histogram
N += i; // count of samples
}
mean /= N; // divide the sum by the count of samples.
mean *= 8; // multiply by the bin width, in mA: Range of 256 mA / 32 bins = 8 mA per bin.
Để tính độ lệch chuẩn, hãy chạy vòng lặp này:
float std_dev = 0;
for (i=0; i < 32 ; i++) {
std_dev = (i - mean) * (i - mean) * histo[i]; // sum along the histogram
}
std_dev /= N; // divide the sum by the count of samples.
std_dev = sqrt(std_dev); // get the root mean square to finally convert the variance to standard deviation.
Chiến lược của phương pháp biểu đồ là làm cho các hoạt động chậm trên một số thùng, thay vì tất cả các mẫu tín hiệu thu được. Kích thước mẫu càng dài thì càng tốt. Nếu bạn muốn biết thêm chi tiết, hãy đọc trang thú vị này Biểu đồ, Pmf và Pdf .