Здравствуйте, пытаюсь реализовать передачу сообщения как в реальных радионавигационных системах. Есть замечательная книга "Авиационная электросвязь", где перечислены все стандарты и форматы сообщений. Из нее получил сведения о том как дополнять сообщение кодом, который впоследствии можно было бы использовать для восстановления у траченых данных, собственно кодом Рида-Соломона.
Вот тут то у меня и начинаются сложности, реализовать пытаюсь с помощью Matlab.
Вот выдержка из книжки:
3.6.3.3.5 FEC приложения. FEC приложения вычисляется с использованием данных приложения с помощью
систематического (255, 249) кода Рида-Соломона (R-S) фиксированной длины.
3.6.3.3.5.1 Определяющий поле примитивный полином R-S кода,
, имеет следующий вид:
3.6.3.3.5.2 Образующий полином R-S кода,
, описывается выражением:
где
представляет собой квадратный корень из
, используемый для построения поля Галуа размером 28,
GF(256), а
– это
-й примитивный элемент в GF(256).
Вот тут у меня сразу возникает несколько вопросов:
1) Почему
? Есть ли этому причина?
2) Как это раскрыть так скобки можно? Не совсем понимаю. Я понял только про свободный член - там получается
и все отлично, но как считать промежуточные степени? Там отрицательные
получаются и я не очень знаком с арифметикой в полях Галуа, чтобы что-нибудь с этим поделать.
Но суть не в этом, в Mathlab существует очень полезная штука - Communications Toolbox для автоматизации процесса генерации кода Рида-Соломона. И простого получения степеней примитивного элемента позволяет нам добиться функция
Код:
rsgenpoly
, куда в качестве фактических параметров подается длинна всего сообщения, длинна полезного сообщения(т.е. за вычетом кода Р-С), десятичная запись примитивного полинома(В нашем случае
)
, и то самое
происхождение которого и вызвало у меня вопрос.
Иными словами, я хочу написать:
Код:
rsgenpoly(255,249,391,120)
И получить ответ
Код:
ans = GF(2^8) array. Primitive polynomial = D^8+D^7+D^2+D+1 (391 decimal)
Array elements =
1 176 186 244 176 156 225
Но получаю совершенно другое:
Код:
ans = GF(2^8) array. Primitive polynomial = D^8+D^7+D^2+D+1 (391 decimal)
Array elements =
1 217 99 62 217 130 23
Я не вполне понимаю откуда взялись эти числа.
Для того, чтобы удостовериться в правильности работы функции rsgenpoly я решил покатать по примерам, взял книжку: "Упрощение кодера Рида – Соломона при использовании альтернативных простых полиномов, образующих расширения полей Галуа Д. В. Клейко, Н. В. Лямин". И прогнал некоторые примеры, которые там предлагаются. И примеры из книжки работают просто идеально.
Почему же функция не работает на моем примере?