линейные двоичные блочные коды

Линейные двоичные блочные коды

линейные двоичные блочные коды. back. линейные двоичные блочные коды фото. линейные двоичные блочные коды-back. картинка линейные двоичные блочные коды. картинка back. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)линейные двоичные блочные коды. glass. линейные двоичные блочные коды фото. линейные двоичные блочные коды-glass. картинка линейные двоичные блочные коды. картинка glass. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)линейные двоичные блочные коды. content. линейные двоичные блочные коды фото. линейные двоичные блочные коды-content. картинка линейные двоичные блочные коды. картинка content. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)линейные двоичные блочные коды. glass. линейные двоичные блочные коды фото. линейные двоичные блочные коды-glass. картинка линейные двоичные блочные коды. картинка glass. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)линейные двоичные блочные коды. forward. линейные двоичные блочные коды фото. линейные двоичные блочные коды-forward. картинка линейные двоичные блочные коды. картинка forward. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

5.4. Линейные двоичные блочные коды

* ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать » + » и «-» поразрядное суммирование по модулю 2.)

Действительно, множество i> содержит нулевой элемент, получающийся, когда все αil = 0 (l = 1. k). Сумма любых двух элементов

линейные двоичные блочные коды. 000292. линейные двоичные блочные коды фото. линейные двоичные блочные коды-000292. картинка линейные двоичные блочные коды. картинка 000292. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

представляет собой также эле

В общем случае производящая матрица двоичного кода записывается в виде

линейные двоичные блочные коды. 000293. линейные двоичные блочные коды фото. линейные двоичные блочные коды-000293. картинка линейные двоичные блочные коды. картинка 000293. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Заметим, что если две порождающие матрицы различаются только порядком расположения столбцов, то определяемые ими коды являются изоморфными пространствами. Такие коды называют эквивалентными. Они имеют одинаковые кодовые расстояния между соответственными парами кодовых векторов и, следовательно, одинаковые способности обнаруживать и исправлять ошибки.

Чаще всего применяют систематические линейные коды, которые строят следующим образом. Сначала строится простой код длиной k, т. е. множество всех k-последовательностей двоичных символов, называемых информационными. Затем к каждой из этих последовательностей приписывается r = n-k проверочных символов, которые получаются в результате некоторых линейных операций над информационными символами. Можно показать, что для каждого линейного кода существует эквивалентный ему систематический код.

Простейший систематический код (n, n-1) строится добавлением к комбинации из n-1 информационных символов одного проверочного, равного сумме всех информационных символов по модулю 2. Легко видеть, что эта сумма равна нулю, если среди информационных символов содержится четное число единиц, и равна единице, если число единиц среди информационных символов нечетное. После добавления проверочного символа образуются кодовые комбинации, содержащие только чет единиц, т. е. комбинации с четным весом.

Такой код (n, n-1) имеет d = 2, поскольку две новые комбинации, содержащие по четному числу единиц, не могут различаться в одном разряде. Следовательно, он позволяет обнаружить одиночные ошибки. Легко убедиться, что, применяя этот код в схеме декодирования с обнаружением ошибок, можно обнаруживать все ошибки нечетной кратности. Для этого достаточно подсчитать число единиц в принятой комбинации и проверить, является ли оно четным. Если при передаче комбинации произойдут ошибки в нечетном числе разрядов q, то принятая комбинация будет иметь нечетный вес и, следовательно, окажется запрещенной. Такой код называют кодом с одной проверкой на четность.

линейные двоичные блочные коды. 000294. линейные двоичные блочные коды фото. линейные двоичные блочные коды-000294. картинка линейные двоичные блочные коды. картинка 000294. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Если набор всех коэффициентов γij собрать в таблицу (матрицу), то получим так называемую проверочную матрицу кода Н размерности n×(n-k):

линейные двоичные блочные коды. 000295. линейные двоичные блочные коды фото. линейные двоичные блочные коды-000295. картинка линейные двоичные блочные коды. картинка 000295. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Единицы в каждой j-й строке матрицы Н показывают, какие информационные символы нужно сложить по модулю 2, чтобы получить нуль.

Из (5.19) можно придти к выводу, что произведение порождающей и транспонированной проверочной матриц

Для рассмотренного примера кода (n, n-1) с четным весом проверочная матрица вырождается в вектор-строку длиной n:

а порождающая матрица имеет вид

линейные двоичные блочные коды. 000296. линейные двоичные блочные коды фото. линейные двоичные блочные коды-000296. картинка линейные двоичные блочные коды. картинка 000296. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

линейные двоичные блочные коды. 000297. линейные двоичные блочные коды фото. линейные двоичные блочные коды-000297. картинка линейные двоичные блочные коды. картинка 000297. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

или проверочной матрице

линейные двоичные блочные коды. 000298. линейные двоичные блочные коды фото. линейные двоичные блочные коды-000298. картинка линейные двоичные блочные коды. картинка 000298. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Этот код имеет d = 3 и позволяет обнаруживать все одиночные и двойные ошибки или исправлять (по алгоритму Хэмминга) все одиночные ошибки.

Заметим, что строки проверочной матрицы являются линейно- независимыми векторами. Следовательно, проверочная матрица может служить порождающей для другого линейного кода t(n, n-k), называемого двойственным. Так, например, матрица (5.24) является порождающей матрицей кода (7. 3), имеющего d = 4. Матрица (5.23) является проверочной для этого кода.

линейные двоичные блочные коды. 000299. линейные двоичные блочные коды фото. линейные двоичные блочные коды-000299. картинка линейные двоичные блочные коды. картинка 000299. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)
Таблица 5.1

Таким образом, код (7,4) позволяет исправить все одиночные ошибки.

Из этого примера видно, что при декодировании систематического кода не требуется перебирать таблицу, содержащую 2 k кодовых комбинаций, и производить n-k сравнений. Помимо тех операций, которые осуществляются в кодере, декодер должен произвести n-k сравнений и перебрать таблицу исправлений, содержащую 2 n-k строк. Для такого кода, как (7, 4), это осуществляется просто, но зато код оказывается малоэффективным.

Следовательно, применение систематического кода в общем случае хотя и позволяет упростить декодирование по сравнению с табличным методом, все же при значениях n порядка нескольких десятков не решает задачи практической реализации.

