Programmnaya_obrabotka_kodov

advertisement
Министерство образования Республики Беларусь
Учреждение образования
«Белорусский государственный университет информатики и
радиоэлектроники»
Кафедра Сетей и устройств телекоммуникаций
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к лабораторной работе
«ПРОГРАММНАЯ ОБРАБОТКА КОДОВ, ИСПРАВЛЯЮЩИХ
НЕЗАВИСИМЫЕ И ПАКЕТНЫЕ ОШИБКИ»
Минск
1. ЦЕЛЬ РАБОТЫ
Изучение принципов обработки циклических кодов, корректирующих
независимые и пакетные ошибки, на основе программных средств ПЭВМ.
2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
2.1. Способы задания циклических кодов
При передаче информации по каналу связи возможно ее искажение
помехами (рис. 1). Одним из наиболее мощных методов борьбы с помехами
является применение кодов, исправляющих и обнаруживающих ошибки.
Сообщение размерности k, поступающее в кодер от источника данных,
преобразовывается в последовательность символов размерности n, называемую
кодовым словом. Эта последовательность после модуляции поступает в канал
связи, где на нее воздействуют помехи, внося искажения в передаваемое
сообщение. Принятое сообщение после демодуляции поступает на декодер,
который, используя избыточность кодового слова, исправляет и обнаруживает
ошибки.
Для оценки обнаруживающей и исправляющей способности кодов
введено понятие кодового расстояния d. Для обнаружения t ошибок необходимо, чтобы минимальное кодовое расстояние d *  t  1, для исправления
ошибок: d *  2t  1 . Под t понимается кратность ошибки, то есть число позиций
кодового слова, измененных под воздействием помех. Обычно ошибка
описывается вектором ошибок e размерности n с единичными символами в
искаженных позициях.
Часто помеха имеет длительность больше длительности одного символа.
В этом случае ошибки возникают пачками (пакетами). Такие ошибки
длительностью P определяются вектором ошибки e , в котором все единицы
заключены в последовательность P символов, при условии, что крайние
символы этой последовательности – единицы. Например, пакеты ошибок
длиной 4 могут быть следующими: 0…010110…0, 010010…0, 0…011110.
Большинство известных хороших кодов принадлежит к классу линейных.
Линейный код есть непустое множество n-последовательностей над GF (q) ,
такое, что сумма двух любых кодовых слов есть также кодовое слово, и
произведение кодового слова на элемент поля является кодовым словом. В
любом коде нулевое слово является кодовым, как начало координат векторного
пространства.
Обычно используются двоичные коды, являющиеся подпространством в
n
GF (2 ) . Элементами GF (2n ) являются 0 и 1. Таким образом, каждая nпоследовательность (кодовое слово) представляет собой набор нулей и единиц.
2
Рис. 1
В пространстве GF (2n ) сложение двух векторов в каждой компоненте
производится по модулю 2 (mod 2 ) :
00  0,
0  1  1,
1  0  1,
11  0.
Если код длины n состоит из M двоичных слов M  2k , k  n , то говорят,
что это двоичный (n,k)-код; n-длина кодового слова, k-число информационных,
а r  n  k -проверочных символов.
Коды задаются порождающей G и проверочной H матрицами,
размерностью соответственно (k  n) и r  n) , удовлетворяющими условию
GH T  0.
Строками матрицы G являются k линейно независимых векторов длины
n. При этом любое кодовое слово есть линейная комбинация строк G. Поэтому
G называется порождающей матрицей кода.
Пространство строк матрицы и минимальное расстояние d * не
изменяются при перестановке строк матрицы, прибавлении к одной строке
3
другой, умноженной на скаляр. Поэтому любая матрица G может быть
приведена к систематическому виду
I G *
G 
k
k
n

k


где I – единичная матрица.
Поскольку всего существует q k кодовых слов, то столько же kпоследовательностей можно отобразить на множество кодовых слов. Наиболее
простой способ этого отображения (кодирования) может быть представлен в
виде
a  vG
Часто используется матрица H следующего вида: H  G* T I  ,


