Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

(по цифровому вещанию) Dvorkovich_V_Cifrovye_videoinformacionnye_sistemy

.pdf
Скачиваний:
258
Добавлен:
15.03.2016
Размер:
23.26 Mб
Скачать

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

Кодовые слова v Vk могут быть представлены в систематической форме v = (c, e), которая образуется отдельно вектором-сообщением c и проверочной частью из mn − k проверочных символов. Порождающая матрица такого систе-

матического кода имеет вид:

 

1

· · ·

0

 

g1,0

 

g1,1

· · ·

 

g1,m−1

 

 

 

 

0

 

 

 

 

?

@

 

1

0

. . .

0

 

g0,0

 

g0,1 . . .

 

g0,m−1

 

 

0

0

 

1

g

...

g

...

...

g

...

,

Gk×n = Ik Pk×(n−k)

=

... ... ... ...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

· · ·

 

 

k−1,0

 

k−1,1 · · ·

 

k−1,m−1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(19.6)

где Ik — единичная матрица размерности k × k, предназначенная для формирования информационной части кодового слова; Pk×(n−k) — матрица элементов линейно независимых векторов g, определяющая проверочные символы.

Для кода v Vk в пространстве Vn существует дуальный код vd, такой, что скалярное произведение любой пары векторов, один из которых относится к коду v, а другой кvd, всегда равно нулю. Это значит, что векторы кода vd ортогональны векторам кода v. Дуальное векторное подпространство образуется n − k линейно независимыми базисными векторами (h0,h1,. . . ,hn−k−1). Эти векторы образуют строки проверочной матрицы:

 

 

h1

 

h1,0

 

h1,1

· · ·

 

h1,n−1

 

 

h

h0

 

 

h

h0,0

 

h0,1 . . .

 

h0,n−1

 

 

 

 

 

h

 

 

h

 

H(n−k)×n =

...

 

=

...

 

...

...

 

...

.

 

 

n−k−1

 

 

 

n−k−1,0

 

n−k−1,1

· · ·

 

n−k−1,n−1

 

 

 

 

 

 

 

 

 

 

Если порождающая матрица задана в систематической форме (19.6), то систематическая форма проверочной матрицы имеет вид:

H = P T× − |In−k . (19.7)

k (n k)

В силу ортогональности векторов кода vd векторам кода v выполняется следующее свойство:

GHT = 0.

(19.8)

Таким образом, для каждого кодового слова v Vk в силу (19.8) справедливо соотношение

 

 

 

 

 

 

 

 

 

s = v · HT = c · G · HT = 0.

(19.9)

 

 

 

 

 

 

 

 

 

 

Вектор s называется синдромом. Любому век-

 

 

 

 

 

 

 

 

 

 

тору, не принадлежащему коду v, будет соответ-

 

 

 

 

 

 

 

 

 

 

ствовать отличный от нуля синдром.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Уравнение (19.9) является фундаментальным

 

 

 

 

 

 

 

 

 

 

для декодирования линейных кодов. Пусть кодовое

 

 

 

 

 

 

 

 

 

 

слово v Vk, переданное по дискретному кана-

 

 

 

 

 

 

 

 

 

 

Рис. 19.5. Модель двоичного

лу с помехами, принято как r=v+e, где вектор

ошибок e {0, 1}

n

. Вектор ошибок e создается ка-

симметричного канала; p — веро-

 

ятность искажения символа

налом связи в процессе передачи кодового слова v.

Простейшей моделью канала является двоичный симметричный канал (ДСК), отражающий применение двоичной модуляции в канале связи с аддитивным белым шумом (рис. 19.5).

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

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

s = r · HT = (v + e) · HT = e · HT .

(19.10)

Если значение синдрома s = 0 при e = 0, то принятая кодовая комбинация r является разрешенной и, следовательно, не содержит ошибки. В случае когда значение синдрома s = 0 при e = 0, то имеется факт необнаружимой ошибки. Очевидно, что это произойдет только тогда, когда вектор e будет принадлежать коду v. В противном случае ошибка, содержащаяся в r, будет обнаружена и при возможности исправлена.

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

19.2.2. Свойства линейных блочных кодов

Корректирующая способность кода и расстояние Хемминга

