Помехоустойчивые коды переменной длины на основе конечных автоматов

advertisement
УДК 519.725
И.А. Завадский
Помехоустойчивые коды переменной длины на основе конечных
автоматов
ключевые слова: конечный автомат, помехоустойчивый код, (2,3)-код, сверточный код
keywords: finite automaton, error-correcting code, (2,3)-code, convolutional code
Введение
В теории помехоустойчивого кодирования конечные автоматы обычно используются для
представления диаграмм состояний сверточных кодов. Это автоматы специального вида,
удовлетворяющие жестким ограничениям на количество состояний, количество переходов из
каждого состояния и др. Однако на самом деле помехоустойчивые коды можно строить на
основе гораздо более широкого класса конечных автоматов, два из которых будут приведены
в данной статье. Общая идея кодирования с помощью конечного автомата состоит в том, что
автомат меняет состояния в зависимости от считанных символов кодируемого слова и
записывает при этом некоторые символы в результирующий код. Избыточность кода на
выходе автомата, а значит и его потенциальная помехоустойчивость, обеспечивается, вопервых, благодаря тому, что автомат может записывать больше символов, чем считывает, а
во-вторых, из-за того, что автомат может иметь «тупиковые» состояния или «ошибочные»
переходы, в которых он никогда не окажется при декодировании корректно переданного
кодового слова, однако может попасть в случае ошибочного инвертирования некоторых его
битов.
Условия, при выполнении которых автомат осуществляет тот или иной переход, могут
быть гораздо сложнее, чем проверка соответствия нескольких считанных автоматом
символов определенному эталонному значению. В частности, битовая последовательность на
1
входе автомата может интерпретироваться как целое число, арифметические свойства
которого определяют последовательность переходов. Такой подход использован на первом,
внутреннем уровне описанной в данной статье двухуровневой системы кодирования: входное
сообщение рассматривается как двоичное число, которое представляется в двухбазисной
системе исчисления, в виде так называемого (2,3)-кода, обладающего определенной
избыточностью
и
помехоустойчивостью.
Затем
помехоустойчивые
свойства
кода
усиливаются с помощью внешнего кодирования, также осуществляемого специальным
конечным автоматом. Декодирование производится в обратном порядке. Код имеет
переменную длину: для различных входных информационных сообщений одинаковой длины
битовая длина генерируемых кодовых слов может различаться. Однако средняя скорость
кодера, т.е. отношение битовой длины сообщения на входе к длине кодового слова,
составляет 1/2.
Мощные
помехоустойчивые
свойства
предложенной
системы
кодирования
обеспечиваются именно благодаря сочетанию на внешнем и внутреннем уровнях
разнородных подходов, состоящих в генерировании символов кода на основе нескольких
входных двоичных символов и на основе результата арифметических операций над большим
блоком символов входного кода как над целым числом. Эффективность исправления ошибок
данной системой существенно превышает эффективность известных и широко используемых
на практике кодов той же скорости, особенно при высоком уровне шума в каналах связи
(отношение полезного сигнала к шуму Eb/No меньше 2 Дб). Так, при значении величины
Eb/No, равном 1 Дб, помехоустойчивость предложенного кода превышает аналогичный
показатель широко используемого в системах мобильной связи и хранения данных кода
NASA (171,133) более чем в 12 раз.
2
1. Внутреннее кодирование
В основе внутреннего кодирования лежит нижний (2,3)-код целых чисел. Впервые (2,3)кодирование было описано в [1], а нижний (2,3)-код, а также методы его построения и
помехоустойчивые свойства исследованы в [2]. Приведем основные определения. Пусть N2,3
— множество натуральных чисел, взаимно простых с 2 и 3, x  N 2,3 , x > 1, n  log 2 x  . Тогда x
можно представить в форме 2 n1  3k x1 или 2 n2  3k x1 , где k  N , x1  N2,3 , x1  x и только в
одной из этих форм. Раскладывая аналогичным образом x1, получим x2 и далее будем
вычислять xi 1 из уравнения xi  2 ni  3ki xi1 , пока на некоторой итерации не получим xi  1
или xi  2 . Для однозначного декодирования чисел достаточно хранить вычисляемые на
каждой итерации величины  i  log 2 3k xi   ni и k i .
При декодировании последовательность значений xi восстанавливается в обратном
порядке: xt ,, x0 , где xt  1 или xt  2 . Выбор одного из двух возможных начальных
значений xt определяется тем фактом, что если xt 1  7  2 0  31  2 , то xt  2, bi  0, kt 1  1 ,
m  log 2 3k x1   2,  t 1  m  b  2 . Легко показать, что xt 1  7 — это единственный случай,
когда k t 1  1 и  t 1  2 , и единственный случай, когда xt  2 . Поэтому, если k t 1  1 и
 t 1  2 , полагаем xt  2 , иначе — xt  1 .
Пусть 2b  3k x1 — нижнее разложение числа x,   log 2 3k x1   b . Можно показать, что Δ
может принимать только значения 0, 1 или 2, если
2 m  3k x1 
7 m1
2
8
(1)
и только значения 0 или 1, если
7 m1
2
 3k x1  2 m1