Более того, при любых n и k существует код, который в любом двоичном симметричном канале без памяти обеспечивает выполнение неравенства (5.25), какова бы ни была вероятность ошибки р≤1/2. Такие коды называются равномерно обнаруживающими ошибки.

Таким образом, увеличивая число корректирующих символов, можно обеспечить сколь угодно малую вероятность не обнаруженной ошибки (и, следовательно, вероятность выдачи получателю ложной информации). Однако при сохранении скорости кода k/n это потребует увеличения длины блока n. При большой длине блока вероятность появления обнаруживаемой ошибки возрастает и, следовательно, увеличиваются трудности восполнения потерянной информации.

Теория помехоустойчивости кодирования достигла больших успехов. Предложен ряд кодов и способов декодирования, при которых сложность декодера растет не экспоненциально, а лишь как некоторая степень n. Более подробно вопросы помехоустойчивого кодирования см. в [1, 9, 12, 20].

Источник

Линейные двоичные блочные коды

линейные двоичные блочные коды. dark fb.4725bc4eebdb65ca23e89e212ea8a0ea. линейные двоичные блочные коды фото. линейные двоичные блочные коды-dark fb.4725bc4eebdb65ca23e89e212ea8a0ea. картинка линейные двоичные блочные коды. картинка dark fb.4725bc4eebdb65ca23e89e212ea8a0ea. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.) линейные двоичные блочные коды. dark vk.71a586ff1b2903f7f61b0a284beb079f. линейные двоичные блочные коды фото. линейные двоичные блочные коды-dark vk.71a586ff1b2903f7f61b0a284beb079f. картинка линейные двоичные блочные коды. картинка dark vk.71a586ff1b2903f7f61b0a284beb079f. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.) линейные двоичные блочные коды. dark twitter.51e15b08a51bdf794f88684782916cc0. линейные двоичные блочные коды фото. линейные двоичные блочные коды-dark twitter.51e15b08a51bdf794f88684782916cc0. картинка линейные двоичные блочные коды. картинка dark twitter.51e15b08a51bdf794f88684782916cc0. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.) линейные двоичные блочные коды. dark odnoklas.810a90026299a2be30475bf15c20af5b. линейные двоичные блочные коды фото. линейные двоичные блочные коды-dark odnoklas.810a90026299a2be30475bf15c20af5b. картинка линейные двоичные блочные коды. картинка dark odnoklas.810a90026299a2be30475bf15c20af5b. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

линейные двоичные блочные коды. caret left.c509a6ae019403bf80f96bff00cd87cd. линейные двоичные блочные коды фото. линейные двоичные блочные коды-caret left.c509a6ae019403bf80f96bff00cd87cd. картинка линейные двоичные блочные коды. картинка caret left.c509a6ae019403bf80f96bff00cd87cd. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

линейные двоичные блочные коды. caret right.6696d877b5de329b9afe170140b9f935. линейные двоичные блочные коды фото. линейные двоичные блочные коды-caret right.6696d877b5de329b9afe170140b9f935. картинка линейные двоичные блочные коды. картинка caret right.6696d877b5de329b9afe170140b9f935. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

линейные двоичные блочные коды. image215. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image215. картинка линейные двоичные блочные коды. картинка image215. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)(1.45)

где аil принимает значения 0 или 1, а суммирование — поразрядное по модулю 2. Легко видеть, что множество этих комбинаций образует линейное пространство, содержащее 2 k блоков, т. е. линейный код.

В общем случае производящая матрица двоичного кода записывается в виде

линейные двоичные блочные коды. image221. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image221. картинка линейные двоичные блочные коды. картинка image221. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.). (1.46)

Здесь bij — двоичный символ (0 или 1), находящийся на j-м разряде i-гo кодового слова (входящего в выбранный базис).

Заметим, что если две порождающие матрицы различаются только порядком расположения столбцов, то определяемые ими коды являются изоморфными пространствами. Такие коды называют эквивалентными. Они имеют одинаковые кодовые расстояния между соответственными парами кодовых векторов и, следовательно, одинаковые способности обнаруживать и исправлять ошибки.

Чаще всего применяют систематические линейные коды, которые строят следующим образом. Сначала строится простой код длиной k, т. е. множество всех k-последовательностей двоичных символов, называемых информационными. Затем к каждой из этих последовательностей приписывается r=nk проверочных символов, которые получаются в результате некоторых линейных операций над информационными символами. Можно показать, что для каждого линейного кода существует эквивалентный ему систематический код.

Простейший систематический код (п, п—1) строится добавлением к комбинации из п-1 информационных символов одного проверочного, равного сумме всех информационных символов по модулю 2. Легко видеть, что эта сумма равна нулю, если среди информационных символов содержится четное число единиц, и равна единице, если число единиц среди информационных символов нечетное. После добавления проверочного символа образуются кодовые комбинации, содержащие только четное количество единиц, т. е. комбинации с четным весом.

Такой код (n, п-1) имеет d=2, поскольку две различные кодовые комбинации, содержащие по четному числу единиц, не могут различаться в одном разряде. Следовательно, он позволяет обнаружить одиночные ошибки. Легко убедиться, что, применяя этот код в схеме декодирования с обнаружением ошибок, можно обнаруживать все ошибки нечетной кратности. Для этого достаточно подсчитать число единиц в принятой комбинации и проверить, является ли оно четным. Если при передаче комбинации произойдут ошибки в нечетном числе разрядов q, то принятая комбинация будет иметь нечетный вес и, следовательно, окажется запрещенной. Такой код называют кодом с одной проверкой на четность.

линейные двоичные блочные коды. 640 1. линейные двоичные блочные коды фото. линейные двоичные блочные коды-640 1. картинка линейные двоичные блочные коды. картинка 640 1. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

линейные двоичные блочные коды. image225. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image225. картинка линейные двоичные блочные коды. картинка image225. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.), (1.47)

где γij коэффициенты (0 или 1), характеризующие данный код. Если набор все коэффициентов γij собрать в таблицу (матрицу), и получим так называемую проверочную матрицу кода H размерности линейные двоичные блочные коды. image227. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image227. картинка линейные двоичные блочные коды. картинка image227. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.):

линейные двоичные блочные коды. image229. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image229. картинка линейные двоичные блочные коды. картинка image229. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)(1.48)

Единицы в каждой j-той строке матрицы H показывают, какие информационные символы нужно сложить по модулю 2, чтобы получить нуль.

