単純に見えるのはそれほど単純ではない場合があります。非常に複雑な測定が必要ですが、単純な結果が必要です。測定するものは一定ではなく、時間によって異なります。要件のレベルに応じて、現在の消費の1つまたは複数のプロパティを計算できます。これらのプロパティは、システムをより適切に監視するのに役立ちます。複雑さの昇順で、3つの異なるソリューションを提案します。
解決策1:平均
1つの値の結果を取得したい->時間の平均を取得します。@akellyirlが既に提案したように、ローパスフィルターを使用します。float y = alpha*input + (1-alpha)*y
各サンプルについて計算します。ここalpha
で、は平滑化係数です。詳細については、ウィキペディアを参照してください。
解決策2:最大+平均
平均値と最大値を取得することに興味があります。最大値を監視することは、たとえばコンポーネントの寸法決定にとって興味深い場合があります。
if (y > max)
max = y;
解決策3:標準偏差+最大+平均
どうして?
以下のチャートを参照してください。形状の異なる3つの信号があります。三角形、正弦波、およびスパイク信号。それらはすべて同じ周期、同じ振幅、同じ平均で周期的です、同じminおよびmaxでです。しかし、それらはさまざまな形をしており、実際、まったく異なる物語を持っています...
違いの1つは標準偏差です。そのため、測定値を拡張し、標準偏差を含めることをお勧めします。問題は、それを計算する標準的な方法がCPUを消費することです。うまくいけば、1つの解決策があります。
どうやって?
ヒストグラム法を使用します。すべての測定値のヒストグラムを作成し、データセットの統計(最小、最大、平均、標準偏差)を効率的に抽出します。ヒストグラムは、同じ値または同じ値の範囲を持つ値をグループ化します。利点は、すべてのサンプルを保存することを避け(時間のカウントを増やす)、限られた数のデータで高速に計算できることです。
測定値の取得を開始する前に、ヒストグラムを保存する配列を作成します。これは、たとえばサイズ32の 1次元整数配列です。
int histo[32];
電流計の範囲に応じて、以下の機能を調整します。たとえば、範囲が256mAの場合、ヒストグラムのビン0は0〜8 mAの値で増加し、ビン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.
ヒストグラム法の戦略は、取得したすべての信号サンプルの代わりに、少数のビンで低速操作を行うことです。サンプルサイズが長いほど良い。詳細については、この興味深いページThe Histogram、Pmf and Pdfをご覧ください。