MATLAB.Exponenta
MATLAB и Simulink на русском
Технологии разработки и отладки
		сложных технических систем
 

Обработка сигналов и изображений\Communications Toolbox

Список функций CommunicationsToolbox: Помехоустойчивое кодирование и декодирование

  В оглавление \ К следующему разделу \ К предыдущему разделу

ENCODE
Кодирование данных с использованием блочных кодов

Синтаксис:

code = encode(msg,n,k,'linear/format',genmat);
code = encode(msg,n,k,'cyclic/format',genpoly);
code = encode(msg,n,k,'bch/format',genpoly);
code = encode(msg,n,k,'hamming/format',primpoly);
code = encode(msg,n,k,'rs/format',genpoly);
code = encode(msg,field,k,'rs/format',genpoly);
code = encode(msg,n,k);
[code,added] = encode(...);

Необязательные входные параметры:

Параметр Значение по умолчанию
format binary
genpoly Для циклических кодов — cyclpoly(n,k); для кодов БЧХ — bchpoly(n,k); для кодов Рида—Соломона — rspoly(n,k) или rspoly(n,k,field)
primpoly gfprimdf(n-k)

Описание:

Функция encode кодирует сообщения, используя один из следующих помехоустойчивых (корректирующих) блочных кодов:

  • Линейные блочные коды общего вида
  • Циклические коды
  • Коды Боуза—Чоудхури—Хоквингема (БЧХ)
  • Коды Хэмминга
  • Коды Рида—Соломона

Общая информация о синтаксисе:

Для всех кодов параметр n — длина кодового слова (кодовой комбинации), а параметр k — длина блока сообщения (информационной комбинации).

Параметр msg, который представляет исходное сообщение, может иметь различные форматы. В приведенной ниже табл. 1, которая относится ко всем методам кодирования, кроме кодов Рида—Соломона, описаны возможные форматы для параметра msg, соответствующие значения параметра format и форматы кодированного сообщения code. Аналогичная информация для кодов Рида—Соломона сведена в табл. 2. Примеры в таблицах приведены для k = 4 и (для кодов Рида—Соломона) m = 3. Если параметр format при вызове функции не указан, по умолчанию он принимает значение binary.

Замечание. Если значение 2n или 2k велико, следует применять формат binary и избегать использования формата decimal. Дело в том, что внутри функции в любом случае используется двоичный формат, а при преобразовании больших чисел между двоичным и десятичным форматами могут возникать значительные ошибки округления.

Таблица 1. Форматы представления сообщений для всех кодов, кроме кодов Рида—Соломона

Формат исходного сообщения msg Значение параметра 'format' Формат кодированного сообщения code
Двоичный (состоящий из нулей и единиц) вектор-столбец binary Двоичный (состоящий из нулей и единиц) вектор-столбец
Пример: msg = [0 1 1 0, 0 1 0 1, 1 0 0 1]'
Двоичная (состоящая из нулей и единиц) матрица, имеющая k столбцов binary Двоичная (состоящая из нулей и единиц) матрица, имеющая n столбцов
Пример: msg = [0 1 1 0; 0 1 0 1; 1 0 0 1]
Вектор-столбец, содержащий целые числа в диапазоне [0, 2k – 1] decimal Вектор-столбец, содержащий целые числа в диапазоне [0, 2n – 1]
Пример: msg = [6, 10, 9]'

Таблица 2. Форматы представления сообщений для кодов Рида—Соломона

Формат исходного сообщения msg (n = 2m – 1, где m — целое число, большее или равное 3) Значение параметра 'format' Формат кодированного сообщения code
Двоичная (состоящая из нулей и единиц) матрица, имеющая m столбцов binary Двоичная (состоящая из нулей и единиц) матрица, имеющая m столбцов
Пример: msg = [1 1 0; 1 0 1; 1 0 0; 0 1 1; 1 1 0; 1 0 1; 1 0 0; 0 1 1]
Двоичный (состоящий из нулей и единиц) вектор-столбец binary Двоичный (состоящий из нулей и единиц) вектор-столбец
Пример: msg = [1 1 0, 1 0 1, 1 0 0, 0 1 1, 1 1 0, 1 0 1, 1 0 0, 0 1 1]'
Матрица, имеющая k столбцов и содержащая целые числа в диапазоне [0, 2m – 1] decimal Матрица, имеющая n столбцов и содержащая целые числа в диапазоне [0, 2m – 1]
Пример: msg = [3, 5, 1, 6; 3, 5, 1, 6]
Матрица, имеющая k столбцов и содержащая целые числа в диапазоне [–1, 2m – 2] power Матрица, имеющая n столбцов и содержащая целые числа в диапазоне [–1, 2m – 2]
Пример: msg = [2, 4, 0, 5; 2, 4, 0, 5]