Из (1.46) можно придти к выводу, что произведение порождающей и транспонированной проверочной матриц

линейные двоичные блочные коды. image231. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image231. картинка линейные двоичные блочные коды. картинка image231. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)(1.49)

Для рассмотренного примера кода (п, n—1) с четным весом проверочная матрица вырождается в вектор-строку длиной п:

линейные двоичные блочные коды. image233. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image233. картинка линейные двоичные блочные коды. картинка image233. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

а порождающая матрица имеет вид

линейные двоичные блочные коды. image235. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image235. картинка линейные двоичные блочные коды. картинка image235. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.). (1.50)

Рассмотрим другой пример систематического кода — код, заданный порождающей матрицей

линейные двоичные блочные коды. image237. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image237. картинка линейные двоичные блочные коды. картинка image237. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.), (1.51)

или проверочной матрицей

линейные двоичные блочные коды. image239. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image239. картинка линейные двоичные блочные коды. картинка image239. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.). (1.52)

Этот код имеет d=3 и позволяет обнаруживать все одиночные и двойные ошибки или исправлять (по алгоритму Хэмминга) все одиночные ошибки.

Заметим, что строки проверочной матрицы являются линейно независимыми векторами. Следовательно, проверочная матрица может служить порождающей для другого линейного кода (п, n—k), называемого двойственным. Так, например, матрица (1.51) является порождающей матрицей кода, имеющего d=4. Матрица (1.50) является проверочной для этого кода.

Синдром
Конфигурация ошибок
Синдром
Конфигурация ошибок

Таким образом, код позволяет исправить все одиночные ошибки.

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

линейные двоичные блочные коды. image241. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image241. картинка линейные двоичные блочные коды. картинка image241. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)(1.53)

Более того, при любых п и k существует код, который в любом двоичном симметричном канале без памяти обеспечивает выполнение неравенства (5.25), какова бы ни была вероятность ошибки линейные двоичные блочные коды. image243. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image243. картинка линейные двоичные блочные коды. картинка image243. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)Такие коды называются равномерно обнаруживающими ошибки.

Таким образом, увеличивая число корректирующих символов, можно обеспечить сколь угодно (малую вероятность необнаруженной ошибки (и, следовательно, вероятность выдачи получателю ложной информации). Однако при сохранении скорости кода k/n это потребует увеличения длины блока п. При большой длине блока вероятность появления обнаруживаемой ошибки возрастает и, следовательно, увеличиваются трудности восполнения потерянной информации.

Теория помехоустойчивости кодирования достигла больших успехов. Предложен ряд кодов и способов декодирования, при которых сложность декодера растет не экспоненциально, а лишь как (некоторая степень n ).

Источник

4. Линейные двоичные блочные коды

Линейными называют такие двоичные коды, в которых множество всех разрешенных блоков является линейным пространством относительно операции поразрядного сложения по модулю 2. Чтобы разрешенные блоки были линейным пространством, они должны содержать нулевой блок, т.е. блок, состоящий из n нулей, должен быть разрешенным, а сумма (поразрядная по модулю 2) любых разрешенных блоков должна быть также разрешенным блоком. Линейные коды называют также групповыми. Двоичный линейный код можно построить следующим образом. Среди всех 2 n последовательностей кодовых символов можно выбрать различными способами n линейно-независимых. В частности, ими могут быть элементы, образующие ортогональный базис. Выберем из них k любых линейно-независимых блоков, которые обозначим 1, 2. л (k k блоков, т.е. линейный код. Множество i> содержит нулевой элемент, получающийся, когда все il = 0 (l = 1. k). Сумма любых двух элементов линейные двоичные блочные коды. img. линейные двоичные блочные коды фото. линейные двоичные блочные коды-img. картинка линейные двоичные блочные коды. картинка img. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)представляет собой также элемент этого множества, посколькуil + jl принимает значения 0 или 1. Если записать k линейно-независимых блоков, используемых для построения линейного кода, в виде k строк, то получится матрица размером nk, которую называют порождающей или производящей матрицей кода G.

В общем случае производящая матрица двоичного кода записывается в виде:

линейные двоичные блочные коды. img EfB5cl. линейные двоичные блочные коды фото. линейные двоичные блочные коды-img EfB5cl. картинка линейные двоичные блочные коды. картинка img EfB5cl. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)(16)

Если две порождающие матрицы различаются только порядком расположения столбцов, то определяемые ими коды являются изоморфными пространствами. Такие коды называются эквивалентными. Они имеют одинаковые кодовые расстояния между соответствующими парами кодовых векторов и, следовательно, одинаковые способности обнаруживать и исправлять ошибки.

линейные двоичные блочные коды. img 4kZiCf. линейные двоичные блочные коды фото. линейные двоичные блочные коды-img 4kZiCf. картинка линейные двоичные блочные коды. картинка img 4kZiCf. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.), (17)

линейные двоичные блочные коды. img Qjz9uS. линейные двоичные блочные коды фото. линейные двоичные блочные коды-img Qjz9uS. картинка линейные двоичные блочные коды. картинка img Qjz9uS. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)(18)

линейные двоичные блочные коды. img OJcyV9. линейные двоичные блочные коды фото. линейные двоичные блочные коды-img OJcyV9. картинка линейные двоичные блочные коды. картинка img OJcyV9. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)(19)

линейные двоичные блочные коды. img 6SkVQU. линейные двоичные блочные коды фото. линейные двоичные блочные коды-img 6SkVQU. картинка линейные двоичные блочные коды. картинка img 6SkVQU. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)(20). Или проверочной матрицей: линейные двоичные блочные коды. img ZSCvfN. линейные двоичные блочные коды фото. линейные двоичные блочные коды-img ZSCvfN. картинка линейные двоичные блочные коды. картинка img ZSCvfN. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)(21)

Этот код имеет d = 3 и позволяет обнаруживать все одиночные и двойные ошибки или исправлять (по алгоритму Хэмминга) все одиночные ошибки.

Нулевой синдром указывает на то, что все проверки выполнены, т.е. принятый блок является разрешенным. Всякому ненулевому синдрому соответствует определенная конфигурация ошибок, которая и исправляется. Так, например, для рассмотренного кода (7,4) в таблице представим ненулевые синдромы и соответствующие конфигурации ошибок.:

Источник

Все, что вы хотели узнать об LDPC кодах, но стеснялись спросить (наверное)

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Предисловие

