Цитата(andyp @ Mar 28 2015, 04:11)

Для того, чтобы это выполнялось, слово из всех единиц должно быть кодовым. Вот и встает вопрос - выполняется ли ones * H' = 0 для рассматриваемого кода. Закодировал твоим кодером все единицы и НЕ получил кодовое слово из всех единиц, т.е. код как минимум не систематический. Сгенери полную проверочную матрицу и проверь (сумма столбцов (??? может, строк, плохо соображаю) проверочной матрицы должна быть равна zeros).
Все чудеснее и чудеснее. Взял CML сорцы и сделал простой тест. Только параметры поставил 2304 1/2 (позже скажу зачем):
Код
plength = 2304;
data = ones(1, plength/2);
[H_rows, H_cols, P] = InitializeWiMaxLDPC(1/2, 2304, []);
codeword = LdpcEncode( data, H_rows, P);
%
code = '1/2';
[Hb, zf, coderate] = get_wimax_ldpc_Hb(code, plength);
code = ldpc_encode(data, Hb, zf);
disp(['cml ones = ', num2str(length(find(codeword == 1))), ' cml zeros = ', num2str(length(find(codeword == 0)))]);
disp(['my ones = ', num2str(length(find(codeword == 1))), ' my zeros = ', num2str(length(find(codeword == 0)))]);
disp(['cml vs my diff = ', num2str(sum(abs(codeword - code)))]);
E = eye(zf);
[c, t] = size(Hb);
H = zeros(c*zf, t*zf);
for row = 1:c
for col = 1:t
if Hb(row, col) >= 0
H(zf*(row-1)+1 : zf*row, zf*(col-1)+1 : zf*col) = ...
circshift(E,-1*Hb(row,col));
end
end
end
sum_of_rows = zeros(1, c);
for row = 1:c
sum_of_rows(row) = sum(H(row*zf, :)); % can check only one row per zf-by-zf
end
sum_of_cols = zeros(1, t);
for col = 1:t
sum_of_cols(col) = sum(H(:,col*zf)); % can check only one col per zf-by-zf
end
disp(['H sum rows = ', num2str(sum_of_rows)]);
disp(['H sum cols = ', num2str(sum_of_cols)]);
disp(['cml check = ', num2str(H(1,:)*codeword')]);
disp(['cml inv check = ', num2str(H(1,:)*not(codeword'))]);
disp(['my check = ', num2str(H(1,:)*codeword')]);
disp(['my inv check = ', num2str(H(1,:)*not(codeword'))]);
вот результат его работы:
Код
cml ones = 1920 cml zeros = 384
my ones = 1920 my zeros = 384
cml vs my diff = 0
H sum rows = 6 7 7 6 6 7 6 6 7 6 6 6
H sum cols = 3 3 6 3 3 6 3 6 3 6 3 6 3 2 2 2 2 2 2 2 2 2 2 2
cml check = 6
cml inv check = 0
my check = 6
my inv check = 0
1/2 2304 взял по причине того, что нашел в книге рисунок матрицы такого кода. Он в приложении. Приведу первую строку и первый столбец проверочной матрицы:
Код
find(H(1,:)) = 191 266 824 948 1160 1249
find(H(:,1))' = 324 853 1110
Совсем не то что приведено в книге, в других книгах точно такой же рисунок (похоже списывали друг у друга).
Вот как то у меня теперь шаблон линейных кодов немного взрывается, после результатов
Цитата(Maverick @ Mar 28 2015, 04:20)

но инверсия может декодеру не помочь....
в обсуждаемом коде мягкое решение без квантования. Инверсия в канале это поворот созвездия QPSK на 180 градусов.
Цитата(des00 @ Mar 28 2015, 22:51)

Вот как то у меня теперь шаблон линейных кодов немного взрывается, после результатов
Залез в сорцы CML, кодируют они так
Код
for (i=0;i<kldpc;i++){
c_in[i]=u[i]; // my: systematic bits
}
for (i=0;i<mldpc;i++){
c_in[kldpc+i]=0; // my: parity bits
}
sum=0;
for(i=0;i<mldpc;i++){ // my: mldpc - parity bit length
for(k=1;k<=wid_Hrows;k++){ // my: wid_Hrows - H rows number
if(H_rows[i+mldpc*(k-1)]!=0){
count=(int)H_rows[i+mldpc*(k-1)];
x[i]=((int)c_in[count-1])^((int)x[i]);
}
}
c_in[kldpc+i]=x[i]^sum; /* Differential encoding */
sum=c_in[kldpc+i];
}
Ничего неожиданного, классический расчет битов четности, а нули в потоке образуются похоже в тех рядах где 7 единиц

UPD. Шаблон разрывает по причине того, что не могу понять почему проверка проходит на инверсных битах.