Policzenie ilości zer lub jedynek w rejestrze

0

Posiadam urządzenie pomiarowe (podłączone do Maliny) które na wyjściu generuje ciąg zer i jedynek. Nie wnikając w istotę samej mierzonej wartości, Malina odczytuje stan wejścia 1 tys razy na sekundę. Pomiar polega na tym że co sekundę muszę policzyć ilość zer które wystąpiły w ciągu ostatnich 30 sekund. Stąd mam ciąg 30 tys bitów w którym co sekundę muszę policzyć ilość zer.
Ponieważ oczywiście karta SD nie zdzierży czegoś takiego, utworzyłem ramdisk (64 Mb) gdzie dane mogą być zapisywane z dużą prędkością bez wpisywania czegokolwiek dna SD.
Mam prośbę do Kolegów o radę. Chciałbym napisać program w Pythonie który policzy te zera, tylko kompletnie nie mam pomysłu na algorytm który by to obsłużył a Python by to "łynkął". Wydaje się że trzeba by utworzyć jakiś softwareowy rejestr przesuwający o długości 30 tys bitów i co sekundę liczyć ilość zer w tym rejestrze.
Czy Koledzy mają pomysł na coś takiego?

0

Zrobiłem Ci program, który robi to co chcesz. Działa na tej zasadzie, że przechowuje listę:

[(ilośćSekunda1,sumaSekunda1),(ilośćSekunda2,sumaSekunda2),...,(ilośćSekunda30,sumaSekunda30)]

przy czym u mnie losuję wartości gdyż nie mam żadnego narzędzia do pomiaru
Gdy lista będzie miała więcej lub dokładnie 30 elemetnów to sumuję całą listę co do ilości i sum. Od ilości odejmuję sumę i mam ilość zer z ostatnich 30 sekund.
Następnie usuwam tylko pierwszy pomiar (czyli wszystkie z pierwszej sekundy) i tak mam ilość zer z kolejnych 30 sekund. Tak bez końca

[(ilośćSekunda1,sumaSekunda1),(ilośćSekunda2,sumaSekunda2),...,(ilośćSekunda30,sumaSekunda30)] -> Ilość zer z sekund 1-30
[(ilośćSekunda2,sumaSekunda2),(ilośćSekunda3,sumaSekunda3),...,(ilośćSekunda31,sumaSekunda31)] -> Ilość zer z sekund 2-31
[(ilośćSekunda3,sumaSekunda3),(ilośćSekunda4,sumaSekunda4),...,(ilośćSekunda32,sumaSekunda32)] -> Ilość zer z sekund 3-32

...

Kod:

from random import randint
from time import time

glownaListaProgramu = []

czas = time() # to do generatora bo nie pobieram z nikąd informacji tylko sobie losuję co 1/1000 sekundy
czas_sekunda = time()
suma = 0
ilosc = 0
while True:
    teraz = time()

    if len(glownaListaProgramu) >= 30: #Suma z każdych ostatnich 30 sekund
        sumaIlosciOstatnie30Sekund, sumaWartosciOstatnie30Sekund = [sum(i) for i in zip(*glownaListaProgramu)]
        iloscZerOstatnie30Sekund = sumaIlosciOstatnie30Sekund - sumaWartosciOstatnie30Sekund
        print(iloscZerOstatnie30Sekund)
        del glownaListaProgramu[0]


    if teraz - czas_sekunda > 1: #operacje wykonywane co sekundę - zapisuję nową tuplę (wypadkową z ostatniej sekundy) do listy
        glownaListaProgramu.append((ilosc,suma))
        czas_sekunda = teraz
        suma = 0
        ilosc = 0
        print(glownaListaProgramu) #zakomentuj tę linijkę jak nie chcesz widzieć tylu outputów co do listy dwuwymiarowej
        continue

    if 1000 * (teraz - czas) > 1: #generator wartości (losuję 0 lub 1 co 1/1000 sekundy). Ty tutaj pobierasz dane z miernika.
        ilosc += 1
        suma += randint(0,1)
        czas = teraz
        continue
0

Bardzo dziękuję Kolego ! Jak tylko wrócę do domu spróbuję !

1 użytkowników online, w tym zalogowanych: 0, gości: 1