С кодами малой плотности проверок на чётность, которые дальше мы будем именовать коротко LDPC (Low-density parity-check codes), мне удалось познакомиться более или менее близко, работая над семестровым научным проектом в ТУ Ильменау (магистерская программа CSP). Моему научному руководителю направление было интересно в рамках педагогической деятельности (нужно было пополнить базу примеров, а также посмотреть в сторону недвоичных LDPC), а мне из-за того, что эти коды были плюс-минус на слуху на нашей кафедре. Не все удалось рассмотреть в том году, и поэтому исследование плавно перетекло в мое хобби… Так я набрал некоторое количество материала, которым сегодня и хочу поделиться!

Кому может быть интересна данная статья:

В общем, присоединяйтесь!

Внимание:
Предполагается, что читатель знаком с основами помехоустойчивого кодирования. Если тема совсем нова, то от себя в качестве ликбеза могу предложить данный материал: Channel codes basics (CommPy).

Содержание

Краткая историческая справка

LDPC коды — идея довольно старая, впервые они были описаны Робертом Галлагером ещё в 1963 г. в его работе на степень PhD [1]. Однако, из-за своей неоправданной сложности (по тем временам) они не находили применения в технике относительно долгое время.

И только в 1990-х годах эти коды были, так сказать, заново открыты М. Дэви и Д. Маккеем, которые предложили инновационные на тот момент способы построения LDPC кодов с уменьшенной сложностью [2].

Сейчас LDPC коды это:

Кроме того, все больше LDPC коды проникают и в спутниковую связь. В свое время, я делал небольшой обзор по малым спутникам CubeSat (посмотреть можно по ссылке) — там тенденция однозначная и обусловлена внедрением стандартов DVB-S2/S2X.

И я думаю, это прекрасная мотивация узнать о данных кодах немного больше.

Азы блочного кодирования

LDPC коды — это линейные блочные коды, а значит проверочные биты в данной схеме кодирования добавляются в конец информационного сообщения — блоком.

Соответсвенно, процедура кодирования (encoding) — есть ничто иное, как перемножение вектора информационного сообщения длинной линейные двоичные блочные коды. b954f43ce67f65a92502a661914b76e4. линейные двоичные блочные коды фото. линейные двоичные блочные коды-b954f43ce67f65a92502a661914b76e4. картинка линейные двоичные блочные коды. картинка b954f43ce67f65a92502a661914b76e4. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)на некоторую порождающую матрицу линейные двоичные блочные коды. 15bb48f6743c78742c3fe56b12966093. линейные двоичные блочные коды фото. линейные двоичные блочные коды-15bb48f6743c78742c3fe56b12966093. картинка линейные двоичные блочные коды. картинка 15bb48f6743c78742c3fe56b12966093. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.):

линейные двоичные блочные коды. 19491c0b90542b526a17036050ac7db7. линейные двоичные блочные коды фото. линейные двоичные блочные коды-19491c0b90542b526a17036050ac7db7. картинка линейные двоичные блочные коды. картинка 19491c0b90542b526a17036050ac7db7. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

где символ линейные двоичные блочные коды. c2566c83648fe2c710ee26811aa8fc2b. линейные двоичные блочные коды фото. линейные двоичные блочные коды-c2566c83648fe2c710ee26811aa8fc2b. картинка линейные двоичные блочные коды. картинка c2566c83648fe2c710ee26811aa8fc2b. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)— это умножение по модулю (см. modulo). Для двоичных кодов это modulo 2, для недвоичных modulo q, исходя из полей Галуа линейные двоичные блочные коды. f7f3c570b420f2785941aa73ffd88411. линейные двоичные блочные коды фото. линейные двоичные блочные коды-f7f3c570b420f2785941aa73ffd88411. картинка линейные двоичные блочные коды. картинка f7f3c570b420f2785941aa73ffd88411. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.).

Соответственно, и кодовая скорость тоже задается через порождающую матрицу:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Порождающая матрица состоит из двух конкатенированных (соединенных) частей:

линейные двоичные блочные коды. 633f11de37c2d664c3c05488185200e0. линейные двоичные блочные коды фото. линейные двоичные блочные коды-633f11de37c2d664c3c05488185200e0. картинка линейные двоичные блочные коды. картинка 633f11de37c2d664c3c05488185200e0. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

где линейные двоичные блочные коды. 21bcf64be44c43de6044454f2a14881b. линейные двоичные блочные коды фото. линейные двоичные блочные коды-21bcf64be44c43de6044454f2a14881b. картинка линейные двоичные блочные коды. картинка 21bcf64be44c43de6044454f2a14881b. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)— это, так называемая, четная (parity) часть, а линейные двоичные блочные коды. 10b2368d92de7a310597377c7fc6ffda. линейные двоичные блочные коды фото. линейные двоичные блочные коды-10b2368d92de7a310597377c7fc6ffda. картинка линейные двоичные блочные коды. картинка 10b2368d92de7a310597377c7fc6ffda. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)— единичная (identity) матрица.

Дело в том, что при умножении и сложении по модулю нужно соблюдать правила сопоставления отрицательных и положительных чисел:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

На двоичном случае все это незаметно, и поэтому минус иногда пропускают.

Так как мы говорим о линейных блочных кодах, порождающая матрица и должна обеспечивать эту линейность (см. Linear code). То есть, строки порождающей матрицы должны быть линейно независимыми (да, на слух звучит немного парадоксально).

Обратите внимание, identity-часть нужна для того, чтобы оставлять код систематическим: информационное сообщение остается неизменным, а проверочные биты добавляются в конец блоком. При такой схеме, правильно восстановив кодовое слово, можно восстановить и изначальное сообщение, просто убрав проверочные биты. Удобно, не правда ли?

Порождающая матрица напрямую связана с другой важнейшей матрицей, использующейся во время процедуры декодирования: с матрицей проверки на четность (parity-check matrix).

