OPISIS_LAB5v2
.pdfs 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).
Рисунок 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