Вы находитесь на странице: 1из 12

Министерство образования Республики Беларусь

Учреждение образования
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

Кафедра инфокоммуникационных технологий

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


«ИССЛЕДОВАНИЕ СОВЕРШЕННЫХ ЛИНЕЙНЫХ КОДОВ»

Выполнила:
Студентка гр. 740401
Щеглов А.А.

Проверил:
Саломатин С. Б.

Минск 2020
Цели лабораторной работы:
- Исследование кода Хэмминга;
- Исследование кода Голея;
- Исследование помехоустойчивости.

Ход работы:

1 Исследование кода Хэмминга.

1.1 Пример использования.

Код matlab:

clear all
clc

% Use a [n,k] Hamming code.


m = 4; n = 2^m-1; k = n-m;
[parmat,genmat] = hammgen(m); % Матрицы H и G
trt = syndtable(parmat); % Таблица синдромного %декодирования для
Simulink

%Задание матриц кодирования и проверки


G=genmat;

H=parmat;
%Вычисление таблицы смежных классов для A(z)
tcoset = syndtable(H)
%Определение параметров (n,k)исследуемого кода
kn=size(G)

%Определение числа информационных символов


k=kn(1)

%Формирование множества всех информационных слов


L=2^k;
for i=1:L, M(i,:)=dec2bin(i-1,k); end
%Формирование всех слов корректирующего кода
Codewords =rem(M*G,2);
%Вычисление dmin
dmin =min(sum((Codewords(2:L, :))'))

%Число исправляемых ошибок


tcorr=floor((dmin-1)/2);
%Построение распределения веса кода A(z)
xbins=[1:n];
Awt=hist(sum((Codewords(2:L, :))'),xbins);
stem(Awt)

Результат:

Рисунок 1.1 – Распределение веса кода A(z)

Рисунок 1.2 – Число исправляемых ошибок (tcorr)


Рисунок 1.3 – dmin

1.2 Исследование характеристик кода Хэмминга (7 4)

Код matlab:

clear all
clc

% Use a [n,k] Hamming code.


m = 3; n = 2^m-1; k = n-m;
[parmat,genmat] = hammgen(m); % Матрицы H и G
trt = syndtable(parmat); % Таблица синдромного
%декодирования для Simulink

%Задание матриц кодирования и проверки


G=genmat;

H=parmat;
%Вычисление таблицы смежных классов для A(z)
tcoset = syndtable(H)
%%%%%%%%%%%%%%
%Определение параметров (n,k)исследуемого кода
kn=size(G)

%Определение числа информационных символов


k=kn(1)
%Формирование множества всех информационных слов
L=2^k;
for i=1:L, M(i,:)=dec2bin(i-1,k); end
%Формирование всех слов корректирующего кода
Codewords =rem(M*G,2);
%Вычисление dmin
dmin =min(sum((Codewords(2:L, :))'))

%Число исправляемых ошибок


tcorr=floor((dmin-1)/2);
%Построение распределения веса кода A(z)
xbins=[1:n];
Awt=hist(sum((Codewords(2:L, :))'),xbins);
stem(Awt)

Результат:

Рисунок 1.4 – Распределение веса кода

Рисунок 1.5 – dmin

2 Исследование кода Голея

Код matlab:

clear all
clc
k = 12;
n = 24;
k1=12;
m=n-k1;

GenGol=[1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1
010000000000111110010010
001000000000110100101011
000100000000110001110110
000010000000110011011001
000001000000011001101101
000000100000001100110111
000000010000101101111000
000000001000010110111100
000000000100001011011110
000000000010101110001101
0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1];
parmatGol = gen2par(GenGol);

genmat=GenGol;
parmat=parmatGol;

trt = syndtable(parmatGol); % Produce decoding table

%Задание матриц кодирования и проверки


G=GenGol;

H=parmatGol;
%Вычисление таблицы смежных классов
tcoset = syndtable(H)
%%%%%%%%%%%%%%
%Определение параметров (n,k)исследуемого кода
kn=size(G)

%Определение числа информационных символов


k=kn(1)
%Формирование множества всех информационных слов
L=2^k;
for i=1:L, M(i,:)=dec2bin(i-1,k); end
%Формирование всех слов корректирующего кода
Codewords =rem(M*G,2);
%Вычислениеdmin
dmin =min(sum((Codewords(2:L, :))'))

%Число исправляемых ошибок


tcorr=floor((dmin-1)/2);
%Построение распределения веса кода
xbins=[1:n];
Awt=hist(sum((Codewords(2:L, :))'),xbins);
stem(Awt)

Результат:

Рисунок 2.1 – Распределение веса кода

Рисунок 2.2 – dmin

Рисунок 2.3 – Число исправляемых ошибок (tcorr)


3 Исследование помехоустойчивости программно

Матрица G используется из пункта исследования параметров кода.


Код matlab:

[K, N] = size(G);

M=10;%Количество испытаний
msg = randi([0 1],K*M,1)';
code = encode(msg,N,K,'linear/binary',G);

%Изменение SER
p=.75;
code_noise = rem(code+rand(N*10,1)'>p,2);
H=gen2par(G);
rcv = decode(code_noise,N,K,'linear/binary',G);
disp(['Error rate in the received code SER: ',...
num2str(symerr(code,code_noise)/length(code))])

%Вычисление BER
disp(['Error rate after decode BER: ',...
num2str(symerr(msg, rcv)/length(msg))])
%Error rate after decode: 0

Результат:
Вероятность 0.01 0.1 0.3 0.6 0.7 0.8
ошибки в
канале (по x)
BER ср(по y) 0.4416 0.51667 0.475 0.31667 0.133333 0.05833
7
Таблица 1 - Зависимость BER ср(Вероятность ошибки в канале) G;

Рисунок 3 - Зависимость BER ср(Вероятность ошибки в канале) G;


4 Моделирование «мягкого» и «жесткого» декодирования линейных
кодов

Код matlab:

clear all;
N=1e5;
k=4;
n=7;
snr_db=[0:9];
snr=10.^(snr_db/10);
s=size(snr,2);
u1=ones(1,n);
u0=-u1;
G=[1 0 0 0 1 1 1;0 1 0 0 1 0 1;0 0 1 0 1 1 0;0 0 0 1 0 1 1];%generator matrix
%Формирование информационных слов
L=2^k;
for i=1:L, M(i,:)=de2bi(i-1,K); end
for i=1:L, words(i,:)=M(i,:); end

%Формирование кодовых слов


codewords =rem(M*G,2)

% Нахождение минимального кодового расстояния

dmin =min(sum((codewords(2:L, :))'))

%codewords=zeros(2^k,n);

codewordspow=codewords;
codewordspow(codewordspow==0)=-1;

%Моделирование канала передачи


info_mat=randi([0,1],N,4,s);% формирование случайных
информационных бит для заданного отношения сигнал/шум в канале
%info_bits=reshape(info_mat',1,N*4);

H=[G(:,k+1:n)',eye(n-k)];
for i=1:s
code_sent(:,:,i)=mod((info_mat(:,:,i)*G),2);%код посылаемый через канал
end
code_sent_pow=code_sent;
code_sent_pow(code_sent_pow==0)=-1;%Переход от логических уровней
{0,1} к действительным числам {1, -1}
for i=1:s
code_rec(:,:,i)=awgn(code_sent_pow(:,:,i),snr_db(i));%Моделирование
канала АБГШ (awgn)
end

%«Жесткое решение»
code_decode_hard=ones(size(code_rec));
code_decode_hard(code_rec<0)=0;
info_decode_hard=zeros(size(info_mat));
for h=1:s
for i=1:N
dist=zeros(1,2^k);

%Декодирование по min расстоянию (ближайшего соседа)


for j=1:2^k
dist(j)=norm(mod(codewords(j,:)+code_decode_hard(i,:,h),2),1);
end
[minele,ind]=min(dist);
info_decode_hard(i,:,h)=words(ind,:);%Декодированные символы
end
%Моделирование вычислений BER

ber_hard_sim(h)=length(find(info_decode_hard(:,:,h)-info_mat(:,:,h)))/(4*N);

%Расчет BER по теории с использованием интеграла вероятности qfunc


p=qfunc(sqrt(snr(h)));
ber_hard_the(h)=0;

for l=2:n
ber_hard_the(h)=ber_hard_the(h)+nchoosek(n,l)*(p^l)*((1-p))^(n-l);
end
end
% Декодирование с «мягким решением»
info_decode_soft=zeros(size(info_mat));
for h=1:s
for i=1:N
dist=zeros(1,2^k);
for j=1:2^k
dist(j)=norm((codewordspow(j,:)-code_rec(i,:,h)),2);
end
[minele,ind]=min(dist);
info_decode_soft(i,:,h)=words(ind,:);
%декодирование информационных символов
end
ber_soft_sim(h)=length(find(info_decode_soft(:,:,h)-info_mat(:,:,h)))/(4*N);
%Моделированиевычисления BER
%Расчет BER потеории
ber_soft_the(h)=n*qfunc(sqrt(dmin*snr(h)))+n*qfunc(sqrt((dmin+1)*snr(h)))
+qfunc(sqrt(n*snr(h)));
end

% Визуализация
semilogy(snr_db,ber_hard_sim,'r')
hold on
semilogy(snr_db,ber_hard_the,'rx--')
semilogy(snr_db,ber_soft_the,'bx--')
semilogy(snr_db,ber_soft_sim,'b')
title('BER кривая для (n,k) кода')
xlabel('SNR в dB'),ylabel('BER')
legend('hard модель','hard теория','soft теория','soft модель')

Результат

Рисунок 4.1 - dmin

Рисунок 4.2 – BER кривая для (n, k) кода

Вывод: для обнаружения и исправления ошибок код должен быть


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