UOMOP

BCH Decoder using Matlab 본문

Wireless Comm./Matlab

BCH Decoder using Matlab

Happy PinGu 2022. 1. 16. 05:55
BCH Decoder
function Mhat = BCHdecoder(R, K, t)
R = mod(R, 2);
N = length(R);
m = log2(N+1);
a = gf(2, m);
S = [];
 
for i = 1 : 2*t
    S = [S GetSyndrom(R, a^i)];
end
 
S = gf(S, m);
Sk = gf(zeros(t, t+1), m);
for x = 1 : t
    for y = 1 : t+1
        Sk(x, y) = S(x+y-1);
    end
end
        Sm = Sk(: ,1 : t);
        Sv = Sk(:, t+1); 

Sigma = inv(Sm) * Sv
SigCoeff = [1 flip(Sigma')]
Beta = [];
for i = 1 : N
    sig_a = GetSyndrom(SigCoeff, a^(i-1));
    if sig_a == 0
        Beta = [Beta 1/a^(i-1)];
    end
end
disp(Beta);
A = a.^[0 : N-1]
NumErr = length(Beta)
e = gf(zeros(size(R)), m);
 
for i = 1 : NumErr
    e(find(A ==Beta(i))) = 1;
end
disp(e);
Uhat = R + e
Mhat = Uhat(N-K+1 : N);
 
end
 BCH디코딩 과정을 매트랩을 통해 확인해보는 실습이었다. 우선 신드롬 집합을 만들기 위해 1부터 2t까지를 for문을 사용했다. S(1)에는 R에 a가 대입하여 계산된 결과가 저장된 것이다.  t값에 따라 Sm행렬과 Sv행렬의 크기 계산 변해서 이 부분에 대한 추가적인 코딩이 필요했다. Sm과 Sv의 규칙을 확인해보니, 행과 열에 따라 일정한 규칙이 존재하였다. 이 부분을 이용하여 옆에 있는 부분과 같이 코딩을 진행하였다. Sv와 Sm을 따로 정의하지 않고 Sk라는 임의의 행렬을 행으로는 t개, 열로는 t+1개로 먼저 선언해주었다. Sm과 Sv는 Sm의 마지막 열과 순차적인 값이었기 때문이다.  Sk를 먼저 정의해준 후 에 ‘Sv = Sk(:, t+1);’로 Sv를 정의했고 이 부분을 제외한 나머지가 Sm이 되는 것이다.
이후에는 RS decoder와 거의 동일한 과정이었다.
 
실습을 진행하면서 3번 문제의 Mhat값이 제대로 도출되지 않았다. t를 5로 설정해주어 5개의 error correction이 가능하지만 해당 예제에서의 error는 16개였으므로 Mhat이 도출되지 않은 것으로 보여 진다.

'Wireless Comm. > Matlab' 카테고리의 다른 글

PSK BER using Matlab(Simulink)  (0) 2022.01.17
Cyclic Encoder/Decoder using Simulink  (0) 2022.01.16
RS Encoder/ RS Decoder using Matlab  (3) 2022.01.15
Cyclic Decoder using Matlab  (0) 2022.01.15
Cyclic Encoder using Matlab  (0) 2022.01.14
Comments