บางครั้งสิ่งที่ดูเรียบง่ายนั้นไม่ง่ายเลย คุณมีการวัดที่ค่อนข้างซับซ้อน แต่คุณต้องการผลลัพธ์ที่ง่าย สิ่งที่คุณต้องการวัดนั้นไม่คงที่มันเปลี่ยนแปลงไปตามกาลเวลา คุณสามารถคำนวณคุณสมบัติหนึ่งอย่างหรือหลายอย่างของปริมาณการใช้ปัจจุบันขึ้นอยู่กับระดับความต้องการของคุณ คุณสมบัติเหล่านี้จะช่วยให้คุณตรวจสอบระบบได้ดีขึ้น ฉันเสนอวิธีแก้ปัญหาต่าง ๆ ให้คุณ 3 ข้อโดยเพิ่มความซับซ้อน
โซลูชันที่ 1: ค่าเฉลี่ย
คุณต้องการได้ผลลัพธ์หนึ่งค่า -> รับเวลาโดยเฉลี่ย ตามที่เสนอโดย @akellyirl ให้ใช้ตัวกรอง low-pass คำนวณfloat y = alpha*input + (1-alpha)*y
สำหรับแต่ละตัวอย่างซึ่งalpha
เป็นปัจจัยที่ทำให้เรียบ ดูWikipediaสำหรับรายละเอียด
โซลูชันที่ 2: สูงสุด + ค่าเฉลี่ย
คุณน่าสนใจในการรับค่าเฉลี่ยและค่าสูงสุด การตรวจสอบค่าสูงสุดอาจน่าสนใจสำหรับการกำหนดขนาดส่วนประกอบเช่น
if (y > max)
max = y;
โซลูชันที่ 3: ส่วนเบี่ยงเบนมาตรฐาน + สูงสุด + ค่าเฉลี่ย
ทำไม?
ดูแผนภูมิด้านล่าง มีสัญญาณ 3 แบบที่แตกต่างกัน สามเหลี่ยมเป็นไซน์และขัดขวางสัญญาณ พวกมันทั้งหมดเป็นคาบที่มีช่วงเวลาเดียวกัน, แอมพลิจูดเดียวกัน, ค่าเฉลี่ยเดียวกัน, และminและmaxเดียวกัน แต่พวกเขามีรูปร่างที่แตกต่างกันและแน่นอนพวกเขามีเรื่องราวที่แตกต่างอย่างสิ้นเชิง ...
หนึ่งในความแตกต่างคือส่วนเบี่ยงเบนมาตรฐาน นั่นเป็นเหตุผลที่ฉันแนะนำให้คุณขยายการวัดของคุณและรวมถึงค่าเบี่ยงเบนมาตรฐาน ปัญหาคือว่าวิธีการมาตรฐานในการคำนวณนั้นเป็นการใช้งาน CPU หวังว่าจะมีทางออกหนึ่งทาง
อย่างไร?
ใช้วิธีฮิสโตแกรม สร้างฮิสโตแกรมของการวัดทั้งหมดและแยกสถิติ (min, max, avg, เบี่ยงเบนมาตรฐาน) ของชุดข้อมูลได้อย่างมีประสิทธิภาพ กลุ่มฮิสโทแกรมจะรวมค่าที่มีค่าเท่ากันหรือช่วงของค่าเดียวกัน ข้อได้เปรียบคือการหลีกเลี่ยงการเก็บตัวอย่างทั้งหมด (เพิ่มจำนวนเวลา) และมีการคำนวณที่รวดเร็วในจำนวนข้อมูลที่ จำกัด
ก่อนเริ่มการวัดให้สร้างอาร์เรย์เพื่อเก็บฮิสโตแกรม มันเป็นอาร์เรย์จำนวนเต็ม 1 มิติขนาด 32ตัวอย่างเช่น:
int histo[32];
ปรับฟังก์ชั่นด้านล่างขึ้นอยู่กับช่วงของแอมมิเตอร์ ตัวอย่างเช่นถ้าช่วงเป็น 256mA ก็หมายความว่า bin 0 ของฮิสโตแกรมจะเพิ่มขึ้นตามค่าระหว่าง 0 และ 8 mA, bin 1 โดยค่าระหว่าง 8 ถึง 16 mA ฯลฯ ... ดังนั้นคุณจะต้องมีจำนวนเต็มแทน หมายเลขถังฮิสโทแกรม:
short int index;
ทุกครั้งที่คุณรับตัวอย่างให้ค้นหาดัชนีถังที่เกี่ยวข้อง:
index = (short int) floor(yi);
และเพิ่มช่องเก็บนี้:
histo[index] += 1;
ในการคำนวณค่าเฉลี่ยให้รันลูปนี้:
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.
ในการคำนวณค่าเบี่ยงเบนมาตรฐานให้เรียกใช้ลูปนี้:
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.
กลยุทธ์ของวิธีฮิสโตแกรมคือการทำให้การทำงานช้าลงในถังขยะจำนวนน้อยแทนที่จะเป็นตัวอย่างสัญญาณที่ได้มาทั้งหมด ยิ่งขนาดตัวอย่างยาวเท่าไรก็ยิ่งดีเท่านั้น หากคุณต้องการรายละเอียดเพิ่มเติมโปรดอ่านหน้านี้ที่น่าสนใจHistogram, PMF และ PDF