Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа №7
«Помехоустойчивое кодирование»
Цель
Изучение методов помехоустойчивого кодирования и сравнение их свойств.
Функции высокого уровня encode и decode осуществляют, соответственно, кодирование и декодирование сообщения с использованием блочного кода. Тип используемого кода задается в числе параметров функций. Линейный блочный код в общем случае описывается порождающей матрицей (generator matrix). Кодирование блока (вектора) производится путем его умножения на порождающую матрицу. Помимо порождающей, существует проверочная матрица кода (parity-check matrix). Она может использоваться для обнаружения ошибок при отсутствии ошибок умножение кодированного блока на проверочную матрицу должно давать нулевой вектор. Преобразование порождающей матрицы в проверочную и обратно осуществляется функцией gen2par. Если умножение кодированного блока на проверочную матрицу не дает нулевого вектора, то полученный результат (его называют синдромом syndrome) позволяет определить, какие именно символы были искажены в процессе передачи. Если код является двоичным (то есть символы могут принимать только значения 0 и 1), это позволяет исправить ошибки. Декодирование линейного блочного кода, таким образом, можно осуществить с помощью таблицы, в которой для каждого значения синдрома указан соответствующий вектор ошибок. Создать такую таблицу на основании проверочной матрицы кода позволяет функция syndtable. Функция gfweight позволяет определить кодовое расстояние для линейного блочного кода по его порождающей или проверочной матрице.
Циклические коды
Циклические коды это подкласс линейных кодов, обладающие тем свойством, что циклическая перестановка символов в кодированном блоке дает другой возможный кодированный блок того же кода. Для работы с циклическими кодами в пакете Communications имеются две функции. Задав число символов в кодируемом и закодированном блоках, с помощью функции cyclpoly можно получить порождающий полином циклического кода. Далее, использовав этот полином в качестве одного из параметров функции cyclgen, можно получить порождающую и проверочную матрицы для данного кода.
Коды БЧХ
Коды БЧХ являются одним из подклассов циклических блочных кодов. Для работы с ними функции высокого уровня вызывают специализированные функции bchenco (кодирование) и bchdeco (декодирование). Кроме того, функция bchpoly позволяет рассчитывать параметры или порождающий полином для двоичных кодов БЧХ.
Коды Хэмминга
Коды Хэмминга являются одним из подклассов циклических блочных кодов. Порождающий полином для кодов Хэмминга неприводим и примитивен, а длина кодированного блока равна 2m 1. Порождающая и проверочная матрицы для кодов Хэмминга генерируются функцией hammgen.
Коды РидаСоломона
Коды РидаСоломона являются одним из подклассов циклических блочных кодов. Это единственные поддерживаемые пакетом Communications коды, которые работают не с однобитовыми, а с многобитовыми символами. Для работы с кодами РидаСоломона функции высокого уровня вызывают специализированные функции rsenco (кодирование) и rsdeco (декодирование). Кроме того, функции rsencode и rsdecode позволяют использовать при кодировании и декодировании экспоненциальный формат данных, а функции rsencof и rsdecof осуществляют кодирование и декодирование текстового файла.
Наконец, функция rspoly генерирует порождающие полиномы для кодов РидаСоломона.
Постановка задачи
Ход работы
Текст программы:
msg = randint(26,1,2); %message
kod=encode(msg, 31,26, 'hamming'); %code
dec=decode(kod,31,26,'hamming'); %decode
sErrors = symerr(msg,dec); %errors of symbols
bitErrors = biterr(msg,dec); %errors of bits
for i=1:31
ns(i,1)=0;
for k=7:2:8
if i==k
if kod(i,1)==1 ns(i,1)=-1;
elseif kod(i,1)==0 ns(i,1)=1;
end
end
end
end
NoiseSignal = kod+ns; %noise
decn=decode(NoiseSignal,31,26,'hamming'); %decode with noise
sErr = symerr(msg,decn) %errors of symbols
bitErr = biterr(msg,decn) %errors of bits
Результат работы:
msg = 10011110110100111010000101
kod = 1110010011110110100111010000101
dec = 10011110110100111010000101
В случае введения намеренных ошибок код Хэмминга исправляет только одну из них.
Вводим 3 ошибки в 7, 9 и 11 бите:
ns = 0000001000000000000000000000000
NoiseSignal = 1110011011110110100111010000101
decn = 10011110110100111010000101
sErr = 0
bitErr = 0
Текст программы:
msg = randint(26,1,2); % message
H=hammgen(5); % parity-check matrix
G=gen2par(H); % generator matrix
T=syndtable(H); % table of errors
kod=mod(msg'*G,2); % code
dec=mod(kod*H',2); % syndrom
for k=1:26
msg2(1,k)=kod(1,5+k); % return message
end
for i=1:31
ns(i,1)=0;
for k=7:2:12
if i==k
if kod(1,i)==1 ns(i,1)=-1;
elseif kod(1,i)==0 ns(i,1)=1;
end
end
end
end
NoiseSignal = kod+ns'; % noise
decs=mod(NoiseSignal*H',2); % decode
forw(1,1)=decs(1,5);
forw(1,2)=decs(1,4);
forw(1,3)=decs(1,3);
forw(1,4)=decs(1,2);
forw(1,5)=decs(1,1);
deccsyn=0;
for i=1:5
if forw(1,i)==1
deccsyn=deccsyn+2^(i-1); %quantity of syndrom
end
end
ren=T(deccsyn-2,:);
NoiseErr=mod(NoiseSignal+ren,2); % noise
for k=1:26
msgnap(1,k)=NoiseErr(1,5+k); %message
end
Результат работы:
msg = 11011001110110100111101111
H = |1000010010110011111000110111010|
|0100001001011001111100011011101|
|0010010110011111000110111010100|
|0001001011001111100011011101010|
|0000100101100111110001101110101|
kod = 0100011011001110110100111101111
dec = 00000
msg2 = 11011001110110100111101111
Добавляем 3 ошибки: в 7, 9 и 11 бит:
NoiseSignal = 0100010001101110110100111101111
Получаем синдром:
decs = 01101
Численное значение синдрома:
deccsyn = 13
В таблице находим 11 строку, соответствующую синдрому:
ren = 0000001000000000000000000000000
Прибавляем к полученному коду по модулю два:
NoiseErr = 0100011001101110110100111101111
Получаем сообщение с одной исправленной ошибкой:
msgnap = 11001101110110100111101111
Текст программы:
msg = randint(21,1,2); %message
kod=encode(msg, 31,21, 'cyclic'); %code
dec=decode(kod,31,21,'cyclic'); %decode
H=cyclgen(31,cyclpoly(31,21));
trt=syndtable(H);
sErrors = symerr(msg,dec); %errors of symbols
bitErrors = biterr(msg,dec); %errors of bits
for i=1:30
ns(i,1)=0;
for k=11:2:14
if i==k
if kod(i,1)==1 ns(i,1)=-1;
elseif kod(i,1)==0 ns(i,1)=1;
end
end
end
end
NoiseSignal = kod+ns; %noise
decn=decode(NoiseSignal,31,21,'cyclic',cyclpoly(31,21),trt); %decode with noise
sErr = symerr(msg,decn) %errors of symbols
bitErr = biterr(msg,decn) %errors of bits
Результат работы:
msg = 101111100001000000100
kod = 0111100011101111100001000000100
dec = 101111100001000000100
В случае введения намеренных ошибок циклический код при данной длине кода может исправлять 2 ошибки. Вводим 2 ошибки в 7 и 9 бите:
ns = 0000000000-10-1000000000000000000
NoiseSignal = 0111100011000111100001000000100
decn = 101111100001000000100
Single-error patterns loaded in decoding table. 992 rows remaining.
2-error patterns loaded. 527 rows remaining.
3-error patterns loaded. 0 rows remaining.
Single-error patterns loaded in decoding table. 992 rows remaining.
2-error patterns loaded. 527 rows remaining.
3-error patterns loaded. 0 rows remaining.
sErr = 0
bitErr = 0
Выводы
Код Хэмминга является частным случаем циклических кодов и исправляет лишь одну ошибку. Корректирующая способность циклических кодов зависит от соотношения длина кодируемого слова / длина кода.