Матрица проверки на четность имеет линейные двоичные блочные коды. 453e6a188b4290dc4f8b8ef4c4a3f402. линейные двоичные блочные коды фото. линейные двоичные блочные коды-453e6a188b4290dc4f8b8ef4c4a3f402. картинка линейные двоичные блочные коды. картинка 453e6a188b4290dc4f8b8ef4c4a3f402. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)строк и линейные двоичные блочные коды. a1e39da1c84981d7264baa207047222a. линейные двоичные блочные коды фото. линейные двоичные блочные коды-a1e39da1c84981d7264baa207047222a. картинка линейные двоичные блочные коды. картинка a1e39da1c84981d7264baa207047222a. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)столбцов, где линейные двоичные блочные коды. a1e39da1c84981d7264baa207047222a. линейные двоичные блочные коды фото. линейные двоичные блочные коды-a1e39da1c84981d7264baa207047222a. картинка линейные двоичные блочные коды. картинка a1e39da1c84981d7264baa207047222a. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)соответствует требуемой длине кодового слова, а линейные двоичные блочные коды. b954f43ce67f65a92502a661914b76e4. линейные двоичные блочные коды фото. линейные двоичные блочные коды-b954f43ce67f65a92502a661914b76e4. картинка линейные двоичные блочные коды. картинка b954f43ce67f65a92502a661914b76e4. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.), повторим, соответствует длине сообщения:

линейные двоичные блочные коды. 539a7ba526a47dd16f3fd0a47ef28226. линейные двоичные блочные коды фото. линейные двоичные блочные коды-539a7ba526a47dd16f3fd0a47ef28226. картинка линейные двоичные блочные коды. картинка 539a7ba526a47dd16f3fd0a47ef28226. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Ее основную идею очень удобно объяснять с помощью графа Таннера:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

То есть существует два вида узлов: так называемые, узлы переменных (variable nodes), количество которых соответствуют числу столбцов линейные двоичные блочные коды. b954f43ce67f65a92502a661914b76e4. линейные двоичные блочные коды фото. линейные двоичные блочные коды-b954f43ce67f65a92502a661914b76e4. картинка линейные двоичные блочные коды. картинка b954f43ce67f65a92502a661914b76e4. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.), и узлы проверки (check nodes), соответствующие числу строк (линейные двоичные блочные коды. 0a2098d17132cef8bcb1f30d0fd32100. линейные двоичные блочные коды фото. линейные двоичные блочные коды-0a2098d17132cef8bcb1f30d0fd32100. картинка линейные двоичные блочные коды. картинка 0a2098d17132cef8bcb1f30d0fd32100. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)). Узлы связаны между собой, и связь определяется положением единиц в матрице линейные двоичные блочные коды. e79cb6ae8d0e454f94b42ad408308b72. линейные двоичные блочные коды фото. линейные двоичные блочные коды-e79cb6ae8d0e454f94b42ad408308b72. картинка линейные двоичные блочные коды. картинка e79cb6ae8d0e454f94b42ad408308b72. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.). Картинка справа — это моя собственная мнемоничка моего же производства. Как мне кажется, это самый простой способ уловить суть структуры: если элемент матрицы равен 1, значит связь между узлами есть, если равен 0 — связи нет.

Для того, чтобы считать процедуру декодирования успешной, нужно, чтобы на всех проверочных узлах сформировались определенные значения — как правило, нули (см. декодирование на основе синдромов):

линейные двоичные блочные коды. da9cc80b9c2a27768732a5cd35ccbc55. линейные двоичные блочные коды фото. линейные двоичные блочные коды-da9cc80b9c2a27768732a5cd35ccbc55. картинка линейные двоичные блочные коды. картинка da9cc80b9c2a27768732a5cd35ccbc55. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Собственно говоря, эта матрица и определяет последние две буквы в аббревиатуре LDPC (Parity-Check).

Азы LDPC кодов

Но всё выше описанное — это общие моменты для большинства блочных кодов. Чем же тогда LDPC отличаются от тех же кодов Хэмминга?

В общем-то, тем, что и определяет их как low-density: их матрицы проверки на четность должны быть разряженными (sparce), то есть нулей в них должно быть значительно больше, чем чего-либо другого:

«Low density parity check codes are codes specified by a parity check matrix containing mostly zeros and only small number of ones.» [1]

Например, у того же Галлагера данная матрица была такой:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

(3,4)-регулярная матрица проверки на четность длинною 12. Пояснение: кодовое слово, которое будет закодировано с помощью такого кода, будет иметь длину 12 бит; в каждом столбце 3 единицы, а в каждой строке 4, отсюда обозначение (3,4); количество единиц в строках и столбцах — это константы (в нашем случае 3 и 4), а значит код — регулярный.

У Маккея и Нила матрица проверки на четность была такой:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

(3,4)-регулярная матрица проверки на четность длинною 12.

В стандарте DVB-S2 приняты уже нерегулярные (irregular) матрицы проверки на четность. См.:

Eroz M., Sun F. W., Lee L. N. DVB‐S2 low density parity check codes with near Shannon limit performance //International Journal of Satellite Communications and Networking. – 2004. – Т. 22. – №. 3. – С. 269-279.

Связано это с лучшей помехоустойчивостью нерегулярных схем.

Однако, ничего не замечаете? Правильно: эти матрицы не попадают под стандартную форму из формулы (3), ведь для LDPC кодов мы стремимся сделать проверочные матрицы разреженными. А если матрицы проверки не попадают под стандартную форму, значит не совсем понятно, как для них формировать порождающие матрицы.

Ответ, конечно, есть (и не один). Допустим, такой: изначальную матрицу линейные двоичные блочные коды. e79cb6ae8d0e454f94b42ad408308b72. линейные двоичные блочные коды фото. линейные двоичные блочные коды-e79cb6ae8d0e454f94b42ad408308b72. картинка линейные двоичные блочные коды. картинка e79cb6ae8d0e454f94b42ad408308b72. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)приводят к стандартной форме через метод Гаусса (Gaussian elimination), из стандартной формы получают порождающую матрицу, а ее используют для кодирования.

Приведем пример из данного учебного материала:

Была такая матрица линейные двоичные блочные коды. e79cb6ae8d0e454f94b42ad408308b72. линейные двоичные блочные коды фото. линейные двоичные блочные коды-e79cb6ae8d0e454f94b42ad408308b72. картинка линейные двоичные блочные коды. картинка e79cb6ae8d0e454f94b42ad408308b72. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.):

От нее, путем перемещений и преобразований строк по модулю 2, а также перемещений столбцов, перешли к матрице линейные двоичные блочные коды. afea253e547fbb569001574a8d7d9f03. линейные двоичные блочные коды фото. линейные двоичные блочные коды-afea253e547fbb569001574a8d7d9f03. картинка линейные двоичные блочные коды. картинка afea253e547fbb569001574a8d7d9f03. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.):

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Преобразования со строками с точки зрения линейной алгебры не влияют на кодовое слово, а вот перемещения столбцов нужно запомнить:

Формируем порождающую матрицу:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Создаем кодовое слово:

И проверяем синдром (то есть закодировали мы слово матрицей, произведенной от линейные двоичные блочные коды. afea253e547fbb569001574a8d7d9f03. линейные двоичные блочные коды фото. линейные двоичные блочные коды-afea253e547fbb569001574a8d7d9f03. картинка линейные двоичные блочные коды. картинка afea253e547fbb569001574a8d7d9f03. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.), а в процессе декодирования будем использовать разреженную матрицу линейные двоичные блочные коды. e79cb6ae8d0e454f94b42ad408308b72. линейные двоичные блочные коды фото. линейные двоичные блочные коды-e79cb6ae8d0e454f94b42ad408308b72. картинка линейные двоичные блочные коды. картинка e79cb6ae8d0e454f94b42ad408308b72. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)):

Магия линейной алгебры сработала!

Завершая раздел, нужно сказать, что такой метод кодирования самый простой для понимания, однако весьма сложный для вычисления в случае больших матриц — порождающая матрица, как правило, перестает быть разряженной. Конечно, на все это есть свои решения, однако, это уже совсем другая история.

Декодирование LDPC кодов

По LDPC кодам есть неплохой подбор материалов на Medium:

Однако, лично мне объяснение одного из центральных и самых, наверное, популярных алгоритмов декодирования — алгоритма Belief propagation (aka SPASum-product algorithm) показалось, мягко говоря, слишком формальным (там просто прикреплена научная статья). Душа просит картинок и примеров!

За основу возьмем уже знакомый нам учебный материал:

Итак, во-первых, предположим, что у нас есть некая система связи:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Система связи состоит из:

Передатчик состоит из :

Приемник состоит из:

Договоримся, что под цифровыми модемами будем понимать в первую очередь самые популярные их разновидности: PSK и QAM.

Чем интересны для нас данные типы модуляции? Во-первых, тем, что именно они входят в стандарты современных беспроводных систем (LTE, Wi-Fi, DVB и т.д. ).

А, во-вторых, тем, что они умеют представлять зашумленные значения, полученные из канала связи, в форме, так называемых, мягких значений демодуляции (soft decisions). Или, если выражаться более наукообразно, в форме логарифмированных коэффициентов правдоподобия (LLRlog likelihood ratios):

линейные двоичные блочные коды. 7935cd0aecb8916fc3a6cbe1644b2118. линейные двоичные блочные коды фото. линейные двоичные блочные коды-7935cd0aecb8916fc3a6cbe1644b2118. картинка линейные двоичные блочные коды. картинка 7935cd0aecb8916fc3a6cbe1644b2118. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

где линейные двоичные блочные коды. d76c4dc2b17f00a09c864bf2d24ab365. линейные двоичные блочные коды фото. линейные двоичные блочные коды-d76c4dc2b17f00a09c864bf2d24ab365. картинка линейные двоичные блочные коды. картинка d76c4dc2b17f00a09c864bf2d24ab365. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)обозначает вероятность, а линейные двоичные блочные коды. 5ccc8d80d010abd90b5c546d05856d3a. линейные двоичные блочные коды фото. линейные двоичные блочные коды-5ccc8d80d010abd90b5c546d05856d3a. картинка линейные двоичные блочные коды. картинка 5ccc8d80d010abd90b5c546d05856d3a. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)обозначает некоторое событие.

Несложно догадаться, что схема, состоящая только из источника сообщений и модема, весьма чувствительна к сильным шумам, а значит и к ошибкам демодуляции. Благо, что мы включили в нашу схему помехоустойчивый (канальный) кодек. Декодер нам эту ошибку как раз и исправит. А точнее тот алгоритм, который в этот самый декодер зашит.

Итак, Belief propagation.

Потому что алгоритм работает с вероятностями. А точнее, с теми натуральными логарифмами от отношений вероятностей, которые мы указали в формуле (5).

Потому что эти вероятности будут итеративно «пересылаться» от узлов переменных к узлам проверки (сообщение V2CVariable-to-Check) и наоборот (сообщение C2VCheck-to-Variable).

Под пересылкой сообщений между узлами проверки и переменных понимается то, что LLR будут складываться и перемножаться по определенным формулам.

На этапе инициализации алгоритма LLR соответствуют априорным вероятностям. SPA является одним из алгоритмов максимальной апостериорной вероятности (MAP — maximum a posteriori probability), а значит он стремится максимизировать апостериорную вероятность, полученную после итеративной пересылки между узлами проверок и переменных.

Предлагаю рассмотреть пошагово.

Предупреждение:
Ниже будет представлено некоторое количество математических формул, и иногда они будут довольно непростыми для визуального восприятия. Поэтому если вы не настроены в данный момент на штудирование, предлагаю перейти сразу к пункту «Пример декодирования через SPA на Python (numpy)». Вернетесь к теории, когда будет время и настроение или когда захочется посмотреть, что лежит в основе скриптов (наверное).

1. Инициализация

Итак, для начала рассмотрим априорные вероятности.

Начальной точкой для нашего алгоритма является матрица значений LLR, повторяющая структуру матрицы линейные двоичные блочные коды. e79cb6ae8d0e454f94b42ad408308b72. линейные двоичные блочные коды фото. линейные двоичные блочные коды-e79cb6ae8d0e454f94b42ad408308b72. картинка линейные двоичные блочные коды. картинка e79cb6ae8d0e454f94b42ad408308b72. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.). Подберем аналитическое описание:

линейные двоичные блочные коды. 5af2aa06e2707dac783c9c58990b953f. линейные двоичные блочные коды фото. линейные двоичные блочные коды-5af2aa06e2707dac783c9c58990b953f. картинка линейные двоичные блочные коды. картинка 5af2aa06e2707dac783c9c58990b953f. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