*T
*
где G -транспонированная подматрица G матрицы G. Принятое из канала
связи слово является кодовым только в том случае, если выполняется равенство
aH T  0
Поэтому матрицу H называют проверочной матрицей.
Если в принятом слове a  отсутствуют ошибки, то
aH T  vGH T  v  0  0.
Если пре передаче информации возникли ошибки, то
T
aH  (a  e) H T  aH T  eH T  vGH T  eH T  eH T  S ,
где e-вектор ошибки.
Значение S  eH T называется синдромом. Длина синдрома равна r.
Ненулевая величина синдрома говорит об ошибке. Поскольку разным ошибкам
соответствуют различные синдромы, то по виду синдрома можно определить
тип ошибки, а значит и исправить ее.
Упростить техническую реализацию кодирования и декодирования
линейных кодов можно, если наложить на них некоторые ограничения. Одним
из таких ограничений может быть свойство цикличности. Оно состоит в том,
что, если слово (a0 , a1 ,..., an 1 ) является кодовым, то его циклическая
перестановка (an1 , a0 , a1 ,..., an2 ) также является кодовым словом. Коды,
обладающие этим свойством, называют циклическими.
Поскольку каждый линейный код длины n представляет собой
подпространство пространства GF (q n ) , то циклический код является частным
случаем этого подпространства в силу дополнительного свойства цикличности.
Каждый вектор пространства GF (q n ) можно представить в виде многочлена от
3
x степени не выше n  1 . Например, v( x)  x или 0001. При этом необходимо
учесть, что действия над векторами производятся по правилу арифметики по
модулю 2, где вычитание эквивалентно сложению. Так из равенства x n  1 0
4
или x n  1 получим x n  1  1  1  0 , то есть вместо x n  1 можно записать
x n  1. Порядок деления и умножения основан на правиле x i  x i  (1  1) x i  0.
Пример 1:
(1  x  x 3 )(1  x  x 2  x 4 )  1  x  x 3  x  x 2  x 4  x 2  x 3  x 5  x 4  x 5  x 7  1  x 7
или в двоичном коде
10111
1011
10111
10111
10111
10000001
Пример 2
(1  x 7 )  (1  x  x 3 )  1  x  x 2  x 4
или
x7  1
x7  x5  x 4
x3  x  1
x4  x2  x 1
x5  x 4  1
x5  x3  x 2
x 4  x3  x 2  1
x4  x2  x
x3  x  1
x3  x  1
Для циклических кодов удобно представление векторов в виде
полиномов, поскольку циклическая перестановка (сдвиг) кодового слова
эквивалентна умножению соответствующего полинома на X:
x  v( x)  x  (v0  v1  x  v2  x 2    vn1  x n1 ) 
 v0  x  v1  x 2  v2  x 3    vn2  x n1  vn1  x n
(при этом учитывается, что это полиномы по модулю x n  1, то есть x n  1).
Циклический код может быть задан генераторным (порождающим)
полиномом g ( x)  g 0  g1  x  ...  g r  x r . Полином a(x) является кодовым
словом тогда и только тогда, когда делится на генераторный полином без
остатка:
a ( x)  v( x)  g ( x)
где v(x) – частное от деления a(x) на g(x) (полиному v(x) соответствует
последовательность информационных символов).
5
Чтобы многочлен был порождающим полиномом кода длины n над полем
GF(q), необходимо, чтобы он делил без остатка многочлен x n  1 или что одно
и тоже, x n  1.
Порождающий многочлен циклического кода Файра, корректирующего
пакет ошибок длины b или менее, имеет вид:
g ( x)  ( x 2b1  1)  p( x) ,
где p(x) – неприводимы многочлен степени m (то есть не делящийся ни на
какой полином степени меньше m), m  b, p( x) не должен делить ( x 2b1  1) .
Множитель x 2b1  1 связан с 2b  1 перемежающимися равномерно
расположенными проверками на четность. Символы, участвующие в каждой
проверке, располагаются на расстоянии 2b  1 , поэтому на каждую из этих
проверок будет влиять не более чем одна ошибка в пакете длины 2b  1 или
меньше. Если пакет ошибок имеет длину b или меньше, то по оставшимся не
затронутым по крайней мере b-1 проверкам можно определить, какой символ
расположен в начале пакета.
Множитель p(x) определяет положение пакета.
Второй способ задания циклического кода основан на использовании
проверочного полинома h(x)  (x n  1) / g(x)  h0  h 1  x    h k  x k
Порождающая и проверочная матрицы строятся следующим образом:
 g 0 g1 ... g r 0
 g ( x)

 0 g 0 g1 ... g r
 x  g ( x)

