Czasami to, co wygląda prosto, nie jest takie proste. Masz dość skomplikowany pomiar, ale potrzebujesz prostego wyniku. To, co chcesz zmierzyć, nie jest stałe, zmienia się w czasie. W zależności od poziomu wymagań można obliczyć jedną lub wiele właściwości bieżącego zużycia. Te właściwości pomogą ci lepiej monitorować system. Proponuję ci 3 różne rozwiązania w rosnącej złożoności.
Rozwiązanie 1: Średnia
Chcesz uzyskać wynik jednej wartości -> uzyskać średnią w czasie. Jak już zaproponował @akellyirl, użyj filtra dolnoprzepustowego. Oblicz float y = alpha*input + (1-alpha)*y
dla każdej próbki, gdzie alpha
jest współczynnik wygładzania. Szczegóły w Wikipedii .
Rozwiązanie 2: Maks. + Średnia
Jesteś ciekawy w uzyskaniu średniej i wartości maksymalnej. Monitorowanie wartości maksymalnej może być interesujące na przykład dla wymiarowania komponentu.
if (y > max)
max = y;
Rozwiązanie 3: Odchylenie standardowe + maks. + Średnia
Dlaczego?
Zobacz poniższe wykresy. Istnieją 3 sygnały o różnych kształtach. Trójkąt , A sinus i skok sygnału. Wszystkie są okresowe z tym samym okresem, tą samą amplitudą , tą samą średnią i tymi samymi wartościami minimalnymi i maksymalnymi . Ale mają różne kształty i rzeczywiście mają zupełnie inną historię ...
Jedną z różnic jest odchylenie standardowe. Dlatego proponuję rozszerzyć swoje pomiary i uwzględnić odchylenie standardowe. Problem polega na tym, że standardowy sposób jego obliczania zajmuje procesor. Mamy nadzieję, że jest jedno rozwiązanie.
W jaki sposób?
Użyj metody histogramu . Zbuduj histogram wszystkich pomiarów i wydajnie wyodrębnij statystyki (min., Maks., Śr., Odchylenie standardowe) zestawu danych. Histogram grupuje wartości, które mają tę samą wartość lub zakres wartości. Zaletą jest uniknięcie przechowywania wszystkich próbek (zwiększenie liczby w czasie) i szybkie obliczenia na ograniczonej liczbie danych.
Przed rozpoczęciem pobierania pomiarów utwórz tablicę do przechowywania histogramu. Jest to jednowymiarowa tablica liczb całkowitych o rozmiarze 32, na przykład:
int histo[32];
W zależności od zakresu amperomierza, dostosuj poniżej funkcji. Na przykład, jeśli zakres wynosi 256 mA, oznacza to, że przedział 0 histogramu zostanie zwiększony o wartość między 0 a 8 mA, przedział 1 o wartość między 8 a 16 mA itd. Tak więc, aby reprezentować, potrzebujesz liczby całkowitej numer pojemnika histogramu:
short int index;
Za każdym razem, gdy otrzymasz próbkę, znajdź odpowiedni indeks bin:
index = (short int) floor(yi);
I zwiększ ten kosz:
histo[index] += 1;
Aby obliczyć średnią, uruchom następującą pętlę:
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.
Aby obliczyć odchylenie standardowe, uruchom następującą pętlę:
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.
Strategia metody histogramu polega na wykonywaniu powolnych operacji na kilku przedziałach, zamiast na wszystkich zebranych próbkach sygnału. Im dłuższy rozmiar próbki, tym lepiej. Jeśli chcesz uzyskać więcej informacji, przeczytaj tę interesującą stronę Histogram, Pmf i Pdf .