8
(2)
3
Нижний (2,3)-код числа x — это последовательность битовых групп вида 0…01…1,
первая из которых кодирует разложение числа x, а последующие — разложения xi на
дальнейших итерациях. Количество единиц в группе равно k i , а количество нулей
определяется величиной  i . В случае (1) значение  i  0 кодируется тремя нулями,  i  1 —
двумя, а  i  1 — одним, а в случае (2)  i  0 кодируется двумя нулями, а  i  1 — одним
нулем. Такой способ кодирования выбран с целью сокращения средней длины кода.
Заметим, что уровень помехоустойчивости нижнего (2,3)-кода недостаточен для
практического применения без сочетания с другими методами кодирования. Однако
помехоустойчивость можно существенно повысить, преобразовав нижний (2,3)-код с
помощью изображенного на рис. 1 конечного автомата. Автомат имеет 3 состояния,
обозначенных кружками. Первая цифра в кружке – это номер состояния, а после нее в
скобках записаны символы, расположенные перед головкой автомата, когда он перебывает в
этом состоянии.
Первый символ кода, который всегда равен 0, автомат пропускает и начинает
кодирование в состоянии 1 со второго символа и со значения xt  1 или xt  2 , принцип
выбора которого описан выше. Автомат переходит в то или иное состояние в соответствии с
диаграммой 1 в зависимости от того, какие символы считывает головка, а также в
зависимости от некоторых других условий; эти символы и условия записаны над стрелками
переходов перед косой чертой. После косой черты указаны символы, которые автомат
записывает в код на выходе при каждом переходе. Т.к. из каждого состояния есть 4 перехода,
для идентификации перехода в результирующий код достаточно записать 2 бита.
Упомянутые выше условия переходов могут быть двух типов. Во-первых, это условия,
связанные с тем, что некоторые переходы автомат выполняет в зависимости от значения хеш-
4
функции, аргументом которой является вычисляемая на каждой итерации величина xi . Такой
хеш-функцией может быть, например, G( xi )  xi mod 20 . Поскольку xi – нечетное число, то
эта функция может принимать 10 значений. Если распределить эти значения по двум
множествам G1 и G2 так, что G1  {1, 3, 5, 7, 11}, G2  {9, 13, 15, 17, 19} , то вероятности
попадания значений G( xi ) в каждое из этих множеств будут приблизительно одинаковыми.
Символ G1 или G2 над стрелкой перехода означает, что переход осуществляется только если
текущее значение G( xi ) принадлежит множеству G1 или G2 соответственно (и/или
выполняются другие условия перехода). Во-вторых, условием может быть выполнение
неравенств (1) или (2) для величины 3 k xi . Эти условия обозначены как (1) и (2).
Рассмотрим, например, переход из состояния 1 в состояние 2, обозначенный как
(1)&01(2)&01&G1 /10. Это означает, что автомат выполнит переход, если:
 в случае (1) считаны символы 01;
или
 в случае (2) считаны символы 01 и величина G( xi ) принадлежит множеству G1 .
