ГОСТ Р ИСО/МЭК 16022 — 2008
S /-A i + S/L, ♦ --♦ S ^ L /.1. = SV.1;
где/= /72.
Составляют полином указания местонахождения ошибок
Цх) = L^,x» + Lh2xh’ + ... + L0x + 1.
изу величин L. вычисленных выше. Вычисляют Цх) для х = 2* . где к = от 0 до л - 1. где л — общее число
кодовых слов в символе.
Как только Ц2Л) = 0. позиция ошибки определяется как (л - 1) - к. Если найдено больше местоположений
ошибок, чем значение у, данный символ невозможно исправить.
Сохраняют местоположения ошибок в m переменных указателях местоположения ошибок от Е0догде
т — число найденных местоположений ошибок. Составляют и решают систему т уравнений с т неизвестными от
XDдо Хт _, (значения ошибок), используя переменные указатели местоположения ошибок и первые т синдромов
S:
E0x0+£1x , +...+£l„.1xrt>. t =s0:
E i Х0 + £,2X, +...+ E(m_ J Xm_1= S,:
£03Х0 + £,3X, +...♦ £(Л1. „ 3Xm_, = S*;
Е ^ Х ^ Е Г Х , +...+ £|Я_,)-Х /я_, =Sm.v
Добавляют значения ошибок от Х0 доХт . , к значениям знаков символа в соответствующих местоположени
ях ошибок от £0до £т _, для исправления ошибок.
П р и м е ч а н и е — £0
......
£т -д являются корнями полинома указателя местоположения ошибок.
Указанный алгоритм, написанный на языке программирования С. можно приобрести в международной
организации AIM Inc. на дискете разработчиков Data Matrix [3).
Е.З Вычисление кодовых слов исправления ошибки
Следующий пример программы на языке программирования С вычисляет кодовые слова исправления
ошибки для заданной входной строки данных длиной end», записанной в целочисленном массиве wd[). Функция
ReedSolomon() сначала генерирует таблицы логарифмов и антилогарифмов для поля Галуа размером «gf» (для
символов версии ЕСС 200 оно равно 28) с примитивным полиномом «рр» (для символов версии ЕСС 200. равным
301), затем использует их в функции prod(), сначала для вычисления коэффициентов порождающего полинома
степени «пс». а затем для вычисления «пс» дополнительных проверочных кодовых слов, которые добавляют к
кодовым словам данных в массиве wd[).
Г «prod(x. у. tog .alog. gf)» returns the product «X» times «у» 70
int prod(int x. int y. int ’tog. int ’alog, int gf) {
if (!x || !y) return 0:
ELSE return alog{(log[xl + log[yJ) % (gf-1)]:
}
/* «ReedSolomon(wd, nd. nc. gf.pp)» takes and» data codeword values in wd() 7
/’ and adds on «пс» check codewords, all within GF(gf) where «gf» is a 7
/’ power of 2 and «рр» is the value of its prime modulus polynomial
void ReedSolomon(int ‘wd. int nd. int nc. int gf. int pp) {
int i. j. k. ’log.’alog/c:
/* allocate, then generate the log & antilog arrays: 73>
log = malloc(sizeof(int) * gf);
alog = malloc(sizeof(int) ’ gf):
tog[0] = 1-gf: alog[0] = 1;
for (i = 1; i < gf; i+*){
aloglij = alog(i-1] * 2;
if (atog[i) >= gf) alog(i] A= pp;
loglalogli]] = i;
о «pmd(x, y, log. alog. gf)» возвращает произведение «хи на «у».
21 «ReedSolomonfwd.nd.nc.gf.pp)» берет «nd» значений кодовых слов данных из wd[) и добавляет к «пс»
проверочным словам все в поле Галуа GF(gf). где «д(» является степенью 2. а «рр» представляет собой
значение примитивного полинома.
31 Выделяют память, затем генерируют массивы логарифмов и антилогарифмов.
49