Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [algorytm] Reed-Solomon w php (i datamatrix)
piotr94
post 11.11.2009, 18:57:34
Post #1





Grupa: Zarejestrowani
Postów: 331
Pomógł: 30
Dołączył: 11.11.2008
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Witam!
Chcę napisać własną klasę generująca kody datamatrix, jednak do tego potrzebne jest kodowanie w korekcji błędów reed-solomon,
Znalazłem algorytmy Reed-Solomon i napisałem na ich podstawie prostą klasę, która ma generować kody korekcji błędów, ale nie wiem co zrobiłem źle, bo nie działa tak jak powinna...
Dla danych 142, 164, 186
pięć słów kontrolnych powinno być kolejno: 114, 25, 5, 88, 102...
Bardzo proszę WAS o pomoc w tej sprawie
kod klasy:
Kod
<?
class datamatrix{
public $data_array;

public function ReedSolomon($numbercw,$fact_array){
$reed_data=array();
$data_array=$this->data_array;
$c=0;
$t=0;
for($i=0;$i<count($data_array);$i+=1){

    $t= ($data_array[$i] xor $reed_data[$numbercw-1]);
    for($j=$numbercw-1;$j>=0;$j-=1){
    
        if($t=0){
        $reed_data[$j]=0;
        }else{
        $reed_data[$j]=$this->Mult($t,$fact_array[$j]);
        }
        if($j>0) $reed_data[$j]=$reed_data[$j-1] xor $reed_data[$j];
    
    }

}
return $reed_data;
}

private function Mult($a,$b){

$log[0]=-255;
$alog[0]=1;

for($i=1;$i<=255;$i+=1){

    $alog[$i]=$alog[$i-1] * 2;
    if($alog[$i]>=256) $alog[$i] = $alog[$i] xor 301;
    $log[$alog[$i]]=$i;

}

$mult=$alog[($log[$a]+$log[$b]) % 255];

return $mult;
}
}

$datamatrix=new datamatrix();
$datamatrix->data_array=array(142,164,186);
print_r($datamatrix->ReedSolomon(5,array(228,48,15,111,62)));
?>


Kody czerpię z tej strony: http://www.piotrek94.ovh.org/datamatrix/datamatrix.htm -> http://grandzebu.net/index.php
Z góry dziękuję za pomoc - nagrodzę ją umieszczeniem pseudonimu i dodatkowych danych w autorach skryptu.


--------------------
http://www.piotr94.net21.pl/ - wykonanie stron i serwisów internetowych
Jeśli moje wypowiedzi były dla Ciebie pomocne, kliknij "Pomógł" i odwdzięcz się ;)
Go to the top of the page
+Quote Post
darko
post 11.11.2009, 19:19:30
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


zamiast xor daj ^

poza tym nie mam pewności czy poprawnie implementujesz to:

Let k the number of correction CWs, a the factors array, m the number of data CWs, d the data CWs array and c the correction CWs array. We'll use a temporary variable t.
c and t are inited with 0. And let's go with the math fiddle :

For i = 0 To m - 1
t = (d(i) Xor c(k - 1))
For j = k - 1 To 0 Step -1
If t = 0 Then
c(j) = 0
Else
c(j) = Mult(t, a(j))
End If
If j > 0 Then c(j) = c(j - 1) Xor c(j)
Next
Next

Mult is the special Galois field multiplication.

Ten post edytował darko 11.11.2009, 19:28:10


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
piotr94
post 12.11.2009, 10:39:25
Post #3





Grupa: Zarejestrowani
Postów: 331
Pomógł: 30
Dołączył: 11.11.2008
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Hmm, zamienię zaraz xor na ^, wydaje mi się że poprawnie zaimplementowałem to w php, wszystkie zmienne się zgadzają...
k - ilość bitów korekcyjnych
a - tablica pomocnicza z prekalkulowanymi wartościami dla odpowiedniej ilości liczby k)
m - ilość słów danych
d - tablica z danymi
c - wynikowa tablica ze słowami korekcyjnymi
t - zmienna pomocnicza
c i t inicjujemy wartościami 0
zmieniłem skrypt tak (dodałem nawiasy paru miejscach żeby był pewny priorytet, zmieniłem xor na ^):
CODE
<?
class datamatrix{
public $data_array;

public function ReedSolomon($numbercw,$fact_array){
$reed_data=array();
$data_array=$this->data_array;
$c=0;
$t=0;
for($i=0;$i<count($data_array);$i+=1){

$t= ($data_array[$i] ^ $reed_data[$numbercw-1]);
for($j=$numbercw-1;$j>=0;$j-=1){

if($t=0){
$reed_data[$j]=0;
}else{
$reed_data[$j]=$this->Mult($t,$fact_array[$j]);
}
if($j>0) $reed_data[$j]=($reed_data[$j-1] ^ $reed_data[$j]);

}

}
return $reed_data;
}

private function Mult($a,$b){

$log[0]=-255;
$alog[0]=1;

for($i=1;$i<=255;$i+=1){

$alog[$i]=$alog[$i-1] * 2;
if($alog[$i]>=256) $alog[$i] = ($alog[$i] ^ 301);
$log[$alog[$i]]=$i;

}

$mult=$alog[(($log[$a]+$log[$b]) % 255)];

return $mult;
}
}

$datamatrix=new datamatrix();
$datamatrix->data_array=array(142,164,186);
print_r($datamatrix->ReedSolomon(5,array(228,48,15,111,62)));
?>

i dalej nie działa, zwraca mi teraz: Array ( [4] => 0 [3] => 0 [2] => 0 [1] => 0 [0] => )
przed zmianami było tak: Array ( [4] => 1 [3] => 1 [2] => 1 [1] => [0] => 1 )
Serio nie wiem już co może być nie tak, może nie widzę jakiegoś oczywistego błędu, jakiejś literówki w nazwie zmiennej...
Bardzo proszę o pomoc ;-)

Ten post edytował piotr94 12.11.2009, 10:46:40


--------------------
http://www.piotr94.net21.pl/ - wykonanie stron i serwisów internetowych
Jeśli moje wypowiedzi były dla Ciebie pomocne, kliknij "Pomógł" i odwdzięcz się ;)
Go to the top of the page
+Quote Post
Cysiaczek
post 12.12.2009, 01:13:49
Post #4





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Brak tematyki OOP. ->PHP


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
piotr94
post 12.12.2009, 11:33:18
Post #5





Grupa: Zarejestrowani
Postów: 331
Pomógł: 30
Dołączył: 11.11.2008
Skąd: Kraków

Ostrzeżenie: (0%)
-----


dzięki za zmianę kategorii, miałem też o to prosić, bo się pomyliłem pisząc posta ;-)
Pytanie nadal aktualne;-)


--------------------
http://www.piotr94.net21.pl/ - wykonanie stron i serwisów internetowych
Jeśli moje wypowiedzi były dla Ciebie pomocne, kliknij "Pomógł" i odwdzięcz się ;)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2025 - 07:39