Кодирование CCSDS Рида Соломона

Я работаю над проектом, в котором мне нужно закодировать 896 байт данных в 128-байтовое кодовое слово. Все спецификации для моего проекта определены CCSDS в этой статье примерно на 15-й странице pdf. http://public.ccsds.org/publications/archive/101x0b3s.pdf В этом документе явно не указаны несколько вещей: J=8, E=16 (255/223) и I=4.

Я читал эту (и множество других статей) несколько раз, но, кажется, я не понимаю, что происходит в малейшей степени. Я даже попробовал код, найденный на http://zxingnet.codeplex.com/SourceControl/latest#trunk/Source/lib/common/reedsolomon/GenericGF.cs

и у меня тоже не работает. Кто-нибудь работал с этим? Мне нужно какое-то направление, так как я чувствую себя потерянным после того, как так долго мучился с этим.

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


person Guernica88    schedule 25.03.2015    source источник
comment
Как вы можете закодировать 896 байтов в 128 байтах?   -  person all or None    schedule 01.05.2015


Ответы (2)


Я опаздываю на этот вопрос, но на всякий случай это может помочь кому-то еще:

Самый простой и распространенный метод реализации кода Рида-Соломона на цифровых компьютерах — использование кодирования RS (255, 223) CCSDS. Это кодирование определено CCSDS и десятилетиями широко использовалось в оборудовании, таком как зонды для дальнего космоса и спутники.

RS (255, 223) имеет следующие характеристики:

  • Каждый символ имеет 2^8 комбинаций (J = 8), поэтому каждый символ представляет собой байт.
  • Каждое кодовое слово имеет 2 ^ 8 - 1 символов, поэтому каждый закодированный блок имеет длину 255 байтов.
  • Объем данных, которые вы можете закодировать в блоке, составляет 223 байта.
  • Каждый блок содержит 32 байта данных четности для FEC (223 байта данных + 32 байта четности = 255-байтовый блок).
  • Не зная стираний (местоположений ошибок), можно исправить до 16 ошибок на блок (E = 16, это всегда равно количеству байтов четности / 2)
  • Когда места ошибок известны, можно исправить до 32 ошибок на блок (это всегда равно количеству байтов четности).
  • CCSDS указывает использовать полином генератора полей 1 + X + X^2 + X^7 + X^8, генератор кода с первым последовательным корнем = 112 и примитивным элементом 11.
  • CCSDS также задает полиномиальное представление с двойной базой, чтобы упростить реализацию кодера/декодера на специальном оборудовании. Это одна из функций, которая отсутствует во многих современных программных реализациях RS (255, 223), поскольку она не имеет практического применения для ЦП общего назначения, но по-прежнему требуется при обмене данными с устаревшим оборудованием. Определенно выясните, нужно ли вам это - это можно сделать, запустив обычный полиномиальный вывод через таблицу поиска до/после кодирования/декодирования.

Кодовое слово из 255 символов можно чередовать четыре раза (I = 4), чтобы получить общий размер блока 892. Это можно сделать для распределения пакетов ошибок передачи между каждым из кодовых слов, увеличивая шансы на успешную коррекцию кодового слова. Подробную информацию см. в спецификации, указанной ниже.

Я не уверен, что вы имели в виду под «128-байтовым кодовым словом», но это может иметь какое-то отношение к заполнению:

Поскольку размер символа 2^8 является довольно жестким ограничением, каждое кодовое слово должно иметь длину 255 байт. Однако, если вы не можете отправить 255-байтовый блок за один раз или предпочитаете более надежную защиту от ошибок, можно использовать заполнение для эффективного сокращения 255-байтового блока.

Заполнение работает, просто определяя некоторые из 223 байтов данных как заполнение вместо данных. Заполнение — это просто некоторая фиксированная последовательность значений, которую и отправитель, и получатель знают заранее (CCSDS называет это «виртуальным заполнением»). При кодировании к началу данных добавляется небольшое количество данных, чтобы сформировать полные 223 байта «данных», и они подаются в кодировщик как обычно. После кодирования заполнение удаляется с начала блока, создавая более короткий блок (точнее, данные и четность могут быть скопированы в меньший массив). Затем это передается.

При декодировании заполнение затем вставляется обратно в начало блока перед запуском декодера. Поскольку последовательность заполнения имеет известные фиксированные значения, вероятность того, что эти байты будут содержать ошибки, равна 0%. Это означает, что 16 байтов защиты от ошибок переместятся на остальную часть блока.

Таким образом, чтобы получить 127-байтовый блок из RS (255, 223), вы можете дополнить исходными 223 байтами все, кроме 95 байтов данных, а затем закодировать это. Ваш блок будет выглядеть так:

заполнение [128] + данные [95] + четность [32] = 255 байт

Затем удалите заполнение перед отправкой блока:

данные[95] + четность[32] = 127 байт

И, наконец, на стороне декодера добавьте отступ перед декодированием:

заполнение [128] + данные [95] + четность [32] = 255 байт

Фактически это код RS(127, 95), который предлагает 16 байтов FEC на 127-байтовый блок.

Стандарт CCSDS указывает, что виртуальное заполнение:

  • Должен состоять из всех нулей
  • Не должен передаваться
  • Не должна изменяться продолжительность фазы миссии на конкретном физическом канале.
  • Должен быть вставлен только в начале кодового блока
  • Должен быть вставлен только целым числом, кратным 8I битам.

Вам нужно придерживаться их только в том случае, если устаревшее устройство, с которым вы разговариваете, также строго их реализует (и если это строго CCSDS, так оно и будет).

Для реализации RS (255, 223) на С# у меня есть небольшая библиотека:

https://github.com/crozone/ReedSolomonCCSDS

Это было основано на реализации C Фила Карна, которая встречается везде, включая GNURadio и ОС Android.

Резюме CCSDS: «СИНХРОНИЗАЦИЯ ТМ И КОДИРОВАНИЕ КАНАЛОВ — ОБЗОР КОНЦЕПЦИИ И ОБОСНОВАНИЯ» (Раздел 5)

https://public.ccsds.org/pubs/130x1g2.pdf

CCSDS Ссылка: «СИНХРОНИЗАЦИЯ ТМ И КОДИРОВАНИЕ КАНАЛОВ» Раздел 4.

https://public.ccsds.org/Pubs/131x0b3e1.pdf

person Ryan    schedule 26.09.2018

Вот моя интерпретация протокола CCSDS:

J=8 означает 8 бит на символ (=1 байт). E=16 означает 16 ошибок, исправленных кодом RS.

Для этого требуется 32 символа четности, и таким образом кодовое слово RS имеет длину 255 байтов с 223 информационными байтами.

I=4 означает, что один блок перемежителя состоит из 4 кодовых слов.

Таким образом, общее количество информационных байтов, доступных в одном блоке, составляет 4*223 = 892 байта. Это на четыре байта меньше, чем 896, указанные в вашем вопросе. Я совершенно уверен, что вы неправильно прочитали 128-байтовое кодовое слово, так что, возможно, вы также неправильно прочитали числовые байты.

person Jens    schedule 07.05.2015