Корректирующая способность помехоустойчивого кода определяется свойствами векторного пространства и зависит от расстояния между кодовыми словами. Для наглядности на рис. 19.6 представлена геометрическая интерпретация векторного пространства. На нем показаны n-мерные кодовые слова v1, v2, v3, соответствующие разрешенным кодовым комбинациям, векторы r, означающие возможные принимаемые комбинации, и вектор ошибки e1. Окружностями с центрами в точках, соответствующих изображениям v1, v2, v3 на плоскости, обозначены области декодирования. Это означает, что если принятый вектор r окажется внутри области декодирования кода v1, то декодер выдаст решение о приеме v1.

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

n−1

 

l

 

d(vi, vj ) = ωH (vi vj ) = vi,l vj,l.

(19.11)

=0

 

Расстояние, измеренное таким образом, называется кодовым расстоянием, или расстоянием Хемминга. Величину d(vi, vj ) можно также выразить через вес кода ωH ( · ), означающего число отличных от нуля компонент кодового вектора (в данном случае — вектора, образованного скалярной суммой векторов vi и vj ). Значение d(vi, vj ) определяется количеством единиц в сумме этих комбинаций по модулю два и не может превышать значения длины кодовой комбинации.

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

Рис. 19.6. Сферы декодирования векторного пространства

Например:

110011 → vi

011101 → vj 101110 d(vi, vj ) = 4 .

Важнейшей характеристикой помехоустойчивых кодов является минимальное расстоянием Хэмминга, которое определяется как минимальное кодовое расстояние между всеми возможными комбинациями кода:

dmin = min{d(vi, vj )} i, j.

(19.12)

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

Корректирующая способность линейного кода определяется следующим образом: линейный двоичный (n, k)-код с минимальным расстояние Хэмминга dmin2t + 1 может обнаруживать ошибки кратности dmin −1 и исправлять t ошибок. Если код исправляет все ошибки кратности меньше t, то области декодирования представляют собой сферы радиуса t в n-мерном пространстве (рис. 19.6).

Геометрическая интерпретация кодового расстояния и граница Хемминга

Геометрической моделью n-разрядного безызбыточного двоичного кода являются вершины n-мерного куба с единичными ребрами. Так, например, для трехразрядного (n = 3) кода c1c2c3 используется модель, изображенная на рис. 19.7.

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

Геометрическая модель кода с проверкой на четность при n = 3 представлена на рис. 19.8, где черные точки — запрещенные комбинации, а голубые — разрешенные. Очевидно, что минимальное расстояние между разрешенными комбинациями равно двум, т. е. минимальное кодовое расстояние для этого кода dmin = 2.

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

Рис. 19.7. Геометрическая модель кода с проверкой на четность при n = 3 и кодовом расстоянием dmin = 1

Рис. 19.8. Геометрическая модель кода с проверкой на четность при n = 3 и кодовом расстоянием dmin = 2

Коды, в которых непересекающиеся сферические области декодирования охватывают все векторное пространство размерности n, называются совершенными, или плотноупакованными. При использовании совершенных кодов всегда возможна коррекция ошибок [7.6].

Соотношения между параметрами совершенных двоичных (n, k)-кодов, способных исправлять t ошибок, можно определить следующим образом: область декодирования совершенного (n, k)-кода с dmin = 2t+ 1 образуют 2k непересекающихся сфер радиуса t в n-мерном векторном пространстве; поскольку пространство совершенных кодов является плотноупакованным, следовательно, каждая сфера содержит единственную разрешенную n-мерную кодовую комбинацию и M остальных n-мерных векторов, находящихся на расстоянии l от разрешенного

кодового слова, причем 0 < l < t.

 

 

 

 

 

 

 

Таким образом, каждой сфере принадлежит

 

 

l=1

l

= 1 +

2 + . . . + t

t

 

 

 

 

 

 

 

 

 

 

n

n

 

 

 

n

n

 

 

 

 

 

 

n-мерных векторов, где

 

l

 

=

l!(n − l)! .

 

 

 

 

 

 

 

 

n

 

 

 

n!

 

 

 

Так как общий объем непересекающихся сфер плотноупакованного пространства не может превышать объем n-мерного векторного пространства, то для двоичных кодов становится справедливым выражение:

t

 

n

 

 

 

t

 

n

.

 

2n 2k l=1

или

2n−k

l=1

(19.13)

l

l

 

 

 

 

 

 

 

 

 

Равенство имеет место только для совершенных двоичных кодов. Выражение (19.13) называется границей Хэмминга. Эта граница является нижней оценкой необходимого числа проверочных символов двоичного кода длины n, способного исправлять t ошибок.

Таким образом, в каждой сфере плотноупакованного пространства кодов помимо разрешенной комбинации содержится M = 2n−k −1 = 2m −1 векторов. Для (n, k)-кода величина mn−k соответствует разрядности синдрома s и величину M

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