Таким образом, при обработке автоматом нижнего (2,3)-кода должны вычисляться также
и значения xi (или могут использоваться значения, полученные при построении нижнего
(2,3)-кода). Каждое следующее такое значение будет вычисляться после обработки автоматом
очередной группы символов 0…01…1, кодирующей пару значений  i , k i  — ее мы назовем
(, k ) -группой. По причинам, которые станут понятны из описания метода декодирования,
(, k ) -группы нижнего (2,3)-кода должны обрабатываться изображенным на рис. 1 автоматом
справа налево (однако внутри групп изменять порядок битов не нужно).
Состояние 3 – особое. Каждый из переходов в это состояние может выполняться при
считывании не одной определенной группы символов, а двух различных групп,
5
обозначенных на рис. 1 как A и В. Чтобы различать при декодировании случаи A и В, способ
выхода из состояния (3) зависит от того, в соответствии с каким условием был осуществлен
переход в это состояние: A или В. Например, если автомат перешел в состояние 3 из
состояния 2, считав символы 11 (условие A), а затем головка считала 0, автомат перейдет из
состояния 3 в состояние 1 по стрелке A & 0 и запишет символы 00.
1&G1 /00
001(2)&01&G2 /11
001&G1(А)  001&G2 (B) / 00
1&G2 /01
11(А)  0001 (B) / 10
01&G1(А)  01&G2 (B) / 01
(1)&01(2)&01&G1 /10
B & 1 / 11
2
(1)
1
(10)
А & 0 / 00
3
(1)
А & 1 / 10
10/11
B & 0 / 01
Рис. 1. Конечный автомат, генерирующий помехоустойчивый нижний (2,3)-код
Когда автомат заканчивает кодировать входящую битовую последовательность,
возможны такие особые случаи.
6
1) Автомат остановился в состоянии 3. Тогда он должен дописать к кодовому слову
справа один бит, определяющий, в соответствии с каким условием, A или B, был выполнен
переход в это состояние.
2) Кодовое слово оканчивается символами 11, головка размещена перед последним
символом 1, автомат находится в состоянии 2 и для последнего бита 1 переход из состояния 2
не предусмотрен. Тогда к кодовому слову следует дописать справа символы 11, что
соответствует символам 10 в исходном коде и переходу в состояние 1. При декодировании
последний 0 кодового слова будет проигнорирован, т.к. оно состоит из 0…01…1-групп и не
может оканчиваться нулем.
Условия переходов между состояниями подобраны с учетом указанных в [2]
вероятностей различных значений Δ так, чтобы все переходы из каждого состояния были как
можно более равновероятными. Это позволяет уменьшить длину кода, которая в результате
превышает длину двоичного представления числа в 1,25 раз в среднем. Ввиду небольшого
увеличения длины при существенном возрастании помехоустойчивости получаемый на
выходе автомата код называется сжатым (2,3)-кодом.
При декодировании считываются пары битов из сжатого (2,3)-кода, выполняются
соответствующие им переходы и вычисляются значения xt ,, x0 . Если некоторый бит кода
вследствие помех в канале связи будет инвертирован, то на одном из переходов,
выполняющихся вслед за обработкой этого бита, с большой вероятностью случится так, что
значение хеш-функции G( xi ) принадлежит множеству G1 , хотя, согласно кодировке, должно
принадлежать множеству G2 , либо наоборот. Возникновение такой ситуации позволяет
выявлять ошибки в коде и обеспечивает определенную его помехоустойчивость, которая
существенно выше помехоустойчивости описанного в [2] нижнего (2, 3)-кода.
7
2. Внешнее кодирование
Если рассмотреть подробнее помехоустойчивые свойства сжатого (2,3)-кода, то окажется,
что он позволяет с высокой вероятностью обнаруживать факт наличия ошибок в кодовом
слове, но дает мало информации о том, в каких именно битах ошибки произошли, т.е. мало
возможностей для исправления ошибок. Это вполне естественно для высокоскоростного
метода кодирования, в котором отношение длины двоичной последовательности к средней
длины кодового слова составляет 0,8. Для того, чтобы была возможность обнаруживать
точное местонахождение ошибок, следует модифицировать код, снизив, в частности, его
скорость. Например, в изображенном на рис. 1 автомате переходы можно кодировать не
двумя, а тремя битами, выбирая тройки битов из множества триад с хемминговым
расстоянием 2, такого как {000,011,101,110}. Скорость кода в этом случае уменьшится в
полтора раза. Если в каждой триаде битов будет содержаться не более одной ошибки, то все
триады с ошибочными битами можно будет выявить сразу же. Затем с помощью переборного
алгоритма можно определить, какие именно биты этих триад содержат ошибки. Подобный
подход описан в [2]. Его главным недостатком является ограничение, связанное с наличием
не более одной ошибки в каждой триаде. В данном разделе опишем конечный автомат,
который также обрабатывает сжатый (2,3)-код и уменьшает его скорость в полтора раза,
однако лишен упомянутого недостатка.
Автомат считывает пары битов сжатого нижнего (2,3)-кода, осуществляет переходы
между состояниями и записывает при этом в результирующий код триады битов. Он имеет 16
состояний, объединенных в 4 группы по 4 состояния в каждой (рис. 2). Триады,
записываемые автоматом, принадлежат к одному из множеств A={000,011,101,110} или
B={111,100,010,001} в зависимости от того, из какого состояния осуществляется переход.
8
Эти множества будем называть также кодировками А и В. На рис. 2 множество триад,
соответствующее переходу, указано над стрелкой перехода (буква A или B). В целом работа
автомата на этом рисунке представлена в сокращенном виде, т.к. на самом деле каждой
стрелке перехода соответствует 4 перехода, ведущих во все состояния той группы, на
которую указывает стрелка.
Как видно из рис. 2, номер группы состояний на следующей итерации равен номеру
состояния внутри группы на текущей итерации, а считываемые автоматом пары символов
сжатого (2,3)-кода определяют, во-первых, какой именно элемент множества A или B будет
записан в код на выходе и, во-вторых, в какое состояние внутри группы состояний перейдет
автомат. Эта взаимосвязь отражена в табл. 1. Номер состояния внутри группы равен
значению одной из функций (x + 1) mod 4 либо (x + 3) mod 4, где x — двухразрядное
двоичное число, биты которого считаны автоматом. Если применяется первая из этих
функций, то стрелка соответствующего перехода на рис. 2 обозначена цифрой «1» после
символа А или B, если вторая — то цифрой «3».
Табл. 1. Переходы при внешнем кодировании
Тип кодировки
A1
A3
B1
B3
Считанные символы
00
01
10
11
00
01
10
11
00
01
10
11
00
01
10
Записываемые
символы
000
011
101
110
000
011
101
110
111
100
010
001
111
100
010
Новое состояние (x —
считанное
двухбитовое число)
(x + 1) mod 4
(x + 3) mod 4
(x + 1) mod 4
(x + 3) mod 4
9
11
001
Как кодирование, так и декодирование автомат начинает в первом состоянии первой
группы и заканчивает с окончанием обработки подающегося на вход информационного
сообщения. Докажем некоторые свойства автомата, существенные с точки зрения
исследования его помехоустойчивости.
Заметим, что есть два способа распределения кодировок в группах состояний: в группах 1
и 2 состояниям 1, 2, 3 и 4 соответствуют кодировки A, B, A и B, а в группах 3 и 4 – кодировки
B, A, B и A. Поэтому группы 1 и 2, вместе взятые, мы назовем объединением ABAB, а
группы 3 и 4 – объединением BABA. Проанализировав рис. 2, можно отметить следующее
свойство рассматриваемого автомата.
Свойство 1. Если двум различным состояниям одной группы соответствуют одинаковые
кодировки, то из одного такого состояния переходы осуществляются в группу объединения
BABA, а из другого – в группу объединения ABAB.
Чтобы доказать еще одно важное свойство автомата, введем функцию S (v, s, g ) , значение
которой равно номеру состояния автомата внутри группы на следующей итерации, если на
текущей итерации автомат находился в состоянии s группы g и считал двухбитовое число v.
Так как всем состояниям каждой группы сопоставлена одна и та же функция перехода
состояний вида ( x  c) mod 4 , то, если s и q – два различных состояния из одной группы g,
выполняется равенство S (v, s, g )  S (v, q, g )mod 4  (s  q) mod 4 . Если же при этом s и q –
состояния с одинаковыми кодировками, то ( s  q)  2(mod 4) (см. рис. 2), а значит, и
S (v, s, g)  S (v, q, g)  2(mod 4) .
Состояниям,
номера
которых
отличаются
на
2,
в
10
объединениях BABA и ABAB соответствуют различные кодировки, поэтому, с учетом
свойства 1, получаем следующее свойство.
Свойство 2. Если s и q – различные состояния с одинаковыми кодировками, принадлежащие
группам одного объединения, то для любого считанного автоматом значения v переходы из
состояний S (v, s, g ) и S (v, q, g ) будут иметь различные кодировки.
1
A1
1
2
3
4
B1
A3
B1
A1
1
B3
A3
1
2
2
B1
B3
2
4
3
3
A3
B3
4
4
B3
B1
A1
1
A1
2
3
A3
4
3
Рис. 2. Общая схема автомата, выполняющего внешнее кодирование
11
Если в кодовом слове возникают ошибки, они приводят к сбоям: ситуациям, когда во время
декодирования автомат находится в состоянии, которому соответствует множество кодовых
слов A, однако считывает кодовое слово из множества B либо наоборот. Взаимосвязь между
местом возникновения ошибки и местом сбоя определяется следующими свойствами.
Свойство 3. Если триада t содержит одну или три ошибки, а при переходе к ней автомат
находился в правильном состоянии, сбой произойдет при обработке триады t.
Свойство 4. Если триада t содержит две ошибки, при переходе к ней автомат находился в
правильном состоянии, и триады t+1, t+2 ошибок не содержат, то сбой произойдет при
обработке триады t+1 или t+2.
Свойство 3 следует непосредственно из построения множеств А и В, а свойство 4 требует
доказательства.
Пусть
g t , g t 1 , g t 2 и st , st 1 , st  2 — группы и внутригрупповые состояния автомата,
соответствующие триадам t, t+1 и t+2 в случае отсутствия ошибок в триаде t, а g t , g t1 , g t 2 и
st , st1 , st 2 — соответствующие группы и состояния в случае двух ошибок в триаде t. Две
ошибки в одной триаде преобразуют эту триаду в другой элемент того же кодового
множества (A или B). Поэтому при двух ошибках в триаде t сбой прямо в этой триаде не
возникнет и после обработки триады t автомат перейдет в ту же группу, что и в случае
отсутствия ошибок в этой триаде, однако в другое ее состояние, т.е. g t 1  g t1 , но st 1  st1 .
Обозначим через Enc(s) функцию, возвращающую тип кодировки (А или В) для переходов
из состояния s. Вероятность того, что Enc(st1 )  Enc(st 1 ) составляет 2/3 и в этом случае сбой
произойдет при обработке триады t  1 . Если же Enc(st1 )  Enc(st 1 ) , то триада t  1 будет
12
обработана без сбоя, но, в соответствии со свойством 2, сбой возникнет при обработке
триады t  2 .
Свойство 4 доказано.
Из свойств 3 и 4 следует простой метод определения номеров битов с ошибками, если в
последовательных трех триадах есть не более одной ошибки. А именно, если при
декодировании некоторой триады t произошел сбой, предполагаем наличие ошибки в каждом
из битов этой триады и инвертируем этот бит. Если предположение не верно, то вследствие
инвертирования мы создадим в триаде t вторую ошибку и сбой произойдет при обработке
триад t  1 или t  2 . Если же предположение верно, то мы исправим ошибку в триаде t и
тогда триады t  1 или t  2 будут обработаны без сбоя.
Чтобы определять точное местоположение ошибочных битов в триадах с двумя ошибками,
необходимо рассмотреть еще некоторые свойства кодирующего конечного автомата.
Свойство
5
следует
непосредственно
из
построения
функции,
определяющей
внутригрупповое состояние на следующей итерации (см. второй и последний столбцы табл.
1).
Свойство 5. Каковы бы ни были различные состояния s и q автомата (т.е. различающиеся
либо группой, либо внутригрупповым номером), если автомат считывает в этих состояниях
одинаковые символы, то в результате либо в одном из состояний происходит сбой, либо
автомат переходит на следующей итерации в состояния с одинаковыми или отличающимися
на 2 (mod 4) внутригрупповыми номерами.
Теперь можно доказать более общее важное свойство.
13
Свойство 6. Если два экземпляра автомата на некоторой итерации t находятся в различных
(т.е. различающиеся либо группой, либо внутригрупповым номером) состояниях s t и st , и на
итерациях t – t+3 считывают одинаковые символы, то на одной из итераций t – t+3 в работе
одного из автоматов произойдет сбой.
Действительно, если Enc( s)  Enc( s ) , то сбой происходит непосредственно в триаде t. Если
Enc( s)  Enc( s ) , то, в соответствии со свойством 5, st 1  st1  2(mod 4) либо st 1  st1 . Если
g t 1 и g t1 — группы различных объединений, то Enc(st 1 )  Enc(st 1 ) и сбой происходит в
триаде t  1 . Если же g t 1 и g t1 — группы одного объединения и st 1  st1  2(mod 4) , то g t 2
и g t2 будут группами различных объединений и сбой произойдет в триаде t  2 . Наконец,
если g t 1 и g t1 — группы одного объединения и st 1  st1 , то g t 1  g t1 , g t 1  g t 2 и
c( st 1 )  c( st1 ) , где c (s ) — константа в формуле ( x  c) mod 4 , по которой вычисляется новое
состояние автомата (см. последний столбец табл. 1). Это означает, что st 2 и st2 —
состояния одной группы, причем st 2  st2  2(mod 4) . Поэтому, в соответствии со свойством
1, g t 3 и g t3 будут группами различных объединений и сбой произойдет в триаде t  3 .
Свойство 6 доказано.
Свойство 7. Если в триадах t и t+1 содержится хотя бы одна ошибка, при переходе к триаде t
автомат находился в правильном состоянии, а в триадах t и t+1 не происходит сбоя, то st+2 ≠
st+2 или gt+2 ≠ gt+2.
Т.к. при переходе к триаде t автомат находился в правильном состоянии, st = st . Заметим, что
ошибка в некоторой триаде p приводит к изменению значения sp+1, но не gp+1. Поэтому если в
триаде t содержатся ошибки, то независимо от их наличия в триаде t+1, будет выполняться
14
неравенство st+1 ≠ st+1, а значит gt+2 ≠ gt+2. Если же в триаде t нет ошибок, но они есть в
триаде t+1, то, очевидно, st+2 ≠ st+2.
Свойство 7 доказано.
Свойство 8. Если триады t и t+2 содержат ошибки, а триада t+1 — не содержит, при переходе
к триаде t автомат находился в правильном состоянии и в триадах t, t+1 и t+2 не происходит
сбоя, то gt+3 ≠ gt+3.
Т.к. st = st , то gt+1 = gt+1 и, поскольку оба автомата считывают на итерации t+1 одинаковые
символы, будет выполняться равенство st+2 = st
+2.
Поэтому ошибки в тираде t+2 приведут
если не к сбою в этой триаде, то к выполнению неравенства gt+3 ≠ gt+3.
Свойство 8 доказано.
Основываясь на свойствах 4, 6, 7 и 8, опишем метод, который при возникновении сбоя в
работе автомата позволяет узнать, не привела ли к сбою двойная ошибка в некоторой триаде
и, если это так, определить точное местонахождение двух ошибочных битов. Предполагаем,
что сбой произошел в триаде t, а триады t+1 – t+4 ошибок не содержат. Согласно свойству 4,
сбой в триаде t может свидетельствовать о наличии двойной ошибки в триаде t–1 либо t–2.
Поэтому
следует
рассмотреть
все
6
возможных
комбинаций
ошибочных
битов,
соответствующих одной двойной ошибке в триаде t–1 либо t–2. Если инвертирование битов в
соответствии с одной из этих комбинаций позволит автомату обработать без сбоев триады t –
t+4, то это и есть искомая комбинация ошибочных битов, иначе следует сделать вывод, что
сбой в триаде t вызван единичной или тройной ошибкой непосредственно в этой триаде.
Чтобы показать достоверность этого метода, следует рассмотреть работу автомата при
всевозможных ложных предположениях о местонахождении двойной ошибки.
15