где линейные двоичные блочные коды. f5f6b8047702b16aa08fc2dad04d53f3. линейные двоичные блочные коды фото. линейные двоичные блочные коды-f5f6b8047702b16aa08fc2dad04d53f3. картинка линейные двоичные блочные коды. картинка f5f6b8047702b16aa08fc2dad04d53f3. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)является массивом единиц, а линейные двоичные блочные коды. 3ca7d260b81ee8ca13447af329103fe7. линейные двоичные блочные коды фото. линейные двоичные блочные коды-3ca7d260b81ee8ca13447af329103fe7. картинка линейные двоичные блочные коды. картинка 3ca7d260b81ee8ca13447af329103fe7. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)обозначает произведение Адамара (поэлементное умножение). На практике без единичной матрицы можно будет обойтись: заменим скобку на итерационное умножением Адамара вектора LLR со столбцами матрицы контроля четности (нужен будет дополнительный цикл). Если матрицы будут достаточно большими, такой подход может быть более эффективным с точки зрения памяти.

2. Сообщение V2C

Затем следует, так называемый, горизонтальный шаг: алгоритм требует обработки сообщения (V2C) в области вероятности. Для перехода от LLR к вероятностям воспользуемся отношением между гиперболическим тангенсом и натуральным логарифмом [4, с.32 ]:

линейные двоичные блочные коды. 0b3f0af8ef7fb38ae7cf5e1f6e30ac69. линейные двоичные блочные коды фото. линейные двоичные блочные коды-0b3f0af8ef7fb38ae7cf5e1f6e30ac69. картинка линейные двоичные блочные коды. картинка 0b3f0af8ef7fb38ae7cf5e1f6e30ac69. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Собственно говоря, процедура передачи V2C сообщения — это перемножение ненулевых вероятностей в каждой строке:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

где j — это номер определенной строки, i — это номер определенного столбца, линейные двоичные блочные коды. 890129dc7c58a961bc8931743832a9e5. линейные двоичные блочные коды фото. линейные двоичные блочные коды-890129dc7c58a961bc8931743832a9e5. картинка линейные двоичные блочные коды. картинка 890129dc7c58a961bc8931743832a9e5. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)— это множество ненулевых значений в j-ой строке, а выражение линейные двоичные блочные коды. 1a0d89b4ef51f9dcfd9b599840450109. линейные двоичные блочные коды фото. линейные двоичные блочные коды-1a0d89b4ef51f9dcfd9b599840450109. картинка линейные двоичные блочные коды. картинка 1a0d89b4ef51f9dcfd9b599840450109. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)означает, что мы исключаем i-ый узел переменных (variable node) из рассмотрения.

То есть на данном этапе нам нужно:

Пункт с исключением узла из рассмотрения можно провести двумя способами: 1) выяснять нужное подмножество до перемножения вероятностей или удалять значение из результата после подсчетов. Я, простоты ради, буду пользоваться вторым методом.

Я думаю, кто-то из вас, возможно, слышал названия и других алгоритмов декодирования LDPC кодов. Например, Min-sum [5], Log-SPA [6] или еще какие-нибудь [7]. Такие алгоритмы еще иногда называются субоптимальными. В чем их отличие? Собственно, в данном пункте: данные алгоритмы стремятся снизить сложность декодирования и для этого используют иные формулы для вычисления горизонтального шага. Как правило, здесь начинается подсчет рисков: каким количеством помехоустойчивости мы готовы пожертвовать ради повышения скорости декодирования.

3. Проверка критерия остановки декодирования

Итак, мы подходим к концу первой итерации, а значит пора обновить наши априорные вероятности — сделать их апостериорными:

линейные двоичные блочные коды. a11c990ff08d0f9899fb35eebd92cf57. линейные двоичные блочные коды фото. линейные двоичные блочные коды-a11c990ff08d0f9899fb35eebd92cf57. картинка линейные двоичные блочные коды. картинка a11c990ff08d0f9899fb35eebd92cf57. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

где линейные двоичные блочные коды. 7a101793537743ee60ccae8e0b387f25. линейные двоичные блочные коды фото. линейные двоичные блочные коды-7a101793537743ee60ccae8e0b387f25. картинка линейные двоичные блочные коды. картинка 7a101793537743ee60ccae8e0b387f25. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)— это множество элементов, отвечающих ненулевым элементам матрицы проверки на четность в линейные двоичные блочные коды. 75cb01aa8d9f97db4343ac0c5ef11b2d. линейные двоичные блочные коды фото. линейные двоичные блочные коды-75cb01aa8d9f97db4343ac0c5ef11b2d. картинка линейные двоичные блочные коды. картинка 75cb01aa8d9f97db4343ac0c5ef11b2d. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)-ом столбце.

Наложим их на биты через обратный NRZ:

линейные двоичные блочные коды. e382cb53fb8bfada4941b844446c7764. линейные двоичные блочные коды фото. линейные двоичные блочные коды-e382cb53fb8bfada4941b844446c7764. картинка линейные двоичные блочные коды. картинка e382cb53fb8bfada4941b844446c7764. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

И вычислим синдром по формуле (4). Если вектор нулевой — останавливаем декодирование. Если нет, то переходим к следующему шагу.

4. Сообщение C2V

На этом этапе нужно пересчитать матрицу линейные двоичные блочные коды. 352ea81d300b6abd2c8c1287951e1f8b. линейные двоичные блочные коды фото. линейные двоичные блочные коды-352ea81d300b6abd2c8c1287951e1f8b. картинка линейные двоичные блочные коды. картинка 352ea81d300b6abd2c8c1287951e1f8b. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.):

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)
линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

И далее перейти к вычислению матрицы линейные двоичные блочные коды. abf8932739238b1a36a2f668c61c16e1. линейные двоичные блочные коды фото. линейные двоичные блочные коды-abf8932739238b1a36a2f668c61c16e1. картинка линейные двоичные блочные коды. картинка abf8932739238b1a36a2f668c61c16e1. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.). И так до тех пор, пока не выполнится пункт 3 (или не кончится количество доступных итераций).

Пример декодирования через SPA на Python (numpy)

А теперь давайте перейдем к вещам более интересным — к примерам и скриптам!

Возьмем все тот же пример из [4, с.33 ]:

линейные двоичные блочные коды. . линейные двоичные блочные коды фото. линейные двоичные блочные коды-. картинка линейные двоичные блочные коды. картинка . * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Начинаем декодировать (должна понадобиться одна итерация).

Попробуем другой пример [4, с.36 ]:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Исправить нужно первый и последний биты.

Готовые решения для моделирования