можно трактовать как количество различных отличных от нуля значений синдрома.

Вероятность ошибки декодирования

Как следует из рис. 19.6, ошибка при передаче кода не обнаруживается, если посланное кодовое слово в канале переходит в другую разрешенную кодовую комбинацию. Из свойства замкнутости векторного пространства Vk относительно операции сложения (сумма любой пары векторов является вектором этого пространства) и в соответствии с соотношением (19.10) следует, что в этом случае сам вектор ошибки r должен являться кодовым словом из векторного пространства Vk. Следовательно, вероятность необнаружимой ошибки будет определяться суммой вероятностей независимых событий r = vi, 1 i 2k.

Вероятность события, при котором вектор ошибки совпадет с конкретным n- мерным двоичным кодом v, можно определить как pi · (1 − p)n−i, где i — число единиц в коде, p — вероятность одиночной ошибки (рис. 19.5). Таким образом, вероятность необнаружимой ошибки для ДКС без памяти будет равна:

n

pr =

Aipi(1 − p)n−i,

(19.14)

 

i=dmin

 

где Ai — количество кодовых комбинаций (n, k)-кода v веса i (c количеством i ненулевых элементов). Не зная распределения весов Ai, вероятность необнаружимой ошибки можно оценить сверху как [7.6]:

n

pr = pdmin

Aipi−dmin (1 − p)n−i < (2k − 1)pdmin ,

(19.15)

 

i=dmin

 

где pi−dmin (1 − p)n−i < 1,

n

 

! Ai = 2k.

 

i=dmin

Для оценки эффективности помехоустойчивого кодирования используются разные критерии. Наибольшее распространение получил энергетический критерий, состоящий в расчете отношения сигнал/шум SNR (Signal-to-Noise Ratio) на бит передаваемой информации, обеспечивающего заданную вероятность битовой ошибки BER (Bit Error Rate) p при передаче без кодирования и отношения сигнал/шум на кодовый символ для передачи с кодированием при условии BER=p. После этого находится SNR на бит полезной информации с учетом скорости кода. Разность энергетических затрат на бит передаваемой информации при передаче без кодирования и с кодированием называется энергетическим выигрышем кода (ЭВК). Использование кодов с большой избыточностью позволяет достичь ЭВК до 6 дБ и выше при p = 10−5 [7.6].

19.2.3. Практические примеры блочных кодов

Систематические коды

Систематические коды являются одними из наиболее распространенных линейных блочных кодов. Это разделимые коды, в которых проверочные символы определяются путем линейного преобразования информационных символов. Обозначим информационные символы ci, i = 1, k, а проверочные bj , j = 1, m. Тогда

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

любую кодовую комбинацию (n, k)-кода можно представить в систематической форме:

 

 

 

 

 

n=k+m

 

 

 

 

A

 

 

 

 

 

 

BC

 

 

 

 

 

 

D

1

2

 

 

k

1

2

 

 

c

c

...c

 

 

b

b

...bm,

C

 

 

DA

 

B

 

C

 

 

DA

 

 

B

km

где ci {0, 1}, bj {0, 1} могут принимать значения «0» и «1».

Процесс кодирования состоит в формировании проверочных символов из информационных по следующему правилу:

 

k

 

 

i

 

 

(19.16)

bj =

gij Ci, j = 1, m,

 

=1

 

 

 

где gij {0, 1} — элементы порождающей матрицы (19.5);

— знак суммиро-

вания по модулю 2.

 

 

 

!

Пример. Рассматривается код (7, 4), n = 7, k = 4, mn − k = 3. Для одного из вариантов этого кода коэффициенты gij имеют значения, указанные в табл. 19.2.

Таблица 19.2. Варианты кодов коэффициентов gij

j

 

 

gij

 

 

i = 1

i = 2

 

i = 3

i = 4

 

 

 

 

 

 

1

0

1

 

1

1

 

 

 

 

 

 

2

1

0

 

1

1

3

1

1

 

0

0

 

 

 

 

 

 

С учетом этого правило (19.16) приобретает вид:

 

b1 = c2 c3 c4;

 

b2 = c1 c3 c4;

(19.17)

b3 = c1 c2 c4.

 

И в связи с этим конкретная кодовая комбинация, например, C=(1101), будет дополнена проверочными символами:

1 1 0 1 → 1 1 0 1 0 0 1 ,

c1 c2 c3 c4 c1 c2 c3 c4 b1 b2 b3