Если мы предполагаем наличие двойной ошибки в той триаде, где она
действительно имеет место, но в других битах, то после инвертирования битов,
которые мы посчитали ошибочными, двойная ошибка в этой триаде останется, а в
следующих двух триадах, согласно свойству 4, произойдет сбой.

Если мы предполагаем наличие двойной ошибки в триаде t–1, а на самом деле она
имеет место в триаде t–2 либо наоборот, то после инвертирования битов обе
триады t–1 и t–2 будут содержать ошибки, а значит, согласно свойству 7,
состояние автомата в триаде t будет отличаться от того, в котором он пребывал бы,
если бы ошибок не было. Из этого, в соответствии со свойством 6, следует, что
при обработке триад t – t+3 произойдет сбой.

Если мы предполагаем наличие двойной ошибки в триаде t–1, а на самом деле
сбой вызван единичной или тройной ошибкой в триаде t, то после инвертирования
битов ошибки будет содержать как триада t–1, так и триада t. Поэтому, согласно
свойству 7, состояние автомата в триаде t+1 будет отличаться от того, в котором
он пребывал бы, если бы ошибок не было. Из этого, в соответствии со свойством
6, следует, что при обработке триад t+1 — t+4 произойдет сбой.

Наконец, если мы предполагаем наличие двойной ошибки в триаде t–2, а на самом
деле сбой вызван единичной или тройной ошибкой в триаде t, то после
инвертирования битов ошибки будут содержать триады t–2 и t, но не триада t–1.
Тогда, согласно свойству 8, состояние автомата в триаде t+1 будет отличаться от
того, в котором он пребывал бы, если бы ошибок не было. Из этого, в
соответствии со свойством 6, следует, что при обработке триад t+1 – t+4
произойдет сбой.
16
Заметим, что рассмотренный автомат можно интерпретировать как генератор сверточного
кода скорости 2/3 с памятью 8. Хотя, если отождествлять рис. 2 с диаграммой состояний
сверточного кода, то это должен был бы быть код скорости 2/3 c памятью 4. Различие между
кодами с памятью 4 и 8 очень существенно, т.к. и эффективность, и сложность
декодирования наиболее распространенным методом Витерби растет с увеличением памяти
кода экспоненциально. Код, генерируемый рассматриваемым автоматом, обладает памятью 8,
однако может быть декодирован алгоритмом с той же временной сложностью, что и код
памяти 4.
3. Общий алгоритм кодирования
Входящую двоичную последовательность будем делить на L-битные блоки. К каждому блоку
будет дописываться контрольная сумма длиной c бит, использующаяся при декодировании
как критерий его правильности. После этого блок преобразуется в число из множества N2,3,
для которого генерируется помехоустойчивый (2,3)-код изображенным на рис. 1 автоматом, а
к этому коду применяется автомат, изображенный на рис 2.
1) Делим входную последовательность битов на блоки длиной L.
2) Дописываем к каждому блоку c-битную контрольную сумму, i-й бит которой равен
сумме по модулю 2 всех битов блока с номерами i (mod c).
3) Полученную (L + c)-битную последовательность преобразуем в число из множества
N2,3 по описанному ниже алгоритму.
4) Для полученного числа строим нижний (2,3)-код, переписываем последовательность
его (Δ, k)-групп справа налево и по ней генерируем помехоустойчивый (2,3)-код с
помощью внутреннего автомата (рис. 1).
5) К полученному на предыдущем шаге коду применяется изображенный на рис. 2
автомат.
17
6) Полученные помехоустойчивые коды блоков конкатенируются без добавления
разделителей.
Заметим,
что
при
использовании
пакетного
принципа
передачи
сообщений,
применяемого во всех системах мобильной связи, величины L и c можно подобрать так,
чтобы кодовое слово укладывалось в пакет (заметим, что дисперсия длин кодовых слов
весьма невелика). Тогда на шаге 6 описанного выше алгоритма следует не конкатенировать
кодовые слова, а дополнять нулями до размера пакета. Если же биты передаются потоком, то
для повышения помехоустойчивости в некоторые фиксированные позиции в коде следует
вставлять маркеры конца кодового слова, определяющие, насколько отклоняется длина
кодового слова от позиции самого маркера. Однако подробно использование маркеров
рассматривать не будем, т.к. преимущества данного метода кодирования проявляются
больше всего именно при пакетной передаче данных.
Теперь опишем подробно, как выполняется шаг 3 данного алгоритма: преобразование
произвольной последовательности длиной M бит в целое число, взаимно простое с 2 и 3.
1) Если последовательность начинается с символа 1 и представляет собой взаимно
простое с 2 и 3 двоичное число, преобразование выполнять не нужно.
2) Добавляем символ 1 к последовательности слева. Если получено взаимно простое с 2 и
3 число, это и есть результат. Иначе переходим к шагу 3.
3) Добавляем символ 1 к последовательности справа. Если получено взаимно простое с 2
и 3 число, это и есть результат. Иначе переходим к шагу 4.
4) Добавляем символ 1 к последовательности справа.
Обратная
процедура
преобразует
число
из
множества
N2,3
во
входную
последовательность битов. Она может завершиться ошибкой, которая будет означать, что это
число нельзя получить в результате прямого преобразования M-битной последовательности.
18
1) Если битовая длина числа меньше M или больше M + 3, завершаем процедуру с
ошибкой.
2) Если битовая длина числа равна M + 3, удаляемо наименее значимый бит. Если
полученное число взаимно простое с 2 и 3, завершаем процедуру с ошибкой.
3) Если битовая длина полученного на предыдущем шаге числа равна M + 2, удаляем
наименее значимый бит. Если полученное число взаимно простое с 2 и 3, завершаем
процедуру с ошибкой.
4) Если битовая длина полученного на предыдущем шаге числа равна M + 1, удаляем
наиболее значимый бит.
5. Алгоритм декодирования
Декодирующий алгоритм включает в себя два этапа: преобразование кода, получаемого
на выходе внешнего автомата, изображенного на рис. 2, в помехоустойчивый (2,3)-код, и
получение из помехоустойчивого (2,3)-кода сообщения, близкого к исходному, с помощью
внутреннего автомата (рис. 1). Однако выполняются эти этапы не последовательно:
помехоустойчивый (2,3)-код декодируется по мере его генерирования на первом этапе, с
некоторым запаздыванием.
Суть метода исправления ошибок состоит в следующем. Если среди трех битов с
номерами 3m+1, 3m+2, 3m+3 есть один ошибочный, при обработке внешним автоматом этой
триады возникнет ошибка, т.к. автомат будет ожидать триаду из множества кодовых слов А, а
считает триаду из множества кодовых слов Б или наоборот. Мы будем последовательно
предполагать, что ошибочным является бит 3m+1, 3m+2 и 3m+3, инвертировать его и
запускать внешний автомат дальше, а к генерируемому им (2,3)-коду — применять
внутренний автомат. Если предположение об ошибочном бите верно, внешний (а за ним — и
внутренний) автомат будет работать успешно вплоть до следующего ошибочного бита. В
19
противном случае вместо одной ошибки в триаде битов образуется две и, в соответствии с
доказанными в разд. 3 свойствами, сбой в работе внешнего автомата произойдет в 1–2
последующих триадах. Все 3 варианта исправления ошибок будем включать в список
потенциальных месторасположений ошибок, однако вариант, где автомат при том же
количестве исправлений пройдет дальше, будем считать более предпочтительным и
подлежащим дальнейшей обработке в первую очередь. Кроме того, будем рассматривать и
включать
в
список
потенциальных
месторасположений
ошибок
триады
с
двумя
инвертированными битами, расположенные на 1 или 2 триады до места сбоя при работе
внешнего автомата, и триады с тремя инвертированными битами в месте сбоя. Если же в силу
высокой плотности и особой конфигурации ошибок должный сбой внешнего автомата не
произойдет, высока вероятность возникновения ошибки при работе внутреннего автомата.
Заметим, что алгоритм декодирования применим и к жесткой, и к мягкой реализации
декодера. В первом случае предполагается, что на вход декодера поступают биты, а во
втором — что амплитуда сигнала, кодирующего каждый бит на входе декодера, является
непрерывной величиной, получаемой в результате наложения на уровень передаваемого
сигнала (1 для единичного значения бита и –1 — для нулевого) аддитивного гауссового
белого шума в канале связи. При мягкой реализации положительную амплитуду сигнала
будем отождествлять с единичным битом, отрицательную — с нулевым, а действительные ее
значения
будут
использоваться
только
в
описанной
ниже
операции
сравнения
корректирующих конфигураций и это будет повышать помехоустойчивые свойства кода при
использовании мягкого декодера по сравнению с жестким.
Предположим, что в некоторые биты кодового слова внесены ошибки, т.е. эти биты
инвертированы. Множество позиций битов, которые мы считаем ошибочными, будем
называть маской ошибок. Пусть q = 3m+1 – это номер первого бита некоторой триады
20
кодового слова, v = (v1, … , vt), v1 < … < vt – маска ошибок, а w – результат декодирования
внешним автоматом части кодового слова, начинающейся с первого (наиболее значимого)
бита и заканчивающейся битом q, в случае инвертирования битов, принадлежащих маске v.
Кроме того, через s обозначим состояние внешнего автомата, соответствующее положению
головки q, т.е. информацию как о группе состояний, так и о номере состояния внутри группы.
Четверку (v, w, q, s) будем называть внешней корректирующей конфигурацией, в то время
как внутренней корректирующей конфигурацией называется четверка (xw, q1, a, tout), где tout
= (v, w, q, s) – некоторая внешняя корректирующая конфигурация, q1 < q – кратное трем
число, xw – результат декодирования внутренним автоматом части слова w, начинающейся с
первого бита и заканчивающейся битом q1, a – состояние внутреннего автомата,
соответствующее положению головки q1.
Для
описания
алгоритма
декодирования
необходимо
определить
несколько
вспомогательных операций над корректирующими конфигурациями.
Во-первых, для внешней и внутренней корректирующих конфигураций определим
операции инкремента. Пусть tout = (v, w, q, s) – некоторая внешняя конфигурация, а внешний
авомат, начинающий с нее работу, останавливается с ошибкой на бите q ≥ q в состоянии s,
генерируя при этом слово w. Тогда результатом инкремента tout++ будем считать
конфигурацию tout = (v, w, q, s). Если же автомат достигнет конца всего кода без ошибки,
полагаем величину q равной длине последнего кодового слова.
Результатом инкремента внутренней конфигурации tin = (xw, q1, a, tout) будем считать
внутреннюю конфигурацию tin++ = (xw, q2, a, tout++), получаемую в результате обработки
внутренним автоматом, находящимся в состоянии a, части слова w, включающей биты с
номерами от q1 до q2. Здесь (v, w, q, s) = tout++ = (v, w, q, s)++, q2 = q – 3d, где d – некоторая
константа, а xw и a – соответствующие q2 часть декодированного слова и состояние
21
внутреннего автомата (рис. 3а). Принцип выбора величины d будет пояснен ниже. Инкремент
внутренней конфигурации может завершиться ошибкой до того, как автомат перейдет к
обработке триады, начинающейся с бита q2.
Корректирующие конфигурации могут считаться более или менее успешными: чем
большее количество битов удалось обработать и чем меньше битов для этого пришлось
инвертировать (т.е., чем короче маска), тем более вероятно, что элементы маски
соответствуют действительному положению ошибок в кодовом слове. Поэтому введем
операцию сравнения внешних конфигураций p и m, предположив что в соответствующих им
словах обработано qp и qm битов (результат сравнения внутренних конфигураций совпадает с
результатом сравнения входящих в их состав внешних конфигураций). Введем также метрику
(tp и tm), которая будет по-разному вычисляться в случае жесткой и мягкой реализации
декодера. При жесткой реализации величина tp равна количеству битов в маске конфигурации
p, а при мягкой — сумме модулей амплитуд, соответствующих битам маски. В обоих
случаях, чем меньше метрика, тем более вероятна корректирующая конфигурация.
Будем считать, что если p > m, то конфигурация p хуже конфигурации m и из них двух в
первую очередь дальнейшей обработке подлежит конфигурация m. Итак, операция p > m
выполняется следующим образом (порядок выполнения сравнений существенен).
1) Если qp < qm и tp > tm, результат истинный.
2) Если qp > qm и tp < tm, результат ложный.
3) Для жесткой реализации: если q p  qm  12(t m  t p )  4(t m  t p ) 2 , результат истинный.
Для мягкой реализации: если tm > tp и q p  qm  20(t m  t p )  8(t m  t p ) 2 , результат
истинный.
22
4) Для жесткой реализации: если qm  q p  12(t p  t m )  4(t p  t m ) 2 , результат ложный. Для
мягкой реализации: если tp > tm и qm  q p  20(t p  t m )  8(t p  t m ) 2 , результат ложный.
5) Если tp > tm, результат истинный.
6) Если tm > tp, результат ложный.
7) Если ни одно из неравенств 1)–4) не выполняется, результат ложный.
Таким образом, при равенстве длин масок результат сравнения зависит от того, какая
величина больше: qp или qm. Если эти величины равны, то результат сравнения зависит от
соотношения метрик масок. Если же в метрика конфигурации p меньше, однако и количество
обработанных битов меньше, результат зависит от значения эвристической функции,
использованной в п. 3) и 4). А если в конфигурациях равны и метрики, и количества
обработанных битов, то конфигурации равноценны и для определенности мы считаем
результат операции их сравнения ложным.
Пусть t — некоторая конфигурация, а P — список корректирующих конфигураций.
Введем операцию пополнения списка P + t, в результате которой конфигурация t будет
вставлена в список P перед такой ближайшей к началу списка конфигурацией p, что p > t, а
если такой конфигурации нет — то в конец списка. Формирование списка через операции
пополнения гарантирует его упорядоченность по возрастанию, т.е. в вершине списка всегда
будет находиться «наилучшая» конфигурация, подлежащая дальнейшей обработке в первую
очередь.
Для внутренней конфигурации tin введем также операцию проверки check(tin),
определяющую,
генерирует
ли
внутренний
автомат,
начинающий
работу
в
этой
конфигурации, число x*, которое проходит все проверки на соответствие входящей битовой
последовательности. Т.е.,
23
- число x* без ошибки преобразуется из множества N2,3 во входную последовательность
длиной L+c битов;
- контрольная сумма, вычисленная на первых L битах полученной последовательности,
совпадает с последними c битами.
Результат операции check(tin) является истинным, если удовлетворяющее таким условиям
число x* получено до обработки бита q (т.е. позициии из соответствующей внешней
конфигурации tout++ = (v, w, q, s)) и до возникновения ошибки в работе внутреннего
автомата (рис. 3б).
конец кодового слова
tout
tout++
tin
tin++
а
tout
tin
tout++
check(tin)
б
Рис. 3. Положение головки автомата до и после операций инкремента (а) и проверки (б).
Заштрихованы триады битов, в которых происходит сбой
Следует также ввести операцию пополнения маски ошибок, которую будем обозначать
символом «+». Ее левым операндом будет внутренняя конфигурация, а правым — номер
бита, добавляемого к маске ошибок: tin  tin + k. Значения параметров конфигурации tin
совпадают со значениями параметров конфигурации tin за тем исключением, что маска
ошибок входящей в ее состав внешней конфигурации дополняется битом k.
И, наконец, введем операцию отката внутренней конфигурации на кратное трем
количество битов: tin  rollback(tin , 3k). Если tin = (xw, q1, a, tout), то в конфигурации tin = (x,
24
q1 – 3k, a, tout) головка внутреннего автомата находится в позиции q1 – 3k, состояние
внутреннего автомата a и результирующее число x соответствуют этому положению
головки, а все параметры внешней конфигурации tout соответствуют позиции q1 – 3k головки
внешнего автомата.
Теперь опишем исправляющий ошибки алгоритм декодирования.
1) Формируем начальные конфигурации: внешнюю tout  ({},“”, 1,{1,1}) и внутреннюю
tin  (“”, 1, 1, tout). Во внешней начальной конфигурации множество ошибок и
результирующая строка пустые, головка автомата расположена на первом (самом
старшем) бите, а сам автомат находится в первом состоянии первой группы. Во
внутренней — входная строка пустая, головка расположена на первом бите, а автомат
находится в первом состоянии. Формируем также список допустимых внутренних
конфигураций Pin, состоящий сначала из одной начальной конфигурации: Pin  {tin}.
2) Пусть h — первый элемент списка допустимых внутренних конфигураций. Выполняем
присваивание tin  h и исключаем h из списка.
3) Выполняем операцию инкремента внутренней конфигурации: tin  tin++ =
= (xw, q1–3d, a, tout++) = (x, q2, a, tout). Заметим, что при этом сначала выполняется
инкремент соответствующей внешней конфигурации tout++, в результате которого
внешний автомат останавливается в позиции q1, генерируя на выходе слово w , а
затем уже это слово обрабатывается внутренним автоматом. Ниже мы объясним
принцип выбора величины d, а пока заметим, что ее оптимальным значением является
2, т.е. внутренний автомат должен останавливаться на 2 триады раньше той позиции,
где остановился внешний автомат. Если операция tin++ завершилась ошибкой до
достижения головкой внутреннего автомата позиции q1–3d, возвращаемся к шагу 2,
иначе переходим к шагу 4.
25
4) Выполняем проверку внутренней конфигурации, полученной в результате инкремента:
check(tin). Если эта операция возвращает истинное значение, генерируя число x*, то x*
считаем результатом декодирования. Остается применить к этому числу обратное
преобразование из множества N2,3 и отбросить биты контрольной суммы. Если же
результат check(tin) не является истинным, переходим к шагу 5.
5) Предполагаем, что сбой в работе внешнего автомата вызван единичной ошибкой в
триаде битов с номерами q1, q1+1, q1+2. Для значений i = 0, 1, 2 выполняем операцию
добавления бита к маске: tin  tin + (q1 + i) и пополняем список допустимых
внутренних конфигураций: Pin  Pin + tin.
6) Предполагаем, что сбой в работе внешнего автомата в триаде, начинающейся с
позиции q1, вызван двойной ошибкой в одной из двух предшествующих триад.
Выполняем откат конфигурации tin на 6 битов и к маске полученной конфигурации
добавляем все возможные пары битов i и k, принадлежащих одной триаде битов и
находящихся в диапазоне от q1–6 (включительно) до q1 (не включая):
tin 
rollback(tin, 6) + i + k. Пополняем список допустимых внутренних конфигураций
конфигурацией tin: Pin  Pin + tin.
7) Предполагаем, что все биты в триаде, начинающейся с позиции q1, содержат ошибки:
tin  tin + q1 + (q1 + 1) + (q1 + 2). Дополняем список допустимых внутренних
конфигураций конфигурацией tin, руководствуясь тем же принципом, что и на шагах
5 и 6.
8) Возвращаемся к шагу 2.
Наличие «зазора» в 3d = 6 битов между точками окончания инкремента внешней и
внутренней конфигураций (см. шаг 3) объясняется возможностью отката, выполняемого на
26
шаге 6. Ведь если остановка внешнего автомата в позиции q1 связана с двойной ошибкой в
одной из предыдущих двух триад, нельзя «требовать» от внутреннего автомата
безошибочной обработки битов с номерами q1 – 6, …, q1 – 1.
Теперь можно также объяснить, для чего на шаге 4 алгоритма кодирования (Δ, k)-группы
переписывались справа налево. Т.к. декодирование начинается с величины xt = 1 или xt = 2,
(Δ, k)-группа, получаемая при кодировании последней, должна обрабатываться при
декодировании первой. Если бы порядок групп не был изменен, позиция этой (Δ, k)-группы
была бы неизвестной, поскольку длина кодового слова является переменной величиной.
6. Выводы
Описанный помехоустойчивый код является двухуровневым, причем на разных уровнях
реализованы принципиально различные математические подходы, сочетание которых дает
возможность достичь высокой помехоустойчивости. Так, на рис. 4 приведен график,
демонстрирующий эффективность данного метода по сравнению с применяемыми в
беспроводной передаче сигналов помехоустойчивыми кодами. Для сравнения выбран
наиболее известный и широко используемый сверточный код NASA (171,133) скорости 1/2,
т.е. такой же, как и средняя скорость предложенного в данной статье кода. Как видно, данный
код обеспечивает существенно более низкий уровень ошибок в пакетах (Frame Error Rate —
FER). Эта величина измеряется как отношение количества пакетов с ошибками к общему
количеству переданных пакетов. Для моделирования был выбран канал связи с аддитивным
гауссовым белым шумом (AWGN), по которому передаются пакеты со средней длиной 100
бит, что соответствует 50-битному пакету на входе канала связи при 6-битной контрольной
сумме.
27
Рис. 4. Сравнение помехоустойчивости кодов
Применение одного лишь внешнего кодирования позволило бы исправлять так
называемый «мелкий дождь» ошибок, т.е. ошибки, расположенные относительно далеко друг
от друга. Так, из описания приведенных в разделе 2 методов исправления ошибок следует,
что единичные и тройные ошибки в триадах будут исправлены с вероятностью 100%, если
после триады с ошибками следует две триады без ошибок. Также с вероятностью 100% будут
исправлены двойные ошибки в триадах, после которых следует 6 триад без ошибок.
Комбинирование внешнего кодирования с внутренним позволяет успешно исправлять
значительно более плотные конфигурации ошибок. Однако в этом случае определить
теоретически все варианты кодовых последовательностей, исправляемых с вероятностью
100%, не представляется возможным и при некоторых сложных конфигурациях ошибок
алгоритм может не срабатывать. О наличии такой конфигурации ошибок свидетельствует,
прежде всего, длительное время работы алгоритма. Поэтому если количество итераций
превышает некоторое предопределенное, зависящее от интенсивности помех в канале связи,
28
число (для неизвестного уровня помех полагаем его равным 200), работу алгоритма над
кодовым словом следует останавливать, не внося в него никаких изменений, т.к., во-первых,
время работы алгоритма становится недопустимо большим и, во-вторых, в этом случае с
высокой вероятностью алгоритм в итоге найдет число x*, проходящее все проверки, но
отличающееся от закодированного числа, т.е. внесет дополнительные ошибки во входное
сообщение.
Поскольку внешний код является, по сути, сверточным, с целью повышения
быстродействия можно было бы проводить внешнее декодирование по методу Витерби [4], а
внутренний (2,3)-код использовать только для отсева конфигураций ошибок в том случае,
если метод Витерби позволяет получить больше одного решения. Однако метод Витерби
хорошо работает лишь при низкой зашумленности канала, а преимущества рассмотренного
нами похода проявляются прежде всего при высоком уровне шума. Более того, роль
внутреннего кодирования при таком подходе была бы нивелирована и помехоустойчивость
кода в целом оказалась бы существенно ниже.
Описанный в данной статье алгоритм можно рассматривать как базовый. Он может быть
улучшен путем рассмотрения дополнительных конфигураций ошибок, например, всех
конфигураций, в которых две соседние триады содержат ошибки. Это несколько увеличивает
время работы алгоритма, однако повышает его помехоустойчивость.
Список литературы
1. Anatoly V. Anisimov. Prefix Encoding by Means of the 2,3–Representation of Numbers,
IEEE Transactions on Information Theory – 2013. – vol. 59. – № 4. – pp. 2359-2374.
29
2. А.В. Анисимов., И.А. Завадский. Помехоустойчивое префиксное кодирование на
основе нижнего (2,3)-представления чисел // Кибернетика и системный анализ. —
2014. — № 2. — С. 3–14.
3. Anatoly V. Anisimov, Igor O. Zavadskyi. Forward error correcting codes by means of the
two-base (2,3)-numeration system // Black Sea conference proceedings, 2014.
4. R. Johannesson. Fundamentals of convolutional coding / R. Johannesson, K. Zigangirov. —
IEEE Press, 1999. — 400 p. — ISBN 0-7603-3M63-3.
30
Download