Изучение методов помехоустойчивого кодирования. Изучение методов помехоустойчивого кодирования. Исследование характеристик помехоустойчивых кодов

Страницы работы

Фрагмент текста работы

САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРССТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ, МЕХАНИКИ И ОПТИКИ

Отчет по лабораторной работе № 3

«Изучение методов помехоустойчивого кодирования»

Выполнили:

Санкт-Петербург

2011 год


Цель работы.

Изучение методов помехоустойчивого кодирования. Исследование характеристик помехоустойчивых кодов.

Содержание отчета

  1. Определить минимальное расстояние линейного блокового кода.
  2. Определить количество ошибок, исправляемое данным кодом.
  3. Сгенерировать двоичное сообщение большой длины с равновероятными значениями нуля и единицы.
  4. Сгенерировать список кодовых слов.
  5. Разбить передаваемую последовательность на блоки и произвести кодирование.
  6. Сгенерировать вектор шума с вероятностью ошибки p.
  7. Внести ошибки в закодированное передаваемое сообщение.
  8. Произвести декодирование зашумленного сообщения.
  9. Вычислить вероятность ошибки на бит.
  10. Вычислить вероятность ошибки на байт.
  11. Построить график зависимости вероятности ошибки на бит и вероятности ошибки на байт от вероятности p.
  12. Построить график тероетической ошибки на бит исходя из корректирующей способности кода

Исходные данные.

Вариант № 10.

Порождающая матрица линейного блокового кода.

%0. Открываю порождающую матрицу

G  = importdata(' lab3_10.mat');

G =

1     0     0     1     0     1     1     1     0     0

0     0     1     0     1     0     1     0     1     0

0     0     0     1     1     1     1     1     1     0

0     0     0     0     0     1     1     0     1     0

0     0     0     0     1     1     1     1     0     1

0     1     1     1     1     1     1     1     0     1

%Количество бит в слове                 6

k = size(G,1);

%Количество слов в предложении          10

n = size(G,2);

%Длина сообщения в битах                      1020

MesLength = 1020;

%Число Закодированных Бит               1700

InCodedNums = MessLength/k*n


Теоретическая часть

Порождающей матрицей линейного -кода называется матрица размера , строки которой – его базисные векторы.

Базисом линейного пространства называется наибольшее возможное множество линейно независимых векторов пространства.

Число базисных векторов называется размерностью пространства.

кодовые слова – линейные комбинации базисных векторов, т.е. строк матрицы .


Вычисляемые данные.

1

Определить минимальное расстояние линейного блокового кода

CodeMinDist

Теория

Минимальным расстоянием кода называется наименьшее из попарных расстояний между кодовыми словами:

.

Для линейного кода эта формула может быть упрощена:

, где  - число ненулевых элементов в последовательности  или вес вектор в метрике Хэмминга.

Исполняемый код

%1. Минимальное расстояние линейного блокового кода

rasst = [];

for i = 1:k

for l = 1:k

if (l==i)

continue

end

temps = 0;

for j = 1:n

if (G(i,j)~=G(l,j))

temps = temps+1;

end

end

rasst = [rasst temps];

end

end

CodeMinDist = min(rasst);        

Значение

3

2

Определить количество ошибок, исправляемое данным кодом

FixError

Формула

код с минимальным расстоянием  исправляет любые комбинации ошибок кратности не больше .

Исполняемый код

%2.Колличество ошибок исправляемое данным кодом

FixError = (codeMinimalDistance-1)/2;


Значение

1


3

Сгенерировать двоичное сообщение большой длины с равновероятными значениями нуля и единицы.

BinaryMess

Теория

Линейным двоичным кодом -кодом  называется любой -мерное подпространство пространства  всевозможных векторов длины

Исполняемый код

%3. Генерируем сообщение из двоичных значений

BinaryMess=round(rand(1, MessLength));




4

Сгенерировать список кодовых слов

CodeWords

Теория

кодовые слова – линейные комбинации базисных векторов, т.е. строк матрицы . получаются умножением вектора на матрицу и записывается в виде вектора  

кодовое слово вычисляется по формуле  .

вектор из  бит превращается в последовательность из  двоичных символов.

Исполняемый код

%4

%генерация кодовых слов