поскольку b1 = 1 0 1 = 0; b2 = 1 0 1 = 0; b3 = 1 1 1 = 1. Декодирование линейных систематических кодов может осуществляться раз-

личными способами. Один из них — метод контрольных чисел. Он состоит в том, что из принятых информационных символов c1c2...ck образуется новая группа

!k

проверочных символов bj = gij ci, j = 1, m, которая сравнивается с приня-

i=1

тыми проверочными символами bj nутем суммирования по модулю 2:

b1b2...bm b1 b2 ...bm

X = x1x2...xm,

где b1b2...bm — принятые проверочные символы; b1 b2 . . . bm — символы, вновь сформированные по принятым cj , j = 1, m; X — контрольное число, или синдром.

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

Спомощью синдрома можно обнаружить или обнаружить и исправить ошибки. Если ошибок нет, то bj = bj и контрольное число X = 0.

При наличии ошибочного символа ci (или bj ) синдром X = 0. Для исправления ошибок знание того, что X = 0, недостаточно. Чтобы исправить ошибку, нужно указать номер разряда, в котором произошла ошибка. Эта задача решается по виду синдрома.

Для этого каждой подлежащей исправлению ошибке присваивается соответствующее значение синдрома, что позволяет по полученному синдрому определить положение ошибочно принятых символов. Так как синдром представляет собой комбинацию с числом разрядов, равным m, то общее количество различных отличных от нуля значений синдрома равно M = 2m − 1.

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

Предположим, код предназначен для исправления всех однократных (t = 1) ошибок. Число таких ошибок равно числу сочетаний ni = n. Тогда, в соответствии с (19.13), необходимо выполнить условие

M = 2m − 1 n.

Это условие позволяет определить при заданном числе информационных символов k необходимое число проверочных символов m.

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

каждая строка матрицы G должна быть удалена от нулевой комбинации на расстояние, большее dmin, т. к. число единиц в каждой строке должно быть как минимум dmin;

любые две строки матрицы G должны быть удалены друг от друга на кодовое расстояние, большее dmin.

Коды Хемминга

Одним из самых простых линейных блочных (n, k)-кодов являются коды Хэмминга [7.1]. Для каждого натурального m>3 существует двоичный код Хэмминга со следующими параметрами:

длина кода n = 2m − 1;

число информационных разрядов k = 2m − 1 − m;

число проверочных разрядов mn − k.

Коды Хэмминга являются совершенными и обладают кодовым расстоянием dmin = 3, поэтому способны исправлять только одну или обнаружить две ошибки.

Для задания кодов Хэмминга обычно используется проверочная матрица H, содержащая m строк и 2m − 1 столбцов, причем столбцами являются все возможные ненулевые двоичные векторы длины m. Конструкция кодов Хэмминга определяется следующими свойствами проверочной матрицы вида (19.7):

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

так как минимальное расстояние кода Хэмминга dmin = 3, все столбцы проверочной матрицы должны быть попарно различными, т. е. проверочная матрица не должна содержать одинаковых столбцов;

из dmin = 3 следует, что каждая строка порождающей матрицы должна содержать как минимум три единицы, так как строки порождающей матрицы, в свою очередь, являются кодовыми словами; если порождающая матрица представлена в виде (19.6), то это значит, что строки матрицы Р должны содержать как минимум две единицы.

Рассмотрим построение девятиразрядного кода Хэмминга (9, 5), каждая комбинация которого содержит пять информационных и четыре проверочных символа. Этот код удовлетворяет неравенству (19.13): 24 − 1 = 15 k + m = 9. Проверочную матрицу (9, 5) кода Хэмминга можно представить в виде (19.7):

H =

0

1

1

0

1

0

1

0

0

.

(19.18)

 

0

0

0

1

1

1

0

0

0

 

 

1

1

0

1

0

0

0

0

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

0

1

0

0

0

0

1

0

 

 

 

 

 

Соответственно, порождающая матрица такого кода получается путем объединения единичной матрицы Ik и подматрицы, включающей k первых строк транс-

понированной матрицы H:

 

 

 

 

 

 

 

 

1

 

 

0

1

0

0

0

0

1

0

 

 

 

1

0

0

0

0

0

0

1

1

.

 

G =

0

0

0

1

0

1

0

0

1

(19.19)

 

 

 

0

0

0

1

1

1

0

 

 

 

 

0

0

 

 

 

0

0

1

0

0

0

1

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В соответствии с этим четыре контрольных символа образуются по общему правилу (19.16):

