Bazen basit görünen şey o kadar basit değildir. Yapmanız gereken oldukça karmaşık bir ölçümünüz var, ancak basit bir sonuç istiyorsunuz. Ölçmek istediğiniz şey sabit değil, zaman içinde değişiyor. Gereksinim seviyenize bağlı olarak, mevcut tüketimin bir veya daha fazla özelliğini hesaplayabilirsiniz. Bu özellikler sistemi daha iyi izlemenize yardımcı olur. Size artan karmaşıklıkta 3 farklı çözüm öneriyorum.
Çözüm 1: Ortalama
Tek değerli bir sonuç elde etmek istiyorsunuz -> zaman içinde ortalamayı alın. @Akellyirl tarafından önerildiği gibi, düşük geçişli bir filtre kullanın. Düzeltme faktörü float y = alpha*input + (1-alpha)*y
nerede her örnek için hesaplayın alpha
. Ayrıntılar için Wikipedia'ya bakın.
Çözüm 2: Maks + Ortalama
Ortalamayı ve maksimum değeri almak ilginç. Maksimum değerin izlenmesi, örneğin bileşen boyutlandırması için ilginç olabilir.
if (y > max)
max = y;
Çözüm 3: Standart sapma + Maks + Ortalama
Neden?
Aşağıdaki tablolara bakınız. Farklı şekillerde 3 sinyal vardır. Bir üçgen , bir sinüs ve başak sinyali. Hepsi periyodik olarak aynı periyot, aynı genlik , aynı ortalama ve aynı min ve maks . Ancak, farklı şekillere sahipler ve gerçekten de tamamen farklı bir hikayeleri var ...
Farklardan biri standart sapmadır. Bu yüzden ölçümlerinizi uzatmanızı ve standart sapmayı eklemenizi öneririm. Sorun, hesaplamanın standart yolunun CPU tüketmesidir. Umarım, tek bir çözüm vardır.
Nasıl?
Histogram yöntemini kullanın . Tüm ölçümlerin bir histogramını oluşturun ve veri kümesinin istatistiklerini (min, maks, ort, standart sapma) verimli bir şekilde çıkarın. Histogram, aynı değere veya aynı değer aralığına sahip değerleri birlikte gruplandırır. Avantajı, tüm örneklerin saklanmasını önlemek (zaman içinde artan sayı) ve sınırlı sayıda veri üzerinde hızlı bir hesaplama yapmaktır.
Ölçüm almaya başlamadan önce, histogramı saklamak için bir dizi oluşturun. 32 boyutlu 1 boyutlu bir tamsayı dizisidir, örneğin:
int histo[32];
Ampermetre aralığına bağlı olarak, aşağıdaki fonksiyona uyarlayın. Örneğin, aralık 256mA ise, histogramın 0 bölmesinin 0 ile 8 mA arasında, bin 1'in 8 ila 16 mA arasında bir değere göre artırılacağı anlamına gelir ... Yani, temsil etmek için bir tamsayıya ihtiyacınız olacaktır. histogram bölmesi numarası:
short int index;
Her örnek aldığınızda ilgili çöp kutusu dizinini bulun:
index = (short int) floor(yi);
Ve bu kutuyu artırın:
histo[index] += 1;
Ortalamayı hesaplamak için şu döngüyü çalıştırın:
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.
Standart sapmayı hesaplamak için şu döngüyü çalıştırın:
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 yönteminin stratejisi, elde edilen tüm sinyal örnekleri yerine, birkaç sayıda kutu üzerinde yavaş işlemler yapmaktır. Numune boyutu ne kadar uzun olursa o kadar iyidir. Daha fazla ayrıntı istiyorsanız, bu ilginç sayfayı okuyun Histogram, Pmf ve Pdf .