Конкретные варианты синтаксиса:

  • code = encode(msg,n,k,'linear/format',genmat)

Кодирует msg с помощью линейного блочного кода, описываемого порождающей матрицей genmat. Параметр genmat должен быть матрицей размером k на n и является обязательным.

  • code = encode(msg,n,k,'cyclic/format',genpoly)

Кодирует msg с помощью циклического кода, описываемого порождающим полиномом genpoly. Параметр genpoly является вектором-строкой, содержащим коэффициенты (в порядке возрастания степеней) двоичного порождающего полинома циклического кода. По умолчанию параметр genpoly имеет значение cyclpoly(n,k). Порождающий полином для циклического кода (nk) по определению имеет степень n – k и является делителем полинома xn – 1.

  • code = encode(msg,n,k,'bch/format',genpoly)

Кодирует msg с помощью кода БЧХ. Параметр genpoly является вектором-строкой, содержащим коэффициенты (в порядке возрастания степеней) двоичного порождающего полинома кода БЧХ (полином имеет степень n – k). По умолчанию параметр genpoly имеет значение bchpoly(n,k). В данном случае значение n должно быть равно 2m – 1 для некоторого целого m, большего или равного 3. Параметр k должен быть корректной длиной сообщения; его значение можно получить из второго элемента строки params, рассчитываемой командой params = bchpoly(n).

  • code = encode(msg,n,k,'hamming/format',primpoly)

Кодирует msg с помощью кода Хэмминга. В данном случае значение n должно быть равно 2m – 1 для некоторого целого m, большего или равного 3, а значение k должно быть равно n – m. Параметр primpoly — вектор-строка, содержащий двоичные коэффициенты (в порядке возрастания степеней) примитивного полинома над полем GF(2m), используемого для кодирования. По умолчанию primpoly — это примитивный полином, рассчитываемый с помощью вызова функции gfprimdf(m).

  • code = encode(msg,n,k)

То же самое, что code = encode(msg,n,k,'hamming/binary').

  • code = encode(msg,n,k,'rs/format',genpoly)

Кодирует msg с помощью кода Рида—Соломона. В данном случае значение n должно быть равно 2m – 1 для некоторого целого m, большего или равного 3. Параметр genpoly — вектор-строка, содержащий коэффициенты (в порядке возрастания степеней), порождающего полинома кода. Коэффициенты полинома являются элементами конечного поля GF(2m), представленными в экспоненциальном формате (см. замечание ниже). По умолчанию значение параметра genpoly рассчитывается с помощью функции rspoly.

Замечание. Все ненулевые элементы конечного поля GF(pm) могут быть представлены в экспоненциальном виде a c, где a  — примитивный элемент поля, а c — целые числа от 0 до pm – 2. В MATLAB для представления элементов конечных полей в экспоненциальном формате используются целые числа c, лежащие в указанном диапазоне, а нулевой элемент представляется значением –Inf. Представление элементов конечного поля в экспоненциальном формате не является однозначным, оно зависит от выбранного примитивного элемента.

  • code = encode(msg,field,k,'rs/format',genpoly)