G  



... ... ...
k 1



x

g
(
x
)


 0 0 ... 0 0
 0 ... 0
 h( x )

 0 ... hk
 x  h( x )

H  

...
r 1



x

h
(
x
)


hk ... h2
hk
...
...
h1
...
h2
...
h0
0 ... 0 
0 ... 0 

...

g 0 ... g r 
h2 h1 h0 
h1 h0 0 

...

0 ... 0 
Умножения сообщения v(x) на порождающую матрицу эквивалентно
перемножению v(x) и g (x) . Действительно,
v( x)  G  (v0 , v1 ,, vk )  G  [v0  g 0 , (v0  g1  v1  g 0 ),] 
 v( x)  g ( x)  v0  g 0  (v0  g1  v1  g 0 )  x  
Таким образом, закодировать сообщение циклическим кодом можно
перемножив сообщение, представленное в полиномиальном виде, на
порождающий полином.
Пример 3:
Код (7; 4) порождается полиномом
g ( x)  1  x  x 3 . Пусть передается
сообщение v( x)  1  x 2  1010 . При кодировании получим кодовое слово:
6
a( x)  v( x)  g ( x)  (1  x 2 )  (1  x  x 3 )  1  x 2  x  x 3  x 3  x 5  1  x  x 2  x 5 или
1110010.
Такой код называется неразделимым, так как в кодовом слове нельзя
выделить ни информационных, ни проверочных символов.
Другой способ кодирования позволяет получить разделимый код.
Кодирование осуществляется по следующему алгоритму: вычисляется остаток
от деления v( x)  x r на g (x) и дописывается к информационным символам.
Построенное таким образом слово является кодовым, поскольку делится на
g (x) . Действительно:
x r  v( x)
t ( x)
C
g ( x)
g ( x)
где С – целая часть, t (x) – некоторый остаток. Преобразуем это выражение к
виду:
x r  v( x)  C  g ( x)  t ( x)
x r  v( x)  t ( x)  C  g ( x)
x r  v( x)  t ( x) делится на g (x) без остатка, так как C – целое.
При таком способе кодирования слово
a( x)  x r  v( x)  t ( x)
где t ( x)  Rg ( x ) [ x r  v( x)] ; ( Rg ( x ) [ x r  v( x)] ) - остаток от деления многочлена
x r  v(x) на g (x) .
Действительно, так как Rg ( x ) [a( x)]  0 , то Rg ( x ) [ x r  v( x)]  Rg ( x ) [t ( x)]  0
(степень многочлена t (x) меньше степени многочлена g (x) ). Отсюда
t ( x)  Rg ( x ) [ x r  v( x)]
Пример 4:
Пусть исходные данные те же, что и в примере 3. Закодируем v(x)
раздельным кодом:
(1  x 2 )  x 3  x 3  x 5  0001010
x5  0  x3  0  0  0 x  0  x  1
x5  0  x3  x 2
x2
x2
Остаток 00I.
Кодовое слово 00II0I0
При обоих рассмотренных способах кодирования множество кодовых
слов остается одним и тем же, то есть это один и тот же код; однако изменяется
соответствие сообщений и кодовых слов.
3
7
2.2 Цифровые устройства, реализующие цифровые коды
Схемная реализация кодов базируется на следующих основных
элементах: триггерной ячейке (рис. 2, а), сумматоре по модулю два (рис. 2, б),
умножителе на скаляр (рис. 2, в).
α
а)
hα
h
б)
Рис. 2
в)
Принцип действия триггерной ячейки (регистра сдвига) поясняется на
рис. 3. При дискретном воздействии на входе ячейка меняет свое состояние
(состоянием ячейки называется символ, содержащийся внутри ячейки). Каждое
такое изменение называется шагом. На рис. 3 показано изменение состояния
ячейки за 1 шаг.
α
β
α
β
Рис. 3
Из алгоритма кодирования видно, что схемная реализация кодирующего
устройства базируется на схемах умножения деления многочленов. В такие
устройства многочлены передаются начиная с коэффициентов высших
порядков, тат как при делении у делителя сначала должны быть обработаны
коэффициенты высших порядков (см. пример I). Схемы? реализующие
умножение многочлена v( x)  vk  x k  vk 1  x k 1  ...  v1  x  v0 на фиксированный
многочлен g ( x)  g r  x r  g r 1  x r 1    g1  x  g 0 , приведены на рис. 4
выход
…
gr
V(x)
1
вход
g2
gr-2
gr-1
2
…
3
r-2
g0
g1
r-1
a ( x) 
 v( x) g ( x)