Combinations = GetCodeWords(wordLength);

CodeWords = zeros(length(Combinations(:,1)), n);

for i=1:length(Combinations(:,1))

CodeWords(i, 1:n) = (Combinations(i, 1:k))*G;

end;

CodeWords=mod(CodeWords,2);

function

GetCodeWords

function res = GetCodeWords (n)

max_number = 2^n-1;

res = [];

qw = zeros(1, n);

for (i=1:1:max_number)

number =i;

temp=[];

while number>0

dev = mod(number,2);

if (dev==1)

s = (number - 1)/2;

temp=[1 temp];

number = s;

else

s=number/2;

temp = [0 temp];

number = s;

end;

end;

disp(qw);

if(length(temp)<n)

temp =cat(2,zeros(1, n-length(temp)),temp);

end;

disp(temp);

qw = vertcat(qw, temp);

end;

res = qw;




5

Разбить передаваемую последовательность на блоки и произвести кодирование.

CodeMess

Исполняемый код

%5. Kодирование сообщений

CodeMess = [];

for i = 1 : k : MessLength

temp = Messages(i : i + k - 1);

CodeMess = [CodeMess  temp * G];

end;

CodeMess = mod(CodeMess, 2);






6

Сгенерировать вектор шума с вероятностью ошибки p.

Исполняемый код

P_error = 1/num_exp * count;

P_ERR(1, count) = P_error;

%генерация ошибок

Errors = rand(1, InCodedNums);

Errors = RoundX(Errors, P_error);



7

Внести ошибки в закодированное передаваемое сообщение

Исполняемый код

%добавление ошибок

Error_code = CodeMess + Errors;

Error_code = mod(Error_code, 2);



8

Произвести декодирование зашумленного сообщения.

Исполняемый код

%поиск близлежащих слов

Decode = [];

for i=1:n:InCodedNums

cod = Error_code(i:i+n-1);

min_dist=n;

num=1;

for j=1:length(CodeWords(:,1))

dist=0;

for q=1:n

if (cod(q) ~= CodeWords(j,q))

dist = dist +1;

end;

end;

if (dist<=min_dist)

min_dist=dist;

num=j;

end;

end;

Decode = [Decode Combinations(num, 1:k)];

end;




9

Вычислить вероятность ошибки на бит.

Исполняемый код

%оценка ошибки по битам

bit_errors = 0;

for i=1:MessLength

if (BinaryMess(i) ~= Decode (i))

bit_errors = bit_errors +1;

end;

end;

%fprintf('Оценка вероятности ошибок по битам : %4.2f.\n', bit_errors/messageLength);

P_ERR(2, count)  = bit_errors/MessLength;



10

Вычислить вероятность ошибки на байт.

Исполняемый код

%оценка ошибки по байтам

bite_errors = 0;

for q=1:MessLength/k

for w=1:k

if(Decode((q-1)*6 +w) ~= BinaryMess ((q-1)*6 +w))

bite_errors = bite_errors +1;

break;

end;

end;

end;

%fprintf('Оценка вероятности ошибок по байтам : %4.2f.\n', bite_errors/messageLength*wordLength);

P_ERR(3, count)  = bite_errors/MessLength*k;



11

Вычислить вероятность ошибки на байт.

Исполняемый код

P_ERR(4, count) = 0;

for i=1:1:((CodeMinDist-1)/2+1)

P_ERR(4, count) = P_ERR(4, count) + (prod(1:n)/prod(1:i-1)/prod(1:n-i+1)) * P_error^(i-1) * (1-P_error)^(n-i+1);

end;

%fprintf('Оценка вероятности ошибок по байтам по схеме Бернулли : %4.2f.\n', P_ERR(4, count));

P_ERR(4, count) = 1 - P_ERR(4, count);




12

Построить график тероетической ошибки на бит исходя из корректирующей способности кода

Исполняемый код

figure;

plot(P_ERR(1, 1:length(P_ERR)), P_ERR(2, 1:length(P_ERR)), 'green');

hold on;

plot(P_ERR(1, 1:length(P_ERR)), P_ERR(3, 1:length(P_ERR)), 'red');

plot(P_ERR(1, 1:length(P_ERR)), P_ERR(4, 1:length(P_ERR

Похожие материалы

Информация о работе