Декодер кодов Рида-Соломона Ф.В. Грошев ИППИ РАН groshev@iitp.ru А.А. Давыдов ИППИ РАН adav@iitp.ru Аннотация* 11 1 1 1 ... 1 1 01 2 3 ... 13 14 , H 2 4 6 11 13 01 ... 01 3 6 9 ... 9 12 4 где примитивный элемент поля GF (2 ) и В статье рассматривается реализация декодера кода Рида-Соломона с исправлением стираний и ошибок. Приведенный алгоритм является переработанной и дополненной версией алгоритма Питерсона [3]. Приводятся результаты тестовых испытаний декодера. 1. Введение Помехозащищенные коды Рида-Соломона (далее РС коды) позволяют улучшить технические параметры в системах передачи данных. С увеличением скоростей передачи информации по каналам связи становиться все более актуальна задача эффективной реализации декодеров РС кодов на современной элементной базе. 2. Постановка задачи Цель данной работы - спроектировать алгоритм декодирования с исправлением стираний и ошибок обобщенного расширенного 4 [16,12,5] кода РС над полем GF (2 ) . Алгоритм должен быть реализован в виде программы для DSP процессора (DSP – digital signal processing, цифровая обработка сигналов). Декодер предназначен для дальнейшего встраивания в конструкцию, декодирующую каскадные низкоплотностные коды большой длины [4], [5], где код РС используется как компонентный код. На вход декодера подаются вычисленные синдромы и вектор позиций стираний. На выходе формируются решение декодера («отказ от декодирования», «исправлено») и вектор с позициями и значениями ошибок и стираний. 3. Обозначения и преобразования Проверочная матрица [16,12,5] кода РС имеет вид * Эта работа поддержана государственным контрактом РФ №.02.514.11.4025 от 1 Мая 2007 г. элементы суть локаторы 0,1, , ,..., соответствующих позиций. Столбец из единицы и нулей соответствует расширенному коду РС. Для построения обобщенного кода РС вводится вектор случайных коэффициентов b (b0 , b1 ,..., b15 ) , где bi 0 . Проверочная матрица обобщенного кода РС имеет вид b0 b1 b2 b3 b4 ... b14 b15 2 14 0 b b b 2 b 3 ... b 13 b 14 3 15 1 2 4 14 . H 4 13 2 6 11 0 b1 b2 b3 b4 ... b14 b15 0 b b 3 b 6 b 9 ... b 9 b 12 1 2 3 4 15 14 Обозначим через v (v0 , v1 ,..., v15 ) принятое слово. Синдромы S j вычисляются следующим образом 15 15 i 0 i 1 S0 bi i , S j (i 1) j bi i , j 1, 2,3 . Опишем связи между номерами позиций N и их локаторами Loc ( N ) . если N 0 0, Loc( N ) N 1 . , если N 0 Обозначим Numb( L) номер позиции локатором L . если L 0 0, . Numb( L) log [ L] 1, если L 0 Введем обозначения: - количество стираний, 0 4 . t - количество ошибок, 0 t 2 . с 4. Алгоритм декодирования кода РС U w - локатор стирания, N w - номер стертoй позиции, Z w - величина ошибки в стертом символе, w 1,..., . X k - локатор ошибки, Tk - номер ошибочной позиции, Yk - величина ошибки, k 1,..., t . Стирания задаются номерами стертых позиций N w , w 1,..., . Локаторы стираний U w вычисляются по номерам стертых позиций. Шаг 0. Вычисление синдромов S0 , S1 , S2 , S3 и получение локаторов стираний по номерам стертых позиций Для декодирования используется нелинейная система из 4-х уравнений bN w 1 t w Z w bT Yk S0 w 1 k k 1 Если t j U wbN Z w w Введем стираний k 1 j X k bT Yk k усеченный ' ( x ) (1 U w x ) w 1 локаторов ' j 0 синдром учитывающий только следующим образом. j S u j , ошибки, Su , записывается u 0,1,..., 3 . j 0 Под искажениями понимаются ошибки и стирания t в совокупности. Введем обозначения: g t - число искажений, 0 g 4 . локатор - искажения, - значение Di искажения на позиции с локатором Li , Pi - номер искаженной позиции, i 1,..., g . Система уравнений для декодирования может быть переписана в виде g bP Di S0 . i 1 S0 S1 S2 S3 0 , то искажений нет отказываемся от декодирования стоп. Если 0 , вычисляем 1. Вычисление 0 , 1 ,..., ' коэффициентов усеченного многочлена локаторов стираний ( x ) . 0 1 . Если 0 , то переходим к шагу 2. ' min{ ,3} . ' ' j 1 j 1 1 U j , ' U j . Если ' 3 , то 2 U1U 2 U1U3 U 2U3 . 4 , то считаем, что есть только стирания, а ошибок нет, задаем t 0 и Если переходим к шагу 6. Шаг 2. Вычисление синдрома ошибок модифицированного i Su g LuibP Di Su , u 1, 2, 3 . i 1 i 1 Шаг Модифицированный Li i 0 если N w 0 w 1,..., . 0, U w Loc( N w ) N 1 w , если N w 0 j x j , 0 1 , ' min{ , 3} . Su 15 стоп. Если 4 , то продолжаем вычисления. Иначе S j , j 1, 2, 3 . многочлен 15 S0 bi i , S j (i 1) j bi i , j 1, 2,3 j S u j , u 0,1,...,3 . j 0 Шаг 3. Принятие решения о количестве ошибок i Обозначим Ai bP Di . Тогда систему можно или отказе от декодирования. записать так A2 Если ... Ag S0 L2 A2 ... Lg Ag S1 L2 A2 2 ... Lg Ag 2 S2 L2 A2 3 ... Lg Ag 3 S3 i A1 L A 1 1 2 L1 A1 L3 A 1 1 S0 S1 ... S3 0 , то считаем, что есть только стирания, а ошибок нет, задаем и переходим к шагу 6. Если 1 , вычисляем S12 S0 S2 . Если 0 , вычисляем 1 S22 S1S3 , t 0 2 S0 S3 S1S2 . D4 A4 / bP4 , Su* Su* Lu4 A4 , u 0,1, 2 . Если S0 0 &( 0 & 0 & 1 0 & 2 0 || 1& 0 || 2) то считаем, что произошла одна ошибка, и переходим к шагу 4. Если 0 & 0 & 2 0 , то считаем, что произошли две ошибки, и переходим к шагу 5. Если ни одно из предыдущих условий не выполняется, то отказываемся от декодирования стоп. Шаг 4. Локатор одиночной ошибки t 1, L 1 S1 . S0 то отказываемся от декодирования стоп. если L 1 0 0, P 1 Numb( L 1 ) log [ L 1 ] 1, если L 1 0 Переходим к шагу 6. Шаг 5. Локаторы двух ошибок t 2, B 2 , C 1 . 16 16 256 байт) квадратное уравнение x Bx C 0 . 2 Если уравнение не имеет решения, то отказываемся от декодирования стоп. Если уравнение имеет различные решения, то суть локаторы L1, L2 . Вычисляем если Li 0 0, , Pi Numb( Li ) log [ L ] 1, если L 0 i i i 1, 2 . Шаг 6. Вычисление значений искажений Lw U w w 1,..., Pw N w w 1,..., , , , , * g t . Su Su , u 0,1,..., g 1 , 5 g . Переходим к подшагу 6. : Подшаг 6.1. A4 ( L1 L2 L3 ) L3 L1L2 . Если знаменатель равен нулю, то отказываемся от декодирования стоп. D3 A3 / bP3 , Su* Su* Lu3 A3 , u 0,1 . Подшаг 6.3. A2 L1S0* S1* * , D2 A2 / bP , A1 S0 A2 2 L1 L2 D1 A1 / bP1 Шаг 7. Вычисление «синдрома искажений» (проверка выдачи некодового слова) g 0 S0 Ai i 1 3 S0* 2 S1* 1S2* S3* . (( L4 1 ) L4 2 ) L4 3 Если знаменатель равен нулю, то отказываемся от декодирования стоп. g , u Su Lui Ai , i 1 u 1, 2,3 . Если Решаем по таблице (объемом уравнения A3 L1L2 S0* ( L1 L2 )S1* S2* Подшаг 6.4. Если ( 1|| 2) & ( L 1 U1 ) || 2 & ( L 1 U 2 ) , решения Подшаг 6.2. 0 1 2 3 0 , то переходим к шагу 8, иначе отказываемся от декодирования стоп. Шаг 8. Выдача вектора ошибки. eP Di , i 1, 2,..., g , стоп. i 5. Особенности реализации При реализации использованы следующие приемы для ускорения работы декодера: операции сложения и умножения в поле Галуа сделаны таблицами; решение квадратного уравнения реализовано в виде таблицы, которая была вычислена заранее; выполнены все преобразования и упрощены все выражения; на вход декодера подаются предварительно вычисленные синдромы без принятого вектора; вместо выдачи полного вектора ошибки выдаются только позиции и значения ошибок; 6. Результаты проверки Для проверки работоспособности декодера написана тестовая программа. Эта программа на входе позволяет вводить количество стираний и ошибок для декодера, а так же количество повторений вызовов декодера. Ошибки и стирания расставляются во входном векторе декодера случайно (позиции не повторяются). На выходе тестовая программа выдает отчет о количестве исправлений, отказов от декодирования и декодирований в другие кодовые слова (ошибки декодирования). Для случаев, когда 2t d , d 5 тестовая программа выдаёт 100% исправлений. Для случаев, когда 2t d получены следующие данные: Для всех испытаний использовано 1000000 повторений: отказы от ошибки - число t - число стираний ошибок декодирования декодирования 3 4 1 2 0 1 1 2 2 3 100% 0% 100% 20,1% 65,2% 0% 100% 0% 79,9% 35,8% При всех испытаниях декодер не выдаёт не кодовых слов. В процессоре ADSP-TS201 работа декодера занимает следующее количество тактов: стирания 4 3 2 1 0 0 1 2 3 0 ошибки 0 0 0 0 1 2 1 1 1 2 такты 651 604 535 435 580 701 613 523 325 714 Благодарности Авторы благодарят С.А. Попова за помощь в написании тестовой программы. Литература [1] Р. Блэйхут, “Теория и практика кодов, контролирующих ошибки,” Москва, Мир, 1986. [2] Р.Г. Галлагер, “Теория информации и надежная связь” Москва, Советское радио, 1974. [3] У. Питерсон, “Коды, исправляющие ошибки,” Москва, Мир, 1976. [4] R. G. Gallager, “Low Density Parity-Check Codes,” Cambridge, MIT Press, 1963. [5] T. Høholdt, J. Justesen, “Graph codes with ReedSolomon Component codes,” ISIT 2006, Seattle, USA, July 9-14, 2006.