r
a)
1
g0
2
g1
выход
3 …
g2
r-1
gr-2
r
gr-1
a(x)
gr
…
V(x)
вход
б)
Рис. 4
8
Произведение a( x)  g ( x)  v( x) 
 v k  g r  x k  r  (v k 1  g r  v k  g r 1 )  x k  r 1 
 (v k  2  g r  v k 1  g r 1  v k  g r  2 )  x k  r  2  
  (v0  g 2  v1  g1  v 2  g 0 )  x 2  (v0  g1  v1  g 0 )  x  v0  g 0
Предполагается, что первоначально в триггерных ячейках (рис. 4, а) –
нули, коэффициенты g 0 , g1 ,, g r известны, а на вход поступают
коэффициенты многочлена v(x), начиная со старших, после чего следует r
нулей. Когда на вход подается первый элемент многочлена v(x) , на выходе
появится первый v k элемент произведения vk  g k . На втором шаге на выходе
появляется vk 1 ; v k – в первой ячейке, во всех остальных ячейках по-прежнему
нули. Как видно из схемы, выход равен vk 1  g r  vk  g r 1 ,то есть величине
второго коэффициента произведения. Дальнейшие операции производятся
аналогичным образом после k  r  1 сдвигов в ячейках регистра 0,0,...,0, a0 , a1 ;
выход равен v0 g1 _ v1 g 0 , то есть последнему коэффициенту произведения
v( x) g ( x) . На последнем k  r сдвиге в ячейках 0,0...,0,a0 ; на выходе v0 g 0 –
последний коэффициент произведения. Деление закончено. Аналогичным
образом работает схема на рис. 4, б.
Общий вид схемы, реализующей деление многочлена v(x) на g (x) ,
приведен на рис. 5.
выход
g0
вход
g1
1
g2
gr-2
…
2
gr
gr-1
r-1
r
Рис. 5
Пример 5: Пусть требуется разделить
v( x)  x8  x 6  x 3  x  1  [110100101 ] на g ( x)  x 4  x  1  [11001] .
Соответствующая схема приведена на рис. 6,а. Вначале устройство
памяти содержит нули. Выходной символ принимает значения, равные 0 на
первых 4-х (r) сдвигах, пока первый входной символ не достигнет конца
регистра сдвига. Эти первые сдвиги не имеют аналогий при делении столбиком
(рис. 6,в). Для каждого коэффициента частного ai необходимо (как при
делении столбиком) вычесть из делимого многочлен ai g (x) . Это вычитание
осуществляется с помощью обратной связи. Так, после 4-го шага содержимое
регистра сдвига соответствует многочлену, обозначенному на рис. 6,в буквой
A. Обратной связи соответствует многочлен, обозначенный буквой B, а входу –
многочлен C, сносимый при делении столбиком. После 5-го шага содержимому
регистра сдвига соответствует многочлен, обозначенный D. После всех девяти
9
(n) сдвигов на выходе – младший коэффициент частного от деления, а в
регистре сдвига – остаток.
выход
в
в
в
а
вход
а)
j
a
Содержимое
регистра
сдвига после j
шагов
в
0
-
0000
0
1
1
1000
0
2
0
0100
0
3
1
1010
0
4
0
0101
1
5
0
1110
0
6
1
1111
1
7
0
1011
1
8
1
0001
1
9
1
0100
0
а – входной символ в
момент j шага
в – выходной символ
после j сдвига
б)
A
B
D
E
G
4
x8  0  x 6  0  0  x 3  0  x  1 x  0  0  x  1
4
x  0  x2  x 1
x8  0  0  x5  x 4
C
0  x6  x5  x 4  x3
00000
F
x6  x5  x 4  x3  0
x6  0  0  x3  x 2
x5  x 4  0  x 2  x
x5  0  0  x 2  x
x4  0  0  0 1
x4  0  0  x 1
0  0  x 1  остаток
в)
Рис. 6
Схема, с помощью которой реализуется умножение на h(x) , а затем
деление на g (x) , приведена на рис. 7 (степени многочленов h(x) и g (x)
равны).
10
…
g2
g1
g0
1
…
2
h2
h1
h0
выход
gr-2
gr
gr-1
r-1
r
hr-1
hr-2
hr
…
вход
Рис. 7
Кодирующие устройства циклических кодов приведены на рис. 4,а,б,
рис. 8,а,б. Кодирование разделимым кодом можно осуществить с помощью
схем с k или r ячейками. Тот или иной способ выбирается из соображений
меньших аппаратурных затрат. Для исследуемых в данной работе кодов лучше
использовать второй способ (рис.8,б).
hk
h1
hk-1
1
вход
…
2
h0
K
выход
а)
вверх на последних – Ключ 2
r тактах
вход
V1(x)
g0
g1
1
g2
2
gr-2
…
gr-1
r-1
б)
r
1-на первых
Ключ k тактах
1
(всего n
на последних
r тактах
2
тактов)
r
выход
a ( x) 
x v( x)
g ( x)
Рис. 8
При таком способе кодирования вначале ключ 1 – в положении 1, ключ 2
– замкнут. Информационные символы непосредственно передаются на выход
одновременно в кодирующее устройство, в котором за k шагов образуется nk=r контрольных символов. Затем ключ 1 – в положении 2, ключ 2 –
размыкается. Регистр делает еще r шагов, выдавая контрольные символы на
выход.
При декодировании циклических кодов наибольшее распространение
получили 2 способа декодирования: синдромное и мажоритарное (по принципу
большинства).
11
Мажоритарное декодирование привлекает как простотой описания, так и
невысокой сложностью схемной реализации. Однако не все коды допускают
такое декодирование.
Ранее было отмечено, что вид ошибок можно определить по виду
синдрома. Общая схема декодирующего устройства по синдрому изображена
на рис. 9.
r – разрядный
генератор
синдрома
r – разрядный
селектор
исправление
ошибки
принятое
слово a ( x )
n – разрядный
буферный
регистр
исправленное
слово v( x )
Рис. 9
Полученное из канала связи слово a (x) начиная со старших символов,
записывается в буферный регистр и одновременно поступает в генератор
синдрома, где через n шагов находится остаток от деления a (x) на g (x) . Если
ошибок нет, то принятое слово принадлежит коду и синдром (остаток) равен
нулю. Ненулевой остаток свидетельствует о наличии ошибки. Задача селектора
– выдать исправляющий сигнал в тот момент, когда ошибочный символ
покидает буферный регистр. Таким образом, исправление ошибок происходит
за 2 n тактов.
Можно декодировать сообщение используя таблицу заранее
вычисленных синдромов и соответствующих им векторов ошибок. Однако
такое устройство получается довольно сложным. Определение ошибки по
синдрому для циклических кодов значительно упрощается благодаря
следующему свойству:
Если S (x) – синдром набора a(x) длины n , то синдром циклического
сдвига набора a(x) , то есть x  a(x) получается в результате одного сдвига
генератора синдрома для многочлена g (x) , в котором первоначально
содержится S (x) .
При
полиномиальном
представлении
синдромный
многочлен
определяется как остаток от деления многочлена a (x) на g (x) :
S ( x)  Rg ( x )  [a( x)]  Rg ( x )  [a( x)  e( x)]  Rg ( x )  [e( x)]
Обычно бывает удобно, чтобы синдром имел единицы не в нескольких, а
только в старшем ряде для e( x)  en1  x n1 . Тогда его определяют как остаток от
деления на g (x) многочлена x r  a(x) :
12
S ( x)  Rg ( x )  [ x r  a ( x)].
Действительно, в данном случае
S ( x)  Rg ( x )  [ x r  a ( x)] 
 Rg ( x )  [ x n  k  (a ( x)  e( x))]  Rg ( x )  [a ( x)]  0 
 Rg ( x )  [ x n  k  e( x)]  Rg ( x )  [ x n  k  en 1  x n 1 ] 
 Rg ( x )  [e( x)]  Rg ( x )  [ Rd ( x )  [e( x)]]
