Я опаздываю на этот вопрос, но на всякий случай это может помочь кому-то еще:
Самый простой и распространенный метод реализации кода Рида-Соломона на цифровых компьютерах — использование кодирования 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