Как декодировать LDPC - PullRequest
       3

Как декодировать LDPC

0 голосов
/ 17 октября 2019

Я генерирую матрицу четности и использую comm.LDPCEncoder для кодирования кодового слова. Но когда я использую comm.LDPCDecoder для декодирования LLR, декодированное слово отличается от источника. Не могли бы вы помочь мне выяснить, где это не так?

K = 4;N = 8;
H1 =  [0 0 0 1 1 0 1 1;
    0 0 0 0 1 1 0 0
    1 1 0 0 0 0 0 1
    0 0 1 0 0 1 0 1];
H = sparse(H1);
hEnc = comm.LDPCEncoder(H);
hDec = comm.LDPCDecoder(H);
msg_source = logical(randi([0 1], K, 1));
msg_coded = step(hEnc, msg_source);  
LLR = double(msg_coded);
msg_decoded = step(hDec,LLR);
errors = (sum(xor(msg_source,msg_decoded)));

Большое вам спасибо.

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Почему вы конвертируете логически закодированные данные в двойные? Попробуйте декодировать сразу после кодировки:

K = 4;N = 8;
H1 =  [0 0 0 1 1 0 1 1;
    0 0 0 0 1 1 0 0
    1 1 0 0 0 0 0 1
    0 0 1 0 0 1 0 1];
H = sparse(H1);
hEnc = comm.LDPCEncoder(H);
hDec = comm.LDPCDecoder(H);
msg_source = logical(randi([0 1], K, 1));
msg_coded = step(hEnc, msg_source);  
msg_decoded = step(hDec,LLR);
errors = (sum(xor(msg_source,msg_decoded)));
0 голосов
/ 17 октября 2019

Похоже, LLR = double(msg_coded); является источником проблемы.

Я не эксперт по коммуникациям и никогда не использовал кодировщик и декодер LDPC.
Я попробовал пример кода MATLAB и увидел, что после модуляции и демодуляции 1 s (единицы) получает отрицательные значения,и 0 s (нули) получают положительные значения.

Вместо LLR = double(msg_coded);
Вы можете использовать следующее преобразование: LLR = 1 - double(msg_coded)*2;.
0 --> 1
1 --> -1

Вот модифицированный код:

K = 4;N = 8;
H1 =  [0 0 0 1 1 0 1 1;
    0 0 0 0 1 1 0 0
    1 1 0 0 0 0 0 1
    0 0 1 0 0 1 0 1];
H = sparse(H1);
hEnc = comm.LDPCEncoder(H);
hDec = comm.LDPCDecoder(H);
msg_source = logical(randi([0 1], K, 1));
msg_coded = step(hEnc, msg_source);  
%LLR = double(msg_coded);

%Convert from logical to double where 0 goes to -1 and 1 goes to 1.
LLR = 1 - double(msg_coded)*2;
msg_decoded = step(hDec,LLR);
errors = (sum(xor(msg_source,msg_decoded)));

Вот код с модуляцией и демодуляцией, который я использовал для нахождения проблемы (на примере MATLAB):

K = 4;N = 8;
H1 =  [0 0 0 1 1 0 1 1;
    0 0 0 0 1 1 0 0
    1 1 0 0 0 0 0 1
    0 0 1 0 0 1 0 1];
H = sparse(H1);
hEnc = comm.LDPCEncoder(H);
hDec = comm.LDPCDecoder(H);

hMod = comm.PSKModulator(4, 'BitInput',true);
hChan = comm.AWGNChannel(...
        'NoiseMethod','Signal to noise ratio (SNR)','SNR',10);
hDemod = comm.PSKDemodulator(4, 'BitOutput',true,...
        'DecisionMethod','Approximate log-likelihood ratio', ...
        'Variance', 1/10^(hChan.SNR/10));

msg_source = logical(randi([0 1], K, 1));
msg_coded = step(hEnc, msg_source);  

modSignal      = step(hMod, msg_coded);
receivedSignal = step(hChan, modSignal);
demodSignal    = step(hDemod, receivedSignal);
msg_decoded   = step(hDec, demodSignal);

errors = (sum(xor(msg_source,msg_decoded)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...