если d (x) кратен
 Rg ( x )  [ Rx 1  [en1  x 2 nk 1 ]]  Rg ( x )  [en1  x nk 1 ]  en1  x nk 1  en1  x r 1
g (x)
(степень g (x) равна r  n  k ).
n
0en 1
При таком определении синдром равен 00


n
Соответствующий декодер представлен на рис. 10
открыт на первых n тактах
генератор синдрома
Кл. 1
1
g r 1
g2
g1
g0
2
r-1
r
комбинационная логическая
схема
Кл.2
принятое
слово a ( x )
открыт при
появлении “1” на
выходе логич. схемы
исправление
ошибки
n- разрядный
буферный регистр
исправленное
слово v( x )
Рис. 10
Рассмотрим, например, (15,11) – код, задаваемый многочленом g ( x)  x 4  x  1 (рис. 10). Этот код исправляет только одну ошибку.
Ошибке e( x)  x14 соответствует синдром
S (x )  Rg ( x )  [ x 4  e( x)]  Rx  x 1  [ x 4  x14 ]  x 3 ,
4
то есть селектор настроен на комбинацию 0001. Синдром, вычисленный по
принятому слову, находится в генераторе синдрома после 15 тактов (ключ 1 –
открыт, ключ 2 – закрыт). Если полученный синдром равен s (x ) , то e( x)  x14
и соответствующий бит исправляется (ключ 2 – открыт). В противном случае
13
старший символ a (x) поступает на выход без изменения ( an1  vn1 , ключ 2 –
закрыт). Важно, что на входе схемы после n тактов – нули (ключ 1 закрыт).
Если на следующем шаге в генераторе синдрома появится комбинации 0001,
то e( x)  x13 и исправляется символ a n  2 . Так же проверяется необходимость
исправления каждого из битов. После 15 шагов процесс исправления окончен.
Обработка одного слова заняла 30 тактов. Для получения информационной
последовательности v(x) от v(x) необходимо отбросить r последних
символов. Поэтому буферный регистр может состоять не из n, а из k ячеек.
Декодер циклического кода, исправляющего пакеты ошибок, строится
аналогично рассмотренному, а процесс декодирования основывается на
следующем свойстве: если к комбинации ошибок, которая может быть
исправлена, все ошибки расположены в r  n  k старших разрядах, то синдром
совпадает с последовательностью ошибок e(x). Действительно, пусть
e( x)  x k  f ( x) , где f(x) – многочлен степени n  k  1или меньше. Генератор
синдрома вычисляет
 [ x nk  e( x)]  R
 [ x nk  x k  f ( x)] 