Ну, что же, теперь мы знаем азы блочного кодирования, в целом, и LDPC кодов, в частности, и даже попробовали сделать что-то, так сказать, своими руками. Можно считать, что стадия перехода от обезьяны к человеку пройдена — теорию усвоили (или хотя бы запасли на будущее).

Давайте использовать готовые решения.

Наверное, первое, что придет вам на ум, — это Communication Toolbox от MathWorks (MatLab). Решение, пожалуй, действительно хорошее, но мне оно не нравится по нескольким причинам:

Поэтому я отправился в путешествие по проектам на GitHub и нашел весьма интересный инструментарий: проект aff3ct, написанный на C++.

Прочтем, как проект позиционируют его разработчики:

Работает ПО не только для LDPC кодов, но и для других кодеков (например, можно рассмотреть Turbo-коды и полярные коды).

У проекта есть хорошая документация в формате PDF, в формате WEB-страниц, а также онлайн-версия с визуализацией уже полученных результатов (BER/FER Comparator).

Выберем что-нибудь для примера:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)
Лучше открыть в новой вкладке для полноты эффекта.

Можно запустить любой эксперимент и под свой вкус. Для этого нужно будет по инструкции (см. Instalation) установить ПО и запустить его из командной строки с нужными параметрами.

Устанавливать нужно путем сборки из исходников. Поэтому не забывайте про суперпользователей и места нахождения make-файлов.

Например, я запустил на досуге такую модель к командной строке Ubuntu 18.04:

В итоге сформировалась такая таблица:

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

Можно, конечно, пойти дальше написать какие-нибудь обертки для отрисовки графиков.

У создателей проекта есть и собственные решения по визуализации. Например, PyBER. Суть «тулзы» заключается в том, что с помощью GUI вы можете выбирать сформированные aff3ct txt-файлы, PyBER вам их распарсит и отрисует (полученное можно даже экспортировать, вроде). Лично мне не понравилось представление: графики представлены через plot, а не через более логичный semilogy. Поэтому оставляю опыт использования PyBER на ваше усмотрение.

Допустим, результаты моделирования можно сохранить в txt-файл, а значения отношений битовых ошибок (BER — bit error ratio) можно вытащить уже из него c помощью простой манипуляции с awk:

Все это передать, допустим, в Python и нарисовать графики под свой вкус.

Для кодовых скоростей 1/2 и 3/4 (AWGN канал) у меня получились такая картинка:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Без изысков, но в качестве первого шага неплохо, как мне кажется.

Послесловие

Не спорю, сколько я ни пытался объять необъятное, прошлись мы все же только по вершкам. Однако, я все же надеюсь, что данная статья хоть сколько-то снизит порог вхождения человеку, желающему погрузиться в тему LDPC-кодов (наверное).

Конструктивная критика только приветствуется. И спасибо за ваше внимание!

Литература

R.G. Gallager Low-Density Parity-Check Codes, IRE Transactions on Information Theory, 1962

D.J.C. MacKay Good Error-Correcting Codes Based on Very Sparse Matrices, IEEE Transactions on Information Theory, VOL.45, NO 2., March 1999

«3GPP RAN1 meeting #87 final report». 3GPP. Retrieved 31 August 2017.

Johnson, S. J. (2006). Introducing low-density parity-check codes. University of Newcastle, Australia, V1

Declercq D., Fossorier M. Decoding algorithms for nonbinary LDPC codes over GF(q) //IEEE transactions on communications. – 2007. – Т. 55. – №. 4. – С. 633-643.

Wymeersch H., Steendam H., Moeneclaey M. Log-domain decoding of LDPC codes over GF (q) //2004 IEEE International Conference on Communications (IEEE Cat. No. 04CH37577). – IEEE, 2004. – Т. 2. – С. 772-776.

Chen J. et al. Reduced-complexity decoding of LDPC codes //IEEE transactions on communications. – 2005. – Т. 53. – №. 8. – С. 1288-1299.

Приложения

Хотите немного линейной алгебры?

Давайте порассуждаем о том, как можно найти подмножества ненулевых вероятностей?

Для второго способа нужна будет, правда, заранее подготовленная матрица, которая будет повторять структуру матрицы H с точностью до наоборот: вместо единиц в ней будут нули, а вместо нулей единицы. Назовем ее «зеркалом» матрицы H:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

где линейные двоичные блочные коды. 38c15878bbbafd451916fa718c076dc4. линейные двоичные блочные коды фото. линейные двоичные блочные коды-38c15878bbbafd451916fa718c076dc4. картинка линейные двоичные блочные коды. картинка 38c15878bbbafd451916fa718c076dc4. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)— это сложение по модулю (в нашем случае modulo 2).

Соответственно, процедура замены нулей на единицы в матрице линейные двоичные блочные коды. 352ea81d300b6abd2c8c1287951e1f8b. линейные двоичные блочные коды фото. линейные двоичные блочные коды-352ea81d300b6abd2c8c1287951e1f8b. картинка линейные двоичные блочные коды. картинка 352ea81d300b6abd2c8c1287951e1f8b. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)— это сложение двух матриц:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

После перемножения нужно будет вернуть структуру к исходному виду:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Выглядит забавно, не правда ли? Такой подход очень удобен при небольших матрицах проверки на четность: можно использовать встроенные функции для перемножения элементов в векторах. Однако, я думаю, для больших матриц такой подход может быть неподходящим из-за дополнительного расхода памяти и побочных вычислений.

Вопрос о сложности и простоте декодирования, может быть, не так хорошо просматривается на двоичных кодах, однако на кодах недвоичных встает, так сказать, во весь рост. Пример для GF(4).

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Во-первых, вместо вектора LLR, нам придется работать с матрицей LLR (нужно ведь проверять вероятность уже не только двух событий):

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Соответственно, пересылаемые сообщения — это уже тензоры, которые придется разбивать на слои и обрабатывать в цикле:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

И уже потом выбирать наиболее вероятное значение:

линейные двоичные блочные коды. image loader. линейные двоичные блочные коды фото. линейные двоичные блочные коды-image loader. картинка линейные двоичные блочные коды. картинка image loader. * ( В дальнейшем в этой главе без дополнительных оговорок будем обозначать " + " и "-" поразрядное суммирование по модулю 2.)

Сложность будет расти пропорционально увеличению q в выражении GF(q). Волей-неволей задумаешься о более быстрых алгоритмах…

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *