Dokumentacja do projektu: Koderdekoder kodu ReedaSolomona
Transkrypt
Dokumentacja do projektu: Koderdekoder kodu ReedaSolomona
Łukasz Przywarty 171018 Wrocław, 8.01.2013 r. Marcin Tomiak 171683 Grupa: ŚR 9:1511:00 Dokumentacja do projektu: Koderdekoder kodu ReedaSolomona Projekt został zrealizowany w ramach przedmiotu: Kodowanie i szyfrowanie danych Prowadzący: mgr inż. Tomasz Serafin 1 1 Cel i założenia Celem projektu było napisanie aplikacji, która koduje dane wejściowe kodem ReedaSolomona, a następnie przeprowadza operację odwrotną (dekodowanie). Na wejściu program otrzymuje plik dźwiękowy WAVE, do którego są wprowadzane losowe zniekształcenia. Interfejs programu umożliwia odtwarzanie trzech plików dźwiękowych: ● oryginalnego pliku dźwiękowego WAVE, ● zniekształconego pliku dźwiękowego, ● odtworzonego pliku dźwiękowego WAVE. 2 Realizacja Program został napisany w języku JAVA. Dodatkowo skorzystano z gotowej biblioteki musicg1 , która udostępnia API służące do rozszerzonej analizy dźwięku. 2.1 Algorytm Do kodowania i dekodowania pliku WAVE użyto kodu ReedaSolomona w którym jeden symbol reprezenował jeden bajt strumienia danych. Długość zakodowanej wiadomości to 255 symboli a długość niezakodowanej wiadomości to 239 symboli. Zgodnie z teorią więc algorytm powinien znosić do 8 błędów na jedną wiadomość. Strumień bajtów reprezentujący plik WAVE został więc podzielony na bloki po 239 symboli. Każdy blok został zakodowany dając na wyjściu 255 bajtów. Zarówno koder i dekoder zostały napisane zupełnie od podstaw w oparciu o literaturę 2.2 Koder i dekoder Koder i dekoder korzystają z klasy GaloisField do wykonywania operacji artmetycznych w ciele skończonym. Implementacja zawiera następujace funkcje(operacje matemtatyczne) w ciele skończonym, które są potrzebne do realizacji kodeka: GaloisField(int m, int[] generator) konstruktor, przyjmujący jako parametr wielomian generujący 1 http://code.google.com/p/musicg/ 2 oraz liczbę m, gdzie wielkość pola to 2^m. add(int a, int b) addPolynominals(int[] a, int[] b) determinant(int[][] m) divide(int a, int b) dividePolynomialsWithRemainder(int[] a, int[] b) euclidAlgorithm(int[] a, int[] b) evalPoly(int[] p, int x) findRoots(int[] p) getValueByDecimal(int v) getValueByIndex(int i) getValues() isPolynominalZero(int[] p) lsolve(int[][] A, int[] x) mul(int a, int b) multiplyPolynomials(int[] a, int[] b) polynominalFromIndexToDecimal(int[] p) substract(int a, int b) Sam kodek ma natomiast następujące API: ReedSolomonCodec(int n, int k, int m, int[] fieldGenerator, int b ) int[] composeErrorLocatorEqLHS(int[] syndromes, int v) int[][] composeSMatrix(int[] syndromes, int v) int[][] composeXMatrix(int[] errorLocatorRoots, int v) int[] decodeMessage(int[] input) int[] decodeMessageWithoutErrorCorrection(int[] input) int[] encodeMessage(int[] message) 2.3 Interfejs graficzny Aplikacja posiada własny interfejs graficzny (rys. 1) który umożliwia: ● Wybór pliku dźwiękowego WAV z lokalnego dysku twardego. Program umożliwia 3 wybór tylko i wyłącznie plików z rozszerzeniem WAV. Takie rozwiązanie zabezpiecza aplikację przed nieobsługiwanymi formatami plików dźwiękowych. Rys.1: Interfejs graficzny ● Wybór liczby błędów wprowadzanych do oryginalnego pliku dźwiękowego per 255 bajtów (długość jednej wiadomości). ● Uruchomienie koderadekodera, za pomocą przycisku Run, który pozostaje nieaktywny do momentu wybrania prawidłowego pliku dźwiękowego. ● Śledzenie postępu w realizacji procesu kodowania oraz dekodowania (pasek postępu). ● Odtworzenie trzech plików dźwiękowych (oryginalnego, zniekształconego oraz odtworzonego) przycisku na samym dole okna programu. 3. Wnioski 4 Działanie gotowego programu pokazuje, że przy danej implementacji, można wprowadzić maksymalnie 8 błędów per 255 bajtów 5