То же, что и предыдущий вариант синтаксиса, но параметр field является матрицей, перечисляющей все элементы поля GF(2m) в следующем формате: матрица имеет m столбцов и 2m строк, элементы матрицы равны 0 или 1, строки представляют собой различные комбинации нулей и единиц. Такую матрицу можно сгенерировать, например, командой gftuple([-1:2^m-2]',m). Число столбцов матрицы (m) позволяет определить параметр n, равный 2m – 1. При данном способе вызова функция работает быстрее, чем при предыдущем.

  • [code,added] = encode(...)

Дополнительно возвращает параметр added, значение которого равно числу нулей, добавленных в конец параметра msg перед кодированием. Это может понадобиться, чтобы привести сообщение к “подходящему” размеру, который зависит от n, k, исходного размера матрицы msg и используемого кода.

Примеры.

Пример 1.

Приведенный ниже пример показывает использование трех различных форматов сообщения (двоичный вектор, двоичная матрица, целочисленный вектор) для кода Хэмминга. Три сообщения имеют одно и то же содержание, представленное в разных форматах; соответственно, то же самое можно сказать и про три созданных функцией encode кодированных сообщения.

m = 4; n = 2^m-1; % Длина кодового слова = 15
k = 11; % Длина блока сообщения
% Создаем 100 блоков сообщения по k бит каждый
msg1 = randint(100*k,1,[0,1]); % msg1 - Вектор-столбец
msg2 = vec2mat(msg1,k); % msg2 – матрица с k столбцами
msg3 = bi2de(msg2); % msg3 – столбец целых чисел
% Создаем 100 кодовых комбинаций по n бит каждая
code1 = encode(msg1,n,k,'hamming/binary');
code2 = encode(msg2,n,k,'hamming/binary');
code3 = encode(msg3,n,k,'hamming/decimal');
if ( vec2mat(code1,n)==code2 & de2bi(code3,n)==code2 )
disp('All three formats produced the same content.')
end

Пример 2.

В следующем примере сообщение кодируется циклическим кодом, затем добавляется шум и производится декодирование зашумленного сообщения с помощью функции decode. Полученная вами вероятность ошибок может отличаться от приведенной, поскольку в примере используются случайные числа.

n = 3; k = 2; % Используем циклический код (3,2)
msg = randint(100,k,[0,1]); % 100 блоков сообщения по k бит каждый
code = encode(msg,n,k,'cyclic/binary');
% Добавляем шум
noisycode = rem(code + randerr(100,n,[0 1;.7 .3]), 2);
newmsg = decode(noisycode,n,k,'cyclic'); % Пытаемся декодировать
% Вычисляем вероятность ошибок после декодирования
% зашумленного сообщения
[number,ratio] = biterr(newmsg,msg);
disp(['The bit error rate is ',num2str(ratio)])
The bit error rate is 0.08

Пример 3.

В следующем примере одно и то же сообщение кодируется с помощью кода Хэмминга, кода БЧХ и циклического кода. Перед кодированием с помощью кода БЧХ вызывается функция bchpoly, чтобы определить корректные значения размеров блока сообщения кодовой комбинации. В данном примере также создается еще один экземпляр того же кода Хэмминга, причем он задается как линейный код общего вида — с помощью порождающей матрицы и параметра 'linear'. Затем все кодированные сообщения декодируются и результаты сравниваются с исходным сообщением.

n = 6; % Начальный размер кодовой комбинации - 6
% Находим корректные параметры для кода БЧХ
params = bchpoly(n);
n = params(1,1); % Переопределяем размер кодовой комбинации,
% если предыдущее значение было недопустимым
k = params(1,2); % Длина блока сообщения
m = log2(n+1); % Определяем m, зная, что n=2^m-1
msg = randint(100,1,[0,2^k-1]); % Столбец целых чисел
% Кодируем разными методами
codehamming = encode(msg,n,k,'hamming/decimal');
[parmat,genmat] = hammgen(m);
codehamming2 = encode(msg,n,k,'linear/decimal',genmat);
if codehamming==codehamming2
disp('The ''linear'' method can create Hamming code.')
end
codebch = encode(msg,n,k,'bch/decimal');
codecyclic = encode(msg,n,k,'cyclic/decimal');
% Декодируем, воссоздавая исходное сообщение
decodedhamming = decode(codehamming,n,k,'hamming/decimal');
decodedbch = decode(codebch,n,k,'bch/decimal');
decodedcyclic = decode(codecyclic,n,k,'cyclic/decimal');
if (decodedhamming==msg & decodedbch==msg & decodedcyclic==msg)
disp('All decoding worked flawlessly in this noiseless world.')
end

Алгоритм.

В зависимости от используемого кода функция encode вызывает низкоуровневые функции hammgen, cyclgen, bchenco и rsenco.

Сопутствующие функции: decode, hammgen, cyclpoly, cyclgen, bchpoly, bchenco, rspoly, rsenco, rsencode, convenc.

  В оглавление \ К следующему разделу \ К предыдущему разделу

 

Поиск по сайту:

Система Orphus

Яндекс.Метрика