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:15­11:00
Dokumentacja do projektu:
Koder­dekoder kodu Reeda­Solomona
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 Reeda­Solomona,
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 Reeda­Solomona 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 kodera­dekodera, 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

Podobne dokumenty