2017-01-11 11 views
0

Я реализую декодирование Рида Соломона для декодирования QR-кодов с использованием C++. Я реализовал основную часть декодирования и обнаружения ошибок до сих пор. Я придерживался Руководства ISO/IEC 18004: 2006. Как я видел в Приложении B: шаги декодирования ошибок, Синдромы S (i) рассчитываются как S (i) = R (a^i). Предположим, что мы имеем High Error Correction Level, поэтому у нас есть 9 кодов данных и 17 кодовых слов с исправлением ошибок, которые дают нам в общей сложности 26 кодовых слов, когда мы находимся в QR-кодах версии 1. Итак, я предполагаю, что показан многочлен R (x) в Pg.76 стандарта ISO/IEC 18004: 2006 будет представлена ​​последовательность из Кодов слов и кодов ошибок с правильной мощностью x соответственно. Таким образом, S (i) = R (a^j), где i = 0 ... 15 и j = 0 ... 25 для высокого уровня коррекции ошибок. Но когда я запускаю свой код, и поскольку у меня есть целая матрица QR Code без ошибок, я ожидаю, что все синдромы будут равны нулю, я беру в результате ненулевые синдромы. Я понял что-то неправильно в расчете Синдрома при Арифметике поля Галуа через Рид Соломон Декодирование?Рид Соломон Декодирование - Коррекция ошибок - Расчет синдромов

+1

Это скорее математический вопрос о кодах Рида-Соломона, чем вопрос на C++, и ваш вопрос не связан с деталями C++. Попробуйте удалить тег C++. Вы можете посмотреть на математический раздел stackexchange. – doug

ответ

1

После просмотра ссылок на QR-код, для версии 1, уровень H, с 9 байтами данных и 17 байтами исправления ошибок, с использованием генераторного полинома g (x) = (x-1) (xa) (xa^2). .. (xa^(16)), вы должны использовать синдромы S (i) = R (a^i) для i = 0 до 16. В случае без ошибок все 17 синдромов должны быть равны нулю.

Там приличная вики статья для исправления ошибок Рида-Соломона:

http://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction

вики статья содержит ссылку на Nasa технологий краткое RSECC учебник:

http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19900019023.pdf

Ссылка на C исходный код для консольной программы, демонстрирующий методы RSECC для 8-битного поля (пользователь выбирает из 29 возможных полей). Я использую компиляторы Microsoft или Visual Studio для ее компиляции и Windows для ее запуска, но он должен работать на большинстве систем.

Примечание. Я обновил демо-программу ecc, чтобы обрабатывать стирания в дополнение к ошибкам, на всякий случай, когда это может быть полезно. Также добавлен код для вычисления значения ошибки полинома Omega в случае, если метод Евклида не используется. Ссылка такая же, как и раньше:

http://rcgldr.net/misc/eccdemo8.zip


Обновление на основе вопросов в комментариях:

Мой вопрос, о котором GF (2^8):

GF(2^8) is based on 9 bit polynomial 
     x^8 + x^4 + x^3 + x^2 + 1 = hex 11d 
     primitive is x + 0 (hex 2) 

При поиске ссылок QR-кода используются разные генераторные полиномы в зависимости от уровня коррекции: L (низкий), M (средний), Q (качество), H (высокий).

Вопрос о декодировании с использованием матриц. В работе Sklar показано декодирование с использованием линейных уравнений и инверсии матрицы. Эта процедура должна принять максимальный случай ошибки t, который будет равен полу (e/2), где e - количество байтов коррекции ошибок (также называемых байтами четности или избыточными байтами). Если детерминант равен нулю, попробуйте t -1 ошибок, если это ноль, попробуйте t -2 ошибки и т. Д., Пока детерминант не равен нулю или t не будет сведен к нулю.

Методы декодирования Euclid или Berlekamp Massey автоматически определят количество ошибок.

Во всех случаях, если ошибок больше t, есть вероятность, что произойдет некорректная коррекция в зависимости от шансов создания т-мест, где ни один из них не находится за пределами допустимого диапазона. Если какое-либо из мест t, обнаруженных при исправлении ошибок, выходит за допустимые пределы, то обнаруживается некорректируемая ошибка.


Update # 2

Я сделал краткий обзор документа ISO.

