Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

OPISIS_LAB5v2

.pdf
Скачиваний:
12
Добавлен:
24.12.2021
Размер:
1.16 Mб
Скачать

s rH T

(c e)H T

cH T eH T

(31)

0 eH TeH T

Таким образом, синдром не зависит от переданного кодового слова c и

является исключительно функцией шаблона ошибки e . Можно определить, что если два вектора ошибок e и e имеют один и тот же синдром, то векторы ошибок должны отличаться ненулевым кодовым словом.

s eH T e H T

 

 

 

H

T

0

(32)

e e

 

 

c C

 

e e

 

Далее приведена функция Matlab getSyndromeTable для проверки вышеупомянутых моментов. В этой функции мы пытаемся сгенерировать векторы синдромов для всех записей в стандартном массиве, приведенном в таблице 1.

Результат (полученный путем полного перебора S в коде Matlab) представлен в таблице 2. Из этой таблицы мы отмечаем, что синдром одинаков для данной строки и отличается только в случае изменения лидера смежного класса (т. е. изменения строки). Синдромом для всех допустимых кодовых слов являются нули (верхняя строка). Построение таблицы синдромов требует полного перебора и становится невозможным для больших кодов.

Программа 7: getSyndromeTable.m: Построение таблицы синдромов для заданной матрицы генератора

function [syndromeTable] = getSyndromeTable(G)

%function to construct the syndrome table for a given standard_3 %form generator matrix G. Returns a sorted cell array whose

