Кодер классический (7,[171 133]) со скоростью 1/2 путем перфорации ускоряется до 3/4, что согласно теории должно давать незначительный проигрыш по BER.
Теория - битовый поток делится на блоки по 6, из которых удаляется 2 бита 4 и 5. Оставшиеся 4 передаются.
На приемной стороне выполняется операция деперфорации, пропущенные биты заменяются на состояние NULL (все равно реализовывать не будем),
либо на слабую единицу/слабый ноль. У меня идет замена на слабый нуль - 3. (0.1.2.3)
Операция перфорации выполняется вот так
Код
ncode_2(4:6:2*D)=0.5;
ncode_2(5:6:2*D)=0.5;
ncode_2(5:6:2*D)=0.5;
Как видно из графиков отставание такой кривой от кривой без перфорации достигает почти 4 дБ, что уже ни в какие ворота.
Если заменять не тройками, чередование 3 и 4, (оч. слабый ноль-оч. слабая единица), как рекомендуются в одном из мануалов TI
Код
qcode_2(4:12:2*D)=3;
qcode_2(10:12:2*D)=4;
qcode_2(5:12:2*D)=4;
qcode_2(11:12:2*D)=3;
qcode_2(10:12:2*D)=4;
qcode_2(5:12:2*D)=4;
qcode_2(11:12:2*D)=3;
То отсавание становится еще больше, доходя до 5 дБ.
Каково нормальное значение проигрыша по BER в случае использования перфорации?
Ведь во всем мире ипользуют перфорацию, и вряд ли стали бы это делать, если бы она давала такой проигрыш.
Если поставить SNR=100, ну то есть исключить все ошибки кроме перфорации, то вся последовательность декодируется правильно и без ошибок.
Да, я использовал встроенные функции Матлаба, вместо своего декодера, так как они работают в 100 раз быстрее. Но результаты дают практически такие же (мой пока проигрывает 0.5 дБ, но это я потом еще отдельно буду выяснять).
Полный код m файла ниже
Код
clear all;
SNR_MAX=11;
BER_NO_PERF(1:SNR_MAX)=0;
BER_PERF(1:SNR_MAX)=0;
D=10000;
msg = randint(D,1,2,139); % Random data
t = poly2trellis(7,[171 133]); % Define trellis.
code = convenc(msg,t); % Encode the data.
for i=1:SNR_MAX
ncode = awgn(code,i,'measured',244); % Add noise.
ncode_1=ncode;
qcode = quantiz(ncode_1,[0.001,.1,.3,.5,.7,.9,.999]);
tblen = 48;
delay = tblen; % Traceback length
decoded = vitdec(qcode,t,tblen,'cont','soft',3); % Decode.
% Compute bit error rate.
[number,ratio] = biterr(decoded(delay+1:end),msg(1:end-delay));
BER_NO_PERF(i)=ratio;
ncode_2=ncode;
% ncode_2(4:6:2*D)=0.5;
% ncode_2(5:6:2*D)=0.5;
qcode_2= quantiz(ncode_2,[0.001,.1,.3,.5,.7,.9,.999]);
qcode_2(4:12:2*D)=3;
qcode_2(10:12:2*D)=4;
qcode_2(5:12:2*D)=4;
qcode_2(11:12:2*D)=3;
tblen = 48;
delay = tblen; % Traceback length
decoded = vitdec(qcode_2,t,tblen,'cont','soft',3); % Decode.
% Compute bit error rate.
[number,ratio] = biterr(decoded(delay+1:end),msg(1:end-delay));
BER_PERF(i)=ratio;
end
semilogy(1:SNR_MAX,BER_NO_PERF)
hold on;
semilogy(1:SNR_MAX,BER_PERF)
hold off;
grid on
SNR_MAX=11;
BER_NO_PERF(1:SNR_MAX)=0;
BER_PERF(1:SNR_MAX)=0;
D=10000;
msg = randint(D,1,2,139); % Random data
t = poly2trellis(7,[171 133]); % Define trellis.
code = convenc(msg,t); % Encode the data.
for i=1:SNR_MAX
ncode = awgn(code,i,'measured',244); % Add noise.
ncode_1=ncode;
qcode = quantiz(ncode_1,[0.001,.1,.3,.5,.7,.9,.999]);
tblen = 48;
delay = tblen; % Traceback length
decoded = vitdec(qcode,t,tblen,'cont','soft',3); % Decode.
% Compute bit error rate.
[number,ratio] = biterr(decoded(delay+1:end),msg(1:end-delay));
BER_NO_PERF(i)=ratio;
ncode_2=ncode;
% ncode_2(4:6:2*D)=0.5;
% ncode_2(5:6:2*D)=0.5;
qcode_2= quantiz(ncode_2,[0.001,.1,.3,.5,.7,.9,.999]);
qcode_2(4:12:2*D)=3;
qcode_2(10:12:2*D)=4;
qcode_2(5:12:2*D)=4;
qcode_2(11:12:2*D)=3;
tblen = 48;
delay = tblen; % Traceback length
decoded = vitdec(qcode_2,t,tblen,'cont','soft',3); % Decode.
% Compute bit error rate.
[number,ratio] = biterr(decoded(delay+1:end),msg(1:end-delay));
BER_PERF(i)=ratio;
end
semilogy(1:SNR_MAX,BER_NO_PERF)
hold on;
semilogy(1:SNR_MAX,BER_PERF)
hold off;
grid on