encode2

来源:百度文库 编辑:神马文学网 时间:2024/04/28 23:21:43

Семинары  Обучение  Лицензирование  Разработка  Подписка  Форум Регистрация
Matlab
Toolboxes
Simulink
Blocksets
Femlab
Полезное



Вход
Обработка сигналов и изображений\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(...);
Необязательные входные параметры:
ПараметрЗначение по умолчанию
formatbinary
genpolyДля циклических кодов —cyclpoly(n,k); для кодов БЧХ —bchpoly(n,k); для кодов Рида—Соломона —rspoly(n,k) или rspoly(n,k,field)
primpolygfprimdf(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). Порождающий полином для циклического кода (n, k) по определению имеет степень 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.
В оглавление \К следующему разделу \К предыдущему разделу

I Всероссийская научная конференция "Проектирование научных и инженерных приложений в среде MATLAB" (май 2002 г.)
II Всероссийская научная конференция "Проектирование научных и инженерных приложений в среде MATLAB" (май 2004 г.)
На первую страницу \Сотрудничество \MathWorks \SoftLine \Exponenta.ru \Exponenta Pro
E-mail:matlab@exponenta.ru
Информация на сайте была обновлена 02.08.05Copyright 2001-2005 SoftLine Co 
Наши баннеры
     
_xyz