bj = gj1c1 gj2c2 gj3c3 gj4c4 gj5c5.

Декодирование осуществляется путем вычисления четырех проверок на четность по методу контрольных чисел (см. п. 19.2.3):

x1 = b1

x2 = b2

x3 = b3

x4 = b4

!5

b1 = b1

i=1

!5

b2 = b2

i=1

!5

b3 = b3

i=1

!5

b4 = b4

i=1

g1ici,

g2ici,

g3ici,

g4ici.

Поскольку m = 4, то имеется всего 16 комбинаций Xx1x2x3x4. Нулевая комбинация X соответствует случаю правильного приема, а остальные пятнадцать характеризуют факт появления ошибки и должны использоваться для определения ее местоположения.

Кроме описанных кодов Хэмминга существуют укороченные и расширенные коды Хэмминга. Укороченные коды Хэмминга получаются при исключении какойлибо проверки (т. е. удалении одной строки проверочной матрицы). Расширен-

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

ные коды Хэмминга формируются путем введения дополнительной проверки на четность всех символов кодового слова. В результате их минимальное расстояние увеличивается до dmin = 4, что позволяет данным кодам исправлять одну и обнаруживать две или только обнаруживать три ошибки.

На рис. 19.9 представлены экспериментальные зависимости вероятности битовой ошибки Pb от отношения сигнал/шум на бит Eb/N0 для кодов Хэмминга с m = 3, . . . , 7 [7.10] при работе в ДСК, декодируемых с помощью декодера максимального правдоподобия, вырабатывающего жесткие решения. Под декодером максимального правдоподобия подразумевается декодер, осуществляющий выбор из всех возможных разрешенных кодовых слов то, которое находится на минимальном расстоянии от принятого из канала связи вектора.

Рис. 19.9. Характеристики кодов Хэмминга для различных значений m

Как следует из этого рисунка, коды Хэмминга обладают слабой корректирующей способностью и в непосредственном виде практически не используются. Однако применение данных кодов в составе каскадных схем кодирования (например, Turbo Product Codes) позволяет получить очень хорошие результаты. Более подробное описание кодов Хэмминга представлено в [7.1].

19.3.1. Понятие циклического кода

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

19.3. Циклические коды

дирования и декодирования циклические коды получили относительно широкое распространение.

При описании таких кодов ограничимся только двоичными циклическими кодами, все операции с компонентами двоичных циклических кодов производятся по правилам арифметики по модулю 2. Двоичные циклические коды образуют линейные векторные пространства над полем Галуа GF(2). На практике широко используются циклические коды с компонентами из расширенных полей Галуа GF(2m). Такими кодами являются коды Бозе–Чоудури–Хоквингема (БЧХ) и коды Рида–Соломона (РС).

Линейный (n, k)-код v V является циклическим, если циклический сдвиг любого кодового слова из V также принадлежит коду, т. е. циклический сдвиг разрешенной кодовой комбинации приводит к другой разрешенной кодовой комбинации. Пусть имеется n-мерная кодовая комбинация циклического кода c = = (c0, c1, . . . , cn−1) с компонентами ci {0, 1}. Циклический сдвиг реализуется с помощью регистра сдвига длины n с обратной связью (рис. 19.10) и соответствует сдвигу всех компонент вектора c на один разряд вправо, причем крайний правый символ займет положение крайнего левого:

c(1) = (cn−1, c0, c1, . . . , cn−2).

При i-кратном циклическом сдвиге получается

c(i) = (cn−i, . . . , cn−1, c0, c1, . . . , cn−i−1).

Рис. 19.10. Регистр сдвига с обратной связью

При описании циклических кодов n-разрядные кодовые комбинации можно представить в виде многочленов (полиномов) степени (n − 1) фиктивной переменной x

v(x) = cn−1xn−1 + cn−2xn−2 + . . . + c0x0.

(19.20)

Например, семиразрядной кодовой комбинации c6c5c4c3c2c1c0 = 1001101 соответствует полином

v(x) = 1 · x6 + 0 · x5 + 0 · x4 + 1 · x3 + 1 · x2 + 0 · x1 + 1 · x0 = x6 + x3 + x2 + 1.

Степени переменной x при полиномиальной форме записи используются только для обозначения места соответствующей компоненты кодового вектора в регистре сдвига и никакой иной смысловой нагрузки не несут.

Над полиномами, описывающими двоичные кодовые комбинации, можно выполнять все алгебраические операции, причем коэффициенты при одинаковых