W ramach dzisiejszej instrukcji będziemy zajmować się testowaniem działania i skuteczności działania niektórych kodów korekcyjnych i kontrolnych oraz ich odporności na zakłócenia. W ramach materiałów dołączone zostały pliki źródłowe zawierające funkcje generujące pliki zabezpieczone (lub nie) rożnymi kodami korekcyjnymi. Funkcja kodująca przyjmuje dane jako tablicę numpy i zapisują dane do plików binarnych o rozszerzeniu .hex. Nazwa określa jaką metodą został zakodowany plik oraz parametry tego kodowania. Funkcja kodująca oprócz danych przyjmuje jeszcze dwa opcjonalne parametry:

  • filePrefix - umożliwi ewentualną zmianę ścieżki zapisu, albo dopisanie jakiejś niewielkiej zmiany na początku nazwy pliku (np. id badania).
  • bit_count - określenie po ile bitów program zamierza kodować. Algorytm działa dla dowolnej wartości \(\leq 247\). Sugeruję jednak stosować wartości dostosowane do ilości bitów odpowiednich dla kodowania Hamminga: \(1,4,11,26,57,120,247\), z czego wartość \(1\) nie działa dla wszystkich metod.

Jeżeli chodzi o funkcję odczytującą dane z plików to zwraca ona słownik z dekowanymi danymi, gdzie każdy rekord odpowiada danym wczytanym z każdego pliku. Dane po odtworzeniu mogą zawierać na końcu pewien ciąg zer (\(0\)), wynikający z faktu, zapisywania danych do pliku. Dlatego wyniki również należy odpowiednio przyciąć przez analizą. Jeżeli podczas dekodowania dojdzie do znalezienie błędu, którego dany kod nie da rady naprawić to zamiast tablicy w słowniku będzie widniał parametr None. Przy wczytywaniu mamy również opcjonalny primer filePrefix, który powinien być taki sam jak w przypadku funkcji zapisującej.

Żeby lepiej zrozumieć kody korekcyjne (i kontrolne) polecam przyjrzeć się wykładom i ewentualnie polecam zapoznać się z filmami opisującymi kodowanie Hamminga, ale służą one jako dobra informacja na temat ogólnie kodów korekcyjnych - ENG 1 oraz ENG 2.

Zaimplementowane metody

Lista zaimplementowanych metod:

  • M0 - brak kodowania

  • M1 - każdy bit powielony 3-krotnie

  • M2 - kod z dwoma bitami parzystości:

    B1 B2 B3 B4 P1 P2
    x x x x <-
    x x x x x <-
  • M3 - kod z dwoma bitami parzystości:

    B1 B2 B3 B4 P1 P2
    x x <-
    x x <-
  • M4 - kod z czterema bitami parzystości:

    B1 B2 B3 B4 P1 P2 P3 P4
    x x <-
    x x <-
    x x <-
    x x <-
  • MH - kody Hamminga

Zadanie

Wykorzystując różne typy danych (obrazy, dane tekstowe, dane po kompresji itd…) sprawdzić skuteczność działania załączonych algorytmów. Proces zakłócania pojedynczych plików polega na otworzeniu zapisanych plików .hex za pomocą dowolnego edytora hexów (np. HxD) i zmiany wartości odpowiednich bitów (NIE BAJTÓW!), przed wczytaniem plików za pomocą programu.

Badania przeprowadzać dla rożnych danych oraz różnych ilości bitów i wszystko opisywać w sprawozdaniu. Przebadać między innymi (dla każdej metody oceniać osobno):

  • O ile (bajtów, %) zwiększa się ilość danych rozmiar pliku?
  • Ile różnych bitów można przekłamać i dalej odtworzyć poprawnie nasze dane?
  • Ile rożnych bitów można przekłamać i odtworzyć dane, ale w sposób niepoprawny?

Przykład dla edytora HxD

Do oddania

  • Sprawozdanie w formacie PDF

Przykłady wywoływania

Przykładowe sposoby wywołania dostarczonych funkcji. Nie trzeba ich stosować dokładnie w ten sposób. Można, a nawet trzeba dostosować wywołania do waszych testów.

test=np.frombuffer(b'ABC', dtype=np.uint8)
#################################################
test=(cv2.imread('0000.png'))
test=(test[:,:,0]).flatten() # test przykładowy na jednej warstwie obrazu
#################################################
CorrectionCodes.Write(test,bit_count=11)
#################################################
DeCoded=CorrectionCodes.Read()