g ( x)
g ( x)
R
 [ x n  f ( x)]  R
 [ R n  [ x n  f ( x)]] 
x 1
g ( x)
g ( x)
S ( x)  R
R
g ( x)
 [ f ( x)]  f ( x)
Таким образом, декодер кода, исправляющего пакет ошибок, аналогичен
декодеру, изображенному на рис. 10, но селектор настроен на комбинацию
00  0 x1  x2    x p

 

p
Процесс исправления пакета ошибок происходит за 2n шагов следующим
образом: весь принятый вектор за n шагов записывается в буферном устройстве
и одновременно поступает в генератор синдрома (ключ 1 – открыт, ключ 2 –
закрыт). Затем весь принятый вектор считывается с буферного регистра,
информация в регистре сдвига сдвигается на один разряд, причем на вход
схемы подаются нулевые сигналы. Когда в первых r  p ячейках появятся нули,
то в последних ячейках – комбинация ошибок. Ключ 1 закрыт, ключ 2 открыт,
и происходит исправление ошибочных символов, поступающих с буферного
регистра.
2.3. Программная реализация циклических кодов.
Если к быстродействию устройств, реализующих коды, не предъявляется
жестких требований, кодирование и декодирование можно осуществить на
ПЭВМ. При этом нет необходимости иметь для различных кодов специальные
устройства, достаточно набора соответствующих программ.
14
В данной лабораторной работе используются программы, имитирующие
работу кодера и декодера для кодов, исправляющих одиночные (RANDOM) и
пакетные (BURST) ошибки на основании рассмотренных выше алгоритмов.
Блок-схемы этих алгоритмов приведены на рис. 11.
При реализации кодов на ПЭВМ значения коэффициентов данного
полинома степени k хранятся в ячейках памяти с именем, присвоенным
данному полиному, и номерами от 1 (младший коэффициент) до k+1 (старший
коэффициент). Умножение v(x) на x r осуществляется сдвигом коэффициентов
полинома v(x) в ячейки с большими номерами и заполнением освободившихся
младших ячеек нулями.
Двоичное деление осуществляется последовательным вычитанием. При
работе с двоичными кодами необходимо учитывать правила суммирования по
модулю два.
1 a* ( x)  a( x)
2
да
S ( x) 
a( x) x r
g ( x)
3 S ( x )  e( x )  0
нет
4
А
i 0
Б
Рис. 11
15
А
Б
да
{
5 S(x)  0...01
t-1
нет
*
6 ak 1i  ak 1i
Рис. 12
7
S(x)  x  S(x)
8
i i 1
9
нет
i k 2
*
10 ak 1i  ak 1i  1
(mod 2)
12
a(x)  a(x)
13
a( x)  v ( x)
a0
…
ak 1i 1  a*k 1i 1
…
11
 a*0
14
произошла
неисправляемая
ошибка
Рис. 11 (продолжение)
16
3. ПРЕДВАРИТЕЛЬНОЕ ЗАДАНИЕ
3.1. Методом проб и ошибок найти множество из четырех двоичных слов
длины три таких, что каждое слово находится от каждого другого слова на
расстоянии не меньше двух ( d  2 ).
3.2. Показать, что умножение на порождающую матрицу эквивалентно
умножению на порождающий полином.
3.3. Код имеет длину n  7 и задан генераторным полиномом
y ( x)  1  x  x3 . Требуется:
а) определить число информационных и проверочных символов;
б) определить количество кодовых слов (мощность кода);
в) считая сообщения двоичными числами, закодировать их разделимым и
неразделимым кодами. Убедиться, что в результате получается один и тот же
код;
г) вычислить проверочный полином;
д) построить порождающую и проверочную матрицы.
3.4. Используя соотношение a( x)  H T  0 , показать, что схема,
представленная на рис. 8,а, является кодером разделимого кода.
3.5. Построить кодирующее устройство разделимого кода (исходные
данные из п.3 предварительного задания). Закодировать любое сообщение и
показать состояние ячеек кодера при каждом такте работы.
3.6. Построить схему декодера по синдрому для кода п.3
предварительного задания. Декодировать сообщение a ( x)  1  0  0  x3  0  x5  x6 и
1
a ( x)  1  0  0  x3  x 4  x5  0 .
2
3.7. Построить блок-схему алгоритма декодирования циклического кода,
исправляющего пакетные ошибки.
3.8. Для кода (7;4) из п.4 предварительного задания разработать
программу, имитирующую работу кодера этого кода.
4. ЛАБОРАТОРНОЕ ЗАДАНИЕ
4.1 Включить ПЭВМ
Вставить гибкий магнитный диск в окно B (..) и закрыть окно.
Нажать тумблеры “сеть” на задней стенке системного блока,
Перейти в латинский алфавит (клавиша “ALT”).
Нажать “ Доп ↑”, N.
С помощью “↔” перейти на диск В.
4.2. Исследование кодов, исправляющих случайные ошибки.
4.2.1. Вызвать программу RANDOM.EXE (с помощью “↓” переместить
метку к имени RANDOM и нажать “Ввод” в средней части клавиатуры).
17
4.2.2. При появлении заставки нажать “Ввод” и ввести генераторный
полином, задаваемый преподавателем.
Пример.
Требуется ввести g ( x )  x 3  x  1.
IQ(0) "1"
IQ (1) "1"
IQ (2) "0"
IQ(3) "1"
IQ (4) "1"
“Ввод”
“Ввод”
“Ввод”
“Ввод”
“Ввод”
“Ввод”
Если полином введен с ошибкой, при появлении запроса “Требуется
коррекция генераторного полинома? Y/N” набрать “Y” и снова ввести
полином.
4.2.3. Ввести сообщение (аналогично п. 4.2.2.). После появления на
экране схемы кодирующего устройства по шагам (используя “Ввод”) вывести
состояние ячеек кодера.
4.2.4. После запроса ввести вектор ошибки.
4.2.5. Рассмотреть работу декодирующего устройства (аналогично
п.4.2.3).
4.2.6. Повторить п.4.2.2. – 4.2.5. 4-6 раз. Для этого при появлении вопроса
“Продолжать расчет? Y/N” ввести “Y” “Ввод”. По окончании работы ввести
“N” “Ввод”.
4.3. Исследование кодов, исправляющих пакетные ошибки.
4.3.1. Вызвать программу BURST.EXE (см. п.4.2.1).
4.3.2. Ввести генераторный полином кода Файра, исправляющего
пакетные ошибки.
Параметры кода: p=3, n=35,
g ( x)  ( x 5  1)  ( x 3  x  1)  x 8  x 6  x 5  x 3  x  1.
4.3.3. Проделать п. 4.2.3-4.2.6 (с учетом параметров кода Файра n=35,
k=27).
4.4. Оформить отчет и сделать выводы.
5. СОДЕРЖАНИЕ ОТЧЕТА
Отчет должен содержать:
1. Решение задач предварительного задания.
2. Результаты экспериментальной проверки.
3. Анализ результатов и выводы.
6. КОНТРОЛЬНЫЕ ВОПРОСЫ
GF (2 n ) ?
18
1. Сколько векторов содержит векторное пространство
2. Сколько ошибок может исправить и обнаружить код с d=21?
3. Как задать и построить циклический код?
4. В чем разница между разделимыми и неразделимыми кодами?
5. Как связаны между собой порождающая и проверочная матрицы,
генераторный и проверочный полиномы?
6. В чем сущность синдромного и мажоритарного декодирования? Какой
способ по Вашему мнению лучше?
7. Какую функцию реализует мажоритарный элемент на 3 входа
f(X1,X2,X3)?
8. Нарисовать схему сумматора по модулю два (желательно несколько
вариантов).
9. Нарисовать схему ячейки регистра сдвига.
10. Каковы, по Вашему мнению, достоинства и недостатки схемной
реализации кодов и реализации их на ПЭВМ?
11. Как задать тип переменной при программировании на PASCALе?
12. Как реализовать на ПЭВМ суммирование двух векторов в поле GF (2n ) ?
19
Download