package pl.mkaczara.bch.decoder.worker;
import java.math.BigInteger;
import java.util.concurrent.Callable;
import pl.mkaczara.bch.math.BinPolynomial;
import pl.mkaczara.bch.code.CyclicCode;
import pl.mkaczara.bch.exception.UncorrectableErrorsException;
import pl.mkaczara.bch.math.BinMonomial;
/**
* Klasa abstrakcyjna obiektow reprezentujacych workery dekodera kodu BCH
*
* @author Michał
*/
public abstract class AbstractBCHDecoderWorker implements Callable<BinPolynomial>{
/**
* Wielomian wejsciowy
*/
private BinPolynomial input;
/**
* Kod
*/
private CyclicCode code;
/**
* Maska danych (do wyciagania wektora informacji)
*/
private BigInteger dataMask = BigInteger.ZERO;
public AbstractBCHDecoderWorker(CyclicCode code) {
this.code = code;
for(int i = code.getN() - 1; i >= code.getN() - code.getK(); i--){
this.dataMask = this.dataMask.setBit(i);
}
}
/**
* Dekoduje slowo kodu BCH
*
* @param input slowo kodu
* @return zdekodowane slowo kodu
*/
public abstract BinPolynomial decode(BinPolynomial input) throws UncorrectableErrorsException;
/**
* Pobiera "złożoność" dekodera
* @return "złożoność" dekodera
*/
public abstract Integer getComplexity();
@Override
public BinPolynomial call() throws Exception {
if(null == input){
throw new IllegalStateException("No input data given!");
}
return decode(input);
}
public BinPolynomial getInput() {
return input;
}
public void setInput(BinPolynomial input) {
this.input = input;
}
public CyclicCode getCode() {
return code;
}
/**
* Zwraca wielomian danych otrzymany z <b>poprawnego</b> wielomianu slowa kodu
*
* @param in <b>poprawny</b> wielomian slowa kodu
* @return wielomian danych zakodowanych w slowie
*/
protected final BinPolynomial getData(BinPolynomial in){
BinPolynomial res = new BinPolynomial(in.getPolyVector().and(dataMask), getCode().getK() - 1);
res = res.divideByMonomial(new BinMonomial(getCode().getN() - getCode().getK()));
return res;
}
/**
* Oblicza funkcje Hamminga dla wielomianu binarnego
*
* @param sx wielomian
* @return liczba wspolczynnikow niezerowych wielomianu
*/
protected final int getHammingWeight(BinPolynomial sx) {
int w = 0;
for(int i = 0; i < sx.getPolyVector().bitLength(); i++){
if(sx.getPolyVector().testBit(i)){
w++;
}
}
return w;
}
} // end AbstractBCHEncoderWorker