Генерирующий многочлен (x - 1) (x - 2) (x - 2^2) ..., поэтому проверяемые синдромы S (0) - S (n - 1), как вы упомянули ранее , а в случае нулевых ошибок все синдромы S (0) - S (n-1) должны быть равны нулю.

Документ ISO использует термин кодовые слова для обозначения байтов (или символов), но в большинстве статей ecc термин кодовое слово относится к массиву байтов, включая байты с байтами данных и ошибок, и часто называются байты исправления ошибок байты четности, избыточные байты или байты остатка. Поэтому имейте это в виду, если читаете другие статьи ecc.

В документе ISO упоминаются «стирания» и «ошибки», которые являются терминологией RSECC. «Erasures» ссылаются на плохие (или потенциально плохие) байты данных в известных местах, обнаруженных вне RSECC. «Ошибки» относятся к плохим байтам, которые не обнаружены вне RSECC, и определяются только во время декодирования RSECC. Затем в документе отмечается, что не существует некорректных шаблонов бит данных, что подразумевает отсутствие обнаружения «стирания». Затем он добавляет к путанице, показывая уравнение, которое включает в себя стирание и количество ошибок.

Если вам интересно, файл PDF Nasa на RSECC объясняет обработку стирания, начиная со страницы 86, но я не думаю, что это относится к QR-кодам.

http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19900019023.pdf

Возвращаясь к документу ISO, он использует P отметить номер или исправление ошибок байт, используемые для защиты misdecode, в отличие от используемого для коррекции. Это показано в таблице 9 на странице 38. Для версии 1, которая, кажется, что вы используете, переосмысливая:

error correction level 
| number of data bytes 
| | number of ecc bytes used for correction 
| | | number of ecc bytes used for misdecode protection (p) 
| | | | correction capability 
L 19 4 3 2/26 ~ 07.69% 
M 16 8 2 4/26 ~ 15.38% 
Q 13 12 1 6/26 ~ 23.08% 
H 9 16 1 8/26 ~ 30.77% 

Учитывая, что эта таблица показывает, что ожидаемая возможность коррекции выполняется без использования подчисток , то даже если бы были обнаружены стирания, они не нужны.

С GF (2^8) имеется 255 (не 256) возможных мест ошибок, которые могут быть сгенерированы декодированием RSECC, но в версии 1 имеется только 26 действительных местоположений. Любое генерируемое местоположение за пределами 26 действительных местоположений будет обнаружением ошибки, которую невозможно исправить. Таким образом, для L уровень 3 p байт переводится как коэффициент неправильной коррекции на 1/(2^24), а диапазон местоположения умножает это на (26/255)^2 на вероятность вероятности 6.20E-10. Для H уровень, 1 p Баланс переводится как коэффициент неправильной коррекции (1/2^8) и диапазон местоположения (26/255)^8 для вероятности ~ 4.56E-11.

Обратите внимание, что для версии 2, р = 0 для уровней М, Q, Н, опираясь на диапазон местонахождения (44/255)^(8, или 11, или 14) для miscorrection вероятности 7.87E-7, 4.04E-9, 2.07E-11.

+0

Предполагая, что у нас высокий уровень коррекции ошибок, у нас есть 9 кодов данных и 17 кодовых слов с исправлением ошибок = 26 кодовых слов в общей сложности для QR-кодов версии 1. Кроме того, для High ECL синдромы, необходимые для расчета, равны 16, S0 ... S15, следуя ISO/IEC для QR-кодов, вызывают генераторные полиномы, начиная с a^0, т. Е. G (x) = (xa^0) * (xa^1) * ... Итак, R (x) = DC + ECC. Мой вопрос заключается в том, что кодовые слова данных и ошибок из r (x) poly заданы как: сначала наименее значимые и так далее ... – dimkatsi91

+0

Спасибо. Кроме того, для всех, кто подходит к этой теме, я должен сказать, что нашел следующий набор заметок: http://mathcs.holycross.edu/~little/MSRI-UP2009/LecturesWeek3Handouts.pdf достаточно хорошо для понимания расширенного евклидова алгоритма для кодов Рида Соломона в полях Галуа. – dimkatsi91

+0

http://download.adamas.ai/dlbase/Stuff/!ISO/ISO_IEC-18004-2006.pdf – dimkatsi91