-
Обобщенная структура кодирующего и декодирующего устройства
Блок-схема кодирующего и декодирующего устройства приведена на рисунке 1:
N(t)
1 2 3 6 4 5 7 8 Вход Выход
Рисунок 1 – Блок-схема кодирующего и декодирующего устройств.
Блок №1 выполняет кодирование входной последовательности, формируя четырехразрядный двоичный код, причем первые 3 символа информационные, а четвертый – проверочный. Затем кодированное сообщение параллельно передается на блок №2 (параллельно-последовательный регистр).
После прохождения кода через зашумленный канал связи к нему прибавляется вектор ошибки N(t), причем каждая единица вектора приводит к ошибке в соответствующем бите переданной последовательности.
Далее информация поступает на последовательный регистр (блок №3). Теперь кодовая последовательность двигается по двум путям: один ведет к регулирующему буферу (блок №6), в который перезаписывается информация с блока №3; второй – к блоку формирующему синдром s (блок №4), после которого синдром s подается на блок №5, в котором формируется вектор ошибки E.
Затем сигнал на выходе блока №6 суммируется с вектором ошибок Е, который получаем на выходе блока №5, причем полученный код двигается параллельно, и приходит на параллельно-последовательный регистр (блок №8). После сигнал идет на выход.
Данная блок-схема позволяет устройству обнаружить ошибку и исправить ее. Минусом такого устройства будет являться то, что при ошибке в двух символах схема не укажет на это. И при получении ложного синдрома может внести дополнительную ошибку в сообщение.
-
Моделирование в среде Matlab
Согласно построенной блок-схеме из пункта №2 промоделируем данное устройство. Для этого воспользуемся программным пакетом Matlab.
Блоки №1 и №2 представляют собой кодирующее устройство сверточного кода Вайнера-Эша. Представим данные блоки в виде программы, написанной в среде Matlab:
1
x=[1,0,0, 0,0,0, 0,0,0];
n=1;
r=0;
reg1=0;
2
reg3=0;
reg4=0;
reg5=0;
for i=1:1:3
resylt=reg1+reg2+reg3+reg5+x(n)+x(n+1)+x(n+2);
reg2=reg1;
reg1=x(n);
3
reg5=reg4;
reg4=x(n+2);
n=n+3;
singi(i)=mod(resylt,2);
end;
for b=1:1:12
a=mod(b,4);
4
res(b)=singi(b/4);
r=r+1;
else
res(b)=x(b-r);
end;
end;
Матрица x представляет собой входную последовательность, подаваемую на вход кодирующего устройства (1). Далее описывается начальное положение регистров (2).
Цикл (3) формирует четвертый (проверочный) символ по правилу:
resylt=reg1+reg2+reg3+reg5+x(n)+x(n+1)+x(n+2);
singi(i)=mod(resylt,2),
где singi - матрица проверочных символов к трем кадрам.
Далее в цикле (4) к информационным символам добавляются проверочные символы. Т. е. после каждых трех информационных символов входной матрицы x записывается проверочный символ из матрицы singi, после чего мы получаем кодированное сообщение, представляющее собой матрицу res и передаем его по каналу связи.
В канале связи вноситься ошибка N(t) и мы получаем матрицу z. Далее сообщение z поступает на вход декодирующего устройства.
Блоки №3, №4, №5, №6, №7 и №8 представляют собой декодирующее устройство. Представим данные блоки в виде программы, написанной в среде Matlab:
5
z=[1,0,0,1, 0,0,0,1, 0,0,0,1];
n1=1;
r1=0;
reg11=0;
6
reg13=0;
reg14=0;
reg15=0;
for i=1:1:3
resylt1=reg11+reg12+reg13+reg15+z(n1)+z(n1+1)
+z(n1+2)+z(n1+3);
reg12=reg11;
reg11=z(n1);
7
reg15=reg4;
reg14=z(n1+2);
n1=n1+4;
sindrom(i)=mod(resylt1,2);
end;
sin1=[1,1,1];
sin2=[1,1,0];
sin3=[1,0,0];
8
sin7=[0,1,0];
sin9=[0,0,1];
sin0=[0,0,0];
a=[0,0,0,0,0,0,0,0,0];
if sindrom==sin1
a(1)=1;
end;
if sindrom==sin2
a(2)=1;
end;
if sindrom==sin3
a(3)=1;
9
if sindrom==sin5
a(5)=1;
end;
if sindrom==sin7
a(7)=1;
end;
if sindrom==sin9
a(9)=1;
end;
b=z1;
b(1)=z(1);b(2)=z(2);b(3)=z(3);b(4)=z(5);
b(5)=z(6);b(6)=z(7);b(7)=z(9);b(8)=z(10);
b(9)=z(11);
10
if a(i)==1
b(i)=mod(z(i)+a(i),2);
end;
end;
На вход декодирующего устройства приходит последовательность, которая задается матрицей z (5). Далее описываются начальные положения регистров (6).
Цикл (7) формирует синдром по правилу:
resylt1=reg11+reg12+reg13+reg15+z(n1)+z(n1+1)+z(n1+2)+z(n1+3);
sindrom(i)=mod(resylt1,2),
где матрица sindrom - синдром к трем кадрам.
Далее записываются вероятные последовательности синдромов, причем каждый синдром соответствует полученной ошибке пир передаче по каналу связи (8).
Затем в зависимости от синдрома формируется вектор ошибки. Вектор ошибки представлен матрицей а (9).
После того как вектор ошибки сформирован происходит его суммирование с матрицей z, после чего получаем декодированную последовательность, записанную в матрицу b. Причем если в канале связи не возникло более одной ошибки, то матрица b будет равна исходной матрице х, что свидетельствует о удачном декодировании.
Рассмотрим несколько случаев возникновения ошибки в кодовом сообщении.
Подадим на вход кодирующего устройства последовательность:
x=[1,0,0,0,0,0,0,0,0].
После завершения кодирования получим закодированную последовательность, где каждый четвертый символ проверочный:
res=[1,0,0,1,0,0,0,1,0,0,0,1].
Затем добавим ошибку в последовательность res, получив при этом сообщение приходящее на вход декодирующего устройства z и рассмотрим работу декодирующего устройства.
Первый случай: ошибка в первом бите информационного сообщения.
x=[1,0,0,0,0,0,0,0,0];
res=[1,0,0,1,0,0,0,1,0,0,0,1];
z=[0,0,0,1,0,0,0,1,0,0,0,1];
sindrom=[1,1,1];
a=[1,0,0,0,0,0,0,0,0];
b=[1,0,0,0,0,0,0,0,0];
Второй случай: ошибка во втором бите информационного сообщения.
x=[1,0,0,0,0,0,0,0,0];
res=[1,0,0,1,0,0,0,1,0,0,0,1];
z=[1,1,0,1,0,0,0,1,0,0,0,1];
sindrom=[1,1,0];
a=[0,1,0,0,0,0,0,0,0];
b=[1,0,0,0,0,0,0,0,0];
Третий случай: ошибка в третьем бите информационного сообщения.
x=[1,0,0,0,0,0,0,0,0];
res=[1,0,0,1,0,0,0,1,0,0,0,1];
z=[1,0,1,1,0,0,0,1,0,0,0,1];
sindrom=[1,0,0];
a=[0,0,1,0,0,0,0,0,0];
b=[1,0,0,0,0,0,0,0,0];
Четвертый случай: ошибка в пятом бите информационного сообщения.
x=[1,0,0,0,0,0,0,0,0];
res=[1,0,0,1,0,0,0,1,0,0,0,1];
z=[1,0,0,1,1,0,0,1,0,0,0,1];
sindrom=[0,1,1];
a=[0,0,0,1,0,0,0,0,0];
b=[1,0,0,0,0,0,0,0,0];
Пятый случай: ошибка во втором и третьем битах информационного сообщения.
x=[1,0,0,0,0,0,0,0,0];
res=[1,0,0,1,0,0,0,1,0,0,0,1];
z=[1,1,1,1,0,0,0,1,0,0,0,1];
sindrom=[0,1,0];
a=[0,0,1,0,0,0,0,0,0];
b=[1,1,1,0,0,0,1,0,0];
В заключении можно сказать, что модель работает правильно и исправляет единичную ошибку (случаи 1, 2, 3, 4). В пятом же случае, при добавлении двух ошибок, модель, как описывалось раньше, ошибок не исправляет, а в данном случае добавляет их. Это связано с особенностью кодов Вайнера-Эша.