%first column is the syndromes (s=r.H?T) in decimal and the %second column is the estimated error pattern (e').

%G =[0 1 1 1 1 0 0; 1 0 1 1 0 1 0;1 1 0 1 0 0 1];%to test H = gen2parmat(G);%Corresponding parity-check matrix [stdArray] = standardArray(G);%construct standard array A = stdArray; B = H.';

%multiply each element in the standard array with H?T for syndromes S_full = cell(size(A));%for syndromes of all patterns in std array for ii = 1:numel(A)

S_full{ii} = mod(A{ii}*B,2); end

%celldisp(S_full,'syndrome Tbl');%display syndrome for all patterns %syndromeTable is constructed by extracting the syndromes

%(first column) from S and the %coset leaders (first columns) from A %Syndrome Table is sorted according to the syndrome column S_dec=bi2de(cell2mat(S_full(:,1)),'left-msb');%syndrome in decimal syndromeTable = [num2cell(S_dec) A(:,1)];%unsorted table %celldisp(syndromeTable,'unsorted syndrome table'); %to display syndromeTable = sortrows(syndromeTable,1);%sorted table %celldisp(syndromeTable,'sorted syndrome table'); %to display

Из уравнения (32) следует, что декодирование может быть выполнено путем вычисления синдрома принятого слова, нахождения соответствующего шаблона ошибки и вычитания шаблона ошибки из принятого слова. Это устраняет необходимость хранить все векторы, как при стандартном декодировании массива,

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

Таблица 3: Синдромы s rH T для стандартного расположения, приведенного в таблице2.

Классы смежности в таблице 1 находятся во взаимно однозначном соответствии с синдромами, перечисленными в таблице 4.1, поэтому декодирование может быть выполнено с помощью меньшей таблицы с двумя столбцами, в которой первый столбец перечисляет синдром, соответствующий

смежному классу, а во втором столбце перечислены лидеры смежного класса.

Стоит отметить, что функция Matlab getSyndromeTable возвращает отсортированную таблицу синдромов, в которой записи отсортированы по синдромам. Однако записи, показанные в таблице 1, не отсортированы.

Простая двоичная симметричная система связи моделируется в следующем тестовом сценарии, чтобы проиллюстрировать концепцию декодирования

синдрома. Пример выполнения

тестового сценария генерирует кодовое слово

c 1010101 для входного сообщения

x 101. Для случайно выбранной 1-битной

комбинации

ошибок

e 0001000

полученное слово на выходе двоичного

симметричного

канала

будет

r 1011101

В приемнике декодер

вычисляет

s rHT 0001,

который будет

указывать на

запись e 0001000 в

таблице 4.

Переданное

кодовое слово можно

оценить

как c r e 1010101. Декодер

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

Таблица 4: Таблица декодирования синдромов для матрицы генератора,

Программа 8: test_syndrome_decoding.m: скрипт для тестирования декодирования с

использованием таблицы синдромов

%Demonstrate error correction using Syndrome table decoding clearvars; clc;

G = [0 1 1 1 1 0 0; %Sample Generator matrix to test 1 0 1 1 0 1 0; 1 1 0 1 0 0 1];

[k,n] = size(G); %derive n and k from the G matrix H = gen2parmat(G); %find the H matrix

%Syndrome table for G, index sorted according to syndromes s=rH?T syndromeTable = getSyndromeTable(G);

%Randomized simulation to test the communication chain %--------Transmitter with encoder-------------------

x = rand(1,k) > 0.5 %randomized input message to block encoder c = mod(x*G,2) %codeword generated by the block encoder %--------Channel----------------------

d = 1; %d-bit error pattern to test with

%all possible combinations of d-bit error patterns [E,nRows,nCols] = error_pattern_combos(d,n);

%randomly select a d-bit error pattern from the matrix of %all d-bit error patterns

index = ceil(rand * size(E,1));

e = E(index,:) %randomly selected error pattern

r = mod(c + e,2) %received vector containing errors %--------Receiver with syndrome table decoder---------------------

s = mod(r*H.',2) %find the syndrome

s_dec = bi2de(s,'left-msb') %sorted syndomes (first column in table) %read corresponding error pattern from second column errorEst=syndromeTable(s_dec+1,2);%point at index s_dec and return e errorEst = cell2mat(errorEst) %to convert cell to matrix recoveredCW = mod(r - errorEst,2) %recovered codeword

if (recoveredCW==c), disp('Decoder success'); else

disp('Decoder error'); end

Некоторые классы линейных блочных кодов Некоторые линейные блочные коды, которые часто используются на практике,

кратко описаны в этом разделе.

Коды-повторения

Двоичный код с повторением, обозначенный как n,1 код, представляет собой линейный блочный код, имеющий два кодовых слова длины n: кодовое слово, состоящее только из нулей, и кодовое слово из всех единиц. Он имеет

кодовую скорость R 1/ n

и минимальное

расстояние

dmin

n .

Генераторная

матрица и матрицы проверки на четность имеют

размер

1 n

и n 1 n

соответственно.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

0

0

0

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

G 1 1 1

1

H

0

1

0

0

1

 

 

 

 

0

1

0

 

 

(33)

0

1

 

 

 

 

 

 

 

 

0

1

 

 

 

 

 

 

 

0

0

1

 

 

 

 

 

 

0

1

 

 

Коды Хэмминга

Линейные двоичные коды Хэмминга подпадают под категорию линейных

блочных кодов, которые могут исправлять однобитовые ошибки. Для каждого

 

 

 

 

 

 

целого числа p 3 (количества битов четности) существует

 

2p 1,

2p p 1 код

Хэмминга.

Здесь 2p 1 -

количество символов в кодированном кодовом слове, а

2p p 1

- количество

информационных символов, которые

кодер может

принимать

одновременно. Все такие коды Хэмминга имеют

минимальное

расстояние Хэмминга dmin 3, и, таким образом, они могут исправлять любую одиночную битовую ошибку и обнаруживать любые две битовые ошибки в полученном векторе. Характеристики общего n, k кода Хэмминга приведены

ниже.

 

Длина кодового слова : n 2p 1

 

Количество информационных символов : k 2p p 1

 

Количество символов чётности : n k p

(34)

Минимальное расстояние : dmin 3

 

Возможное число исправляемых ошибок : t 1

 

С простейшей конфигурацией p 3, мы получаем самый простой

(7,4)

двоичный код Хэмминга. Блочный кодер принимает блоки 4-битной информации,

добавляет 3 бита четности к каждому такому блоку и производит 7-битные блоки,

закодированные по Хэммингу. Коды Хэмминга могут быть реализованы в систематической или несистематической форме. Систематический линейный блочный код может быть преобразован в несистематическую форму преобразованиями элементарных матриц. Далее описывается систематический код

Хэмминга.

 

 

 

 

 

 

 

 

 

Пусть кодовое слово, принадлежащее (7,4) коду Хэмминга, представлено как

 

D D D D P P P

 

, где D представляет информационные биты, а P представляет

1

2

3

4

1

2

3

 

биты четности в соответствующих битовых позициях. Учитывая информационные биты, биты четности вычисляются из трех линейно независимых уравнений с использованием сложения по модулю 2.

P D D

D

 

1

1

2

3

 

P2

D2 D3

D4

(35)

P3 D1 D3 D4

На рисунке 9 показан общий процесс вычисления битов четности для кода Хэмминга (7,4).

c mG

Рисунок 9 – Вычисление битов четности для (7,4) кода Хэмминга

На стороне передатчика кодер Хэмминга реализует матрицу генератора - G.

Легче построить матрицу генератора из линейных уравнений, перечисленных в

(35). Линейные уравнения показывают, что информационный бит D1 влияет на вычисление четностей в P1 и P3 . Точно так же информационный бит D2 влияет на

P1 и P2 , D3 влияет на P1 , P2 и P3 , а D4 влияет на P2 и P3 .

 

D D D D P P P

 

 

 

1

 

2

3

4

1

2

3

 

 

 

1

0

0

0

 

1

0

1

 

 

 

1

0

0

 

1

1

 

 

(36)

G

0

 

0

0 0

1

0

 

1

1

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

0

1

 

0

1

1

 

 

Кодер принимает 4-битный блок сообщения m, умножает его на порождающую матрицу G и генерирует 7-битовые кодовые слова c. Обратите внимание, что все операции (сложение, умножение и т.д.) Выполняются по модулю

2.

(37)

Учитывая матрицу генератора, ниже дается фрагмент кода Matlab для создания кодовой книги, содержащей все возможные кодовые слова (c C) .

Результирующая кодовая книга C может использоваться в качестве справочной таблицы при реализации кодера. Эта реализация позволит избежать повторного умножения входных блоков и матрицы генератора. Список всех возможных

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

Программа 9: Генерация всех возможных кодовых слов из матрицы генератора

%program to generate all possible codewords for (7,4) Hamming code G=[ 1 0 0 0 1 0 1;

0 1 0 0 1 1 0;

0 0 1 0 1 1 1;

0 0 0 1 0 1 1];%generator matrix - (7,4) Hamming code m=de2bi(0:1:15,'left-msb');%list of all numbers from 0 to 2?k codebook=mod(m*G,2) %list of all possible codewords

Три проверочных уравнения, показанные в уравнении (35), могут быть выражены вместе как матрица проверки на четность - H, которую можно использовать на стороне приемника для обнаружения и исправления ошибок.

Таблица 5: Все возможные кодовые слова для (7,4) кода Хэмминга

D D D D P P P

 

1

2

3

 

4

1

2

3

 

1

1

1

0

 

1

0

0

(38)

H 0 1

1

1

 

0

1

0

 

 

 

 

 

 

 

 

 

 

 

1

0

1

1

 

0

0

1

 

 

 

 

 

 

 

 

 

 

Используя функцию gen2parmat, можно проверить матрицу проверки на четность, показанную в уравнении 38. Таблица синдромов для кода Хэмминга может быть построена с помощью функции getSyndromeTable.

Программа 10: Построение матрицы проверки на четность и таблицы синдромов

G=[ 1 0 0 0 1 0 1; %generator matrix for (7,4) Hamming code 0 1 0 0 1 1 0; 0 0 1 0 1 1 1; 0 0 0 1 0 1 1];

H = gen2parmat(G) %find the H matrix

%Syndrome table for G, index sorted according to syndromes s=rH?T syndromeTable = getSyndromeTable(G)

Моделирование производительности декодирования кодов Хэмминга В этом разделе рассматривается производительность по коэффициенту

ошибок по битам системы связи BPSK по каналу AWGN. Теоретическая BER

некодированной системы BPSK берется за основу, с которой сравниваются характеристики двоичной линейной кодированной системы Хэмминга. Для кодированной системы при моделировании учитываются как декодирование с жестким решением, так и декодирование с мягким решением. Выполнено моделирование работы кода Хэмминга (7,4) с порождающей матрицей G (7,4) и

кода Хэмминга (15,11) с порождающей матрицей G (15,11).

 

 

 

 

 

 

 

 

1

0

0

0

0

0

0

0

0

0

0

0

0

1

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

1

0

0

0

0

0

0

0

0

0

0

1

0

1

 

 

 

 

 

 

 

 

 

0

0

1

0

0

0

0

0

0

0

0

0

1

1

0

 

 

 

 

 

 

 

 

 

0

0

1

0

0

0

0

0

0

0

0

1

1

1

 

 

1

0

0

0

1

1

0

0

 

 

0

0

0

0

1

0

0

0

0

0

0

1

0

0

1

(39)

 

0 1

 

 

 

 

1

 

0

0

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

G(7,4)

 

0

1

0

0

1

 

G(15,11) 0

0

0

0

0

1

0

0

0

0

0

1

0

1

0

 

0

1

0 0 0 0 0 0 1 0

0

0

0

1

0

1

1

 

 

 

 

 

 

 

 

 

 

0 0

0

1

1

1

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

0

0

0

0

0

1

0

0

0

1

1

0

0

 

 

 

 

 

 

 

 

0

0

0

0

0

0

0

0

1

0

0

1

1

0

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

0

0

0

0

0

0

0

1

0

1

1

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

0

0

0

0

0

0

0

0

1

1

1

1

1

 

Для декодирования с жестким решением кодированной системы Хэмминга мы используем подход синдромного декодирования. Функция add_awgn_noise

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

Программа 11: perf_hamming_bpsk_awgn.m: выполнение мягкого / жесткого

декодирования кодов Хэмминга

%BPSK over AWGN (complex baseband model) with Hamming coding clearvars; clc;

nBits =10^6; %number of source bits

EbN0dB = -2:1:12; % Eb/N0 range in dB for simulation MOD_TYPE='PSK'; %Modulation type

M=2; %For BPSK -> 2-PSK %Block code definitions

G=[ 1 0 0 0 1 1 0; %generator matrix for (7,4) Hamming code 0 1 0 0 1 0 1; 0 0 1 0 0 1 1; 0 0 0 1 1 1 1];

%G =[1 0 0 0 0 0 0 0 0 0 0 0 0 1 1;%G matrix (15,11) Hamming code

%0 1 0 0 0 0 0 0 0 0 0 0 1 0 1;

%0 0 1 0 0 0 0 0 0 0 0 0 1 1 0;

%0 0 0 1 0 0 0 0 0 0 0 0 1 1 1;

%0 0 0 0 1 0 0 0 0 0 0 1 0 0 1;

%0 0 0 0 0 1 0 0 0 0 0 1 0 1 0;

%0 0 0 0 0 0 1 0 0 0 0 1 0 1 1;

%0 0 0 0 0 0 0 1 0 0 0 1 1 0 0;

%0 0 0 0 0 0 0 0 1 0 0 1 1 0 1;

%0 0 0 0 0 0 0 0 0 1 0 1 1 1 0;

%0 0 0 0 0 0 0 0 0 0 1 1 1 1 1];

[k,n] = size(G); %derive n and k from the G matrix H = gen2parmat(G); %find the H matrix

syndromeTable = getSyndromeTable(G); %syndrome table for G m=de2bi(0:1:2^k-1,'left-msb');%list all numbers from 0 to 2^k-1 C=mod(m*G,2); %list of all possible codewords (code book) %EcN0dB calculation to account for overheads

EcN0dB = EbN0dB + 10*log10(log2(M)) + 10*log10(k/n); BER_Hamming_Hard = zeros(1,length(EbN0dB));%simulated BER (Hard)

for i=1:length(EcN0dB)

%---- Transmitter - Block encoding, BPSK modulation-------

x =rand(1,nBits) > 0.5; %stream of random information bits %append zeros to account for block size of encoder

x =[x zeros(1,k-mod(nBits,k))]; %reshape information stream to blocks

m = reshape(x,k,length(x)/k).'; %message blocks

cBlocks = mod(m*G,2);%codewords generated by the block encoder c= cBlocks.'; c = c(:).';%serialize codewords into one stream y = 2*c-1;%BPSK modulation

%---------AWGN channel --------------------

r = add_awgn_noise(y,EcN0dB(i));%add AWGN noise

%--------Hard decision decoding---------

rHard = (r>=0);%BPSK demodulation (Hard) rHardBlks=reshape(rHard,n,length(rHard)/n).';%blocks of length n syndrome = mod(rHardBlks*H.',2); %find the syndrome

syndrome = bi2de(syndrome,'left-msb');%decimal for indexing %1st column in syndrome table is syndrome, 2nd column is error errorEst=cell2mat(syndromeTable(syndrome+1,2));%return errors cHardBlks = mod(rHardBlks-errorEst,2);%recovered codewords mHardBlks = cHardBlks(:,1:k);%strip off parity bits

Соседние файлы в предмете Основы построения инфокоммуникационных систем и сетей