Чередование

Чередование блоков

Функции чередования блоков

Блок interleaver принимает набор символов и перестраивает их, не повторяясь или не используя любой из символов в наборе. Количество символов в каждом наборе фиксируется для данного interleaver. Операция interleaver на наборе символов независима от своей операции на всех других наборах символов.

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

Каждая функция interleaver имеет соответствующую функцию deinterleaver. В типичном использовании interleaver/deinterleaver пар входные параметры deinterleaver совпадают с теми из interleaver, за исключением перестраиваемых данных.

Блок interleaver принимает набор символов и перестраивает их, не повторяясь или не используя любой из символов в наборе. Количество символов в каждом наборе фиксируется для данного interleaver.

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

Тип InterleaverФункция InterleaverОписание
Общий блок interleaverintrlvИспользует таблицу перестановки, данную явным образом как входной параметр.
Алгебраический interleaveralgintrlvВыводит таблицу перестановки алгебраически, с помощью Такесита-Костелло или валлийского-Costas метода. Эти методы описаны в [4].
Спиральная развертка interleaverhelscanintrlvЗаполняет матрицу со строкой данных строкой и затем отправляет матричное содержимое в вывод спиральным способом.
Матрица interleavermatintrlvЗаполняет матрицу со строкой элементов данных строкой и затем отправляет матричное содержимое в выходной столбец столбцом.
Случайный interleaverrandintrlvВыбирает таблицу перестановки случайным образом с помощью входа начального состояния, который вы обеспечиваете.

Типы Блока Interleavers.  Набор блока interleavers в этой библиотеке включает общую interleaver/deinterleaver пару, а также несколько особых случаев. Каждый блок особого случая использует тот же вычислительный код, который его более общий дубликат использует, но обеспечивает интерфейс, который более подходит для особого случая.

Блок Matrix Interleaver выполняет чередование блоков путем заполнения матрицы со строкой вводимых символов строкой и затем отправки матричного содержимого в столбец выходного порта столбцом. Например, если interleaver использует 2 3 матрица, чтобы сделать ее внутренние вычисления, то для входа      [1 2 3 4 5 6], блок производит вывод      [1 4 2 5 3 6].

Блок Random Interleaver выбирает таблицу перестановки случайным образом с помощью параметра Initial seed, который вы обеспечиваете в маске блока. При помощи того же значения Initial seed в соответствующем блоке Random Deinterleaver можно восстановить переставленные символы к их исходному упорядоченному расположению.

Блок Algebraic Interleaver использует таблицу перестановки, которая алгебраически выведена. Это поддерживает Такесита-Костелло interleavers и валлийский-Costas interleavers. Эти interleavers описаны в [4].

Улучшите коэффициент ошибок Используя чередование блоков в MATLAB

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

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

st1 = 27221; st2 = 4831; % States for random number generator
n = 7; k = 4; % Parameters for Hamming code
msg = randi([0 1],k*500,1); % Data to encode
code = encode(msg,n,k,'hamming/binary'); % Encoded data
% Create a burst error that will corrupt two adjacent codewords.
errors = zeros(size(code)); errors(n-2:n+3) = [1 1 1 1 1 1];

% With Interleaving
%------------------
inter = randintrlv(code,st2); % Interleave.
inter_err = bitxor(inter,errors); % Include burst error.
deinter = randdeintrlv(inter_err,st2); % Deinterleave.
decoded = decode(deinter,n,k,'hamming/binary'); % Decode.
disp('Number of errors and error rate, with interleaving:');
[number_with,rate_with] = biterr(msg,decoded) % Error statistics

% Without Interleaving
%---------------------
code_err = bitxor(code,errors); % Include burst error.
decoded = decode(code_err,n,k,'hamming/binary'); % Decode.
disp('Number of errors and error rate, without interleaving:');
[number_without,rate_without] = biterr(msg,decoded) % Error statistics

Вывод от примера следует.

Number of errors and error rate, with interleaving:

number_with =

     0


rate_with =

     0

Number of errors and error rate, without interleaving:

number_without =

     4


rate_without =

    0.0020

Улучшите коэффициент ошибок Используя чередование блоков в Simulink

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

Прежде, чем запустить модель, необходимо создать бинарный вектор, который моделирует пакеты ошибок, как описано в Улучшают Коэффициент ошибок Используя Чередование блоков в Simulink. Блок Signal From Workspace импортирует этот вектор из рабочего пространства MATLAB в модель, где блок Logical Operator выполняет XOR вектора с сигналом.

Чтобы открыть завершенную модель, введите doc_interleaver в командной строке MATLAB®. Чтобы создать модель, соберите и сконфигурируйте эти блоки:

  • Бернуллиевый Бинарный Генератор, в подбиблиотеке Random Data Sources библиотеки Comm Sources

    • Установите флажок рядом с Frame-based outputs.

    • Установите Samples per frame на 4.

  • Энкодер Хэмминга, в подбиблиотеке Block библиотеки Error Detection и Correction. Используйте параметры по умолчанию

  • Буфер, в подбиблиотеке Buffers библиотеки Signal Management в DSP System Toolbox™

    • Установите Output buffer size (per channel) на 84.

  • Случайный Interleaver, в подбиблиотеке Block библиотеки Interleaving в Communications Toolbox™

    • Установите Number of elements на 84.

  • Логический оператор, в библиотеке Simulink Math Operations

    • Установите Operator на XOR.

  • Сигнал Из Рабочей области, в библиотеке Sources продукта DSP System Toolbox

    • Установите Signal на errors.

    • Установите Sample time на 4/7.

    • Установите Samples per frame на 84.

  • Случайный Deinterleaver, в подбиблиотеке Block библиотеки Interleaving в Communications Toolbox

    • Установите Number of elements на 84.

  • Буфер, в подбиблиотеке Buffers библиотеки Signal Management в DSP System Toolbox

    • Установите Output buffer size (per channel) на 7.

  • Декодер Хэмминга, в подбиблиотеке Block библиотеки Error Detection и Correction. Используйте параметры по умолчанию.

  • Вычисление Коэффициента ошибок, в библиотеке Comm Sinks

    • Установите Receive delay на (4/7)*84.

    • Установите Computation delay на 100.

    • Установите Output data на Port.

  • Отобразитесь в библиотеке Simulink Sinks. Используйте параметры по умолчанию.

Кликните по меню Simulation и выберите Model Configuration parameters. Установите Stop time на length(errors).

Создание Вектора Ошибок.  Прежде, чем запустить модель, используйте следующий код, чтобы создать бинарный вектор в рабочем пространстве MATLAB. Модель использует этот вектор, чтобы моделировать пакеты ошибок. Вектор содержит блоки три 1 с, представляя пакеты ошибок, наугад интервалы. Расстояние между двумя последовательными блоками 1 с является случайным целым числом между 1 и 80.

errors=zeros(1,10^4);
n=1;
while n<10^4-80;
n=n+floor(79*rand(1))+3;
errors(n:n+2)=[1 1 1];
end

Чтобы определить отношение номера 1 с к общему количеству символов в векторном errors входят

sum(errors)/length(errors)

Ваш ответ должен быть приблизительно 3/43, или.0698, поскольку после каждой последовательности три 1 с, ожидаемое расстояние до следующей последовательности 1 с равняется 40. Следовательно, вы ожидаете видеть три 1 с в 43 терминах последовательности. Если бы не было никакого исправления ошибок в модели, частота ошибок по битам была бы приблизительно.0698.

Когда вы запускаете симуляцию с моделью, коэффициент ошибок - приблизительно.019, который показывает улучшение из-за исправления ошибок и чередования. Вы видите эффект чередования путем удаления Случайного Interleaver и Случайных блоков Deinterleaver от модели, соединения строк и выполнения другой симуляции. Частота ошибок по битам выше, не чередуясь, потому что Код Хемминга может только исправить одну ошибку в каждой кодовой комбинации.

Сверточное чередование

Сверточные функции чередования

Сверточный interleaver состоит из набора сдвиговых регистров, каждого с фиксированной задержкой. В типичном сверточном interleaver задержки являются неотрицательными целочисленными множителями фиксированного целого числа (несмотря на то, что мультиплексированный interleaver генерала позволяет неограниченные значения задержки). Каждый новый символ от входного вектора питается в следующий сдвиговый регистр, и самый старый символ в том регистре становится частью выходного вектора. Сверточный interleaver имеет память; то есть, его операция зависит не только от текущих символов, но также и от предыдущих символов.

Схематическое ниже изображает структуру общего сверточного interleaver путем показа набора сдвиговых регистров и их значений задержки D (1), D (2)..., D (N). kth сдвиговый регистр содержит D (k) символы, где k = 1,2..., N. Сверточные функции чередования в этом тулбоксе имеют входные параметры, которые указывают на количество сдвиговых регистров и задержки каждого сдвигового регистра.

Communications Toolbox реализует сверточную функциональность чередования с помощью блоков Simulink®, Системных объектов и функций MATLAB.

Набор сверточного interleavers в этом продукте включает общую interleaver/deinterleaver пару, а также несколько особых случаев. Каждая функция особого случая использует тот же вычислительный код, который его более общий дубликат использует, но обеспечивает синтаксис, который более подходит для особого случая. Особые случаи описаны ниже.

Тип InterleaverЧередование функцииОписание
Общий мультиплексировал interleavermuxintrlvПозволяет неограниченные значения задержки для набора сдвиговых регистров.
Сверточный interleaverconvintrlvЗначения задержки для набора сдвиговых регистров являются неотрицательными целочисленными множителями фиксированного целого числа, которое вы задаете.
Спиральный interleaverhelintrlvЗаполняет массив с вводимыми символами спиральным способом и освобождает строку массивов строкой.

Функция helscanintrlv и функция helintrlv оба используют спиральный массив для внутренних вычислений. Однако две функции имеют некоторые важные различия:

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

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

Типы Сверточного Interleavers.  Набор сверточного interleavers в этой библиотеке включает общую interleaver/deinterleaver пару, а также несколько особых случаев. Каждый блок особого случая использует тот же вычислительный код, который его более общий дубликат использует, но обеспечивает интерфейс, который более подходит для особого случая.

Самый общий блок в этой библиотеке является блоком General Multiplexed Interleaver, который позволяет произвольные значения задержки для набора сдвиговых регистров. Чтобы реализовать предыдущее схематическое использование этого блока, используйте параметр Interleaver delay [D (1); D (2); ...; DN .

Более конкретный блок Convolutional Interleaver, в котором значение задержки для kth сдвигового регистра является (k-1) временами параметр Register length step блока. Количество сдвиговых регистров в этом блоке является значением параметра Rows of shift registers.

Наконец, блок Helical Interleaver поддерживает особый случай сверточного чередования, которое заполняет массив с символами спиральным способом и освобождает строку массивов строкой. Чтобы сконфигурировать этот interleaver, используйте параметр Number of columns of helical array, чтобы установить ширину массива и использовать Group size и параметры Helical array step size, чтобы определить, как символы помещаются в массив. Смотрите страницу с описанием для блока Helical Interleaver для получения дополнительной информации и примера.

Задержки сверточного Interleavers

После того, как последовательность символов проходит через сверточный interleaver и соответствующий сверточный deinterleaver, восстановленная последовательность отстает от исходной последовательности. Задержка, измеренная в символах, между исходными и восстановленными последовательностями, обозначается в приведенной ниже таблице. Имена переменных во втором столбце (delay, nrows, slope, col, ngrp и stp) относятся к входным параметрам, названным на странице с описанием каждой функции.

Задержки Пар Interleaver/Deinterleaver

Пара Interleaver/DeinterleaverЗадержитесь между исходными и восстановленными последовательностями
muxintrlv, muxdeintrlvlength(delay)*max(delay)
convintrlv, convdeintrlvnrows*(nrows-1)*slope
helintrlv, heldeintrlvcol*ngrp*ceil(stp*(col-1)/ngrp)

Задержки Сверточного Interleavers.  После того, как последовательность символов проходит через сверточный interleaver и соответствующий сверточный deinterleaver, восстановленная последовательность отстает от исходной последовательности. Задержка, измеренная в символах, между исходными и восстановленными последовательностями,

Количество сдвиговых регистров × Максимальная задержка среди всех сдвиговых регистров

поскольку самое общее мультиплексировало interleaver. Если ваша модель подвергается дополнительной задержке между interleaver вывод и входом deinterleaver, восстановленная последовательность отстает от исходной последовательности суммой дополнительной задержки и суммы в предыдущей формуле.

Примечание

Для соответствующей синхронизации задержка вашей модели между interleaver вывела, и вход deinterleaver должен быть целочисленным кратным количество сдвиговых регистров. Можно использовать блок DSP System Toolbox Delay, чтобы настроить задержки вручную при необходимости.

Сверточный блок Interleaver

В особом случае, реализованном Сверточной парой Interleaver/Convolutional Deinterleaver, количество сдвиговых регистров является параметром Rows of shift registers, в то время как максимальная задержка среди всех сдвиговых регистров

B × (N-1)

где B является параметром Register length step, и N является параметром Rows of shift registers.

Спиральный блок Interleaver

В особом случае, реализованном Спиральной парой Interleaver/Helical Deinterleaver, задержкой между восстановленной последовательностью и исходной последовательностью,

CNs(C1)N

где C является параметром Number of columns in helical array, N является параметром Group size, и s является параметром Helical array step size.

Эффект Задержек на Восстановлении Convolutionally Чередованные Данные Используя MATLAB.  Если вы используете сверточный interleaver, сопровождаемый соответствующим сверточным deinterleaver, то ненулевая задержка означает, что восстановленные данные (то есть, вывод от deinterleaver) не являются тем же самым как исходными данными (то есть, вход к interleaver). Если вы сравниваете эти два набора данных непосредственно, то необходимо принять задержку во внимание при помощи соответствующего усечения или дополнения операций.

Вот некоторые типичные способы компенсировать задержку D в interleaver/deinterleaver паре:

  • Чередуйте версию исходных данных, которые дополнены дополнительными символами D в конце. Прежде, чем сравнить исходные данные с восстановленными данными, не используйте первые символы D восстановленных данных. В этом подходе все исходные символы появляются в восстановленных данных.

  • Прежде, чем сравнить исходные данные с восстановленными данными, не используйте последние символы D исходных данных и первые символы D восстановленных данных. В этом подходе некоторые исходные символы оставляют в сдвиговых регистрах deinterleaver и не появляются в восстановленных данных.

Следующий код иллюстрирует эти подходы путем вычисления коэффициента ошибок символа для чередующей/устраняющей чередование операции.

x = randi([0 63],20,1); % Original data
nrows = 3; slope = 2; % Interleaver parameters
D = nrows*(nrows-1)*slope; % Delay of interleaver/deinterleaver pair
hInt   = comm.ConvolutionalInterleaver('NumRegisters', nrows, ...
                    'RegisterLengthStep', slope);
hDeint = comm.ConvolutionalDeinterleaver('NumRegisters', nrows, ...
                    'RegisterLengthStep', slope);

% First approach.
x_padded = [x; zeros(D,1)]; % Pad x at the end before interleaving.
a1 = step(hInt, x_padded); % Interleave padded data.

b1 = step(hDeint, a1)
% Omit input padding and the first D symbols of the recovered data and
% compare
servec1 = step(comm.ErrorRate('ReceiveDelay',D),x_padded,b1);
ser1 = servec1(1)

% Second approach.
release(hInt); release(hDeint)
a2 = step(hInt,x); % Interleave original data.
b2 = step(hDeint,a2)
% Omit the last D symbols of the original data and the first D symbols of
% the recovered data and compare.
servec2 = step(comm.ErrorRate('ReceiveDelay',D),x,b2);
ser2 = servec2(1)

Вывод показывают ниже. Нулевые значения ser1 и ser2 указывают, что скрипт правильно выровнял исходные и восстановленные данные прежде, чем вычислить коэффициенты ошибок символа. Однако заметьте от длин b1 и b2, что два подхода к выравниванию приводят к различным суммам устраненных чередование данных.

b1 =

     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
    59
    42
     1
    28
    52
    54
    43
     8
    56
     5
    35
    37
    48
    17
    28
    62
    10
    31
    61
    39


ser1 =

     0


b2 =

     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
    59
    42
     1
    28
    52
    54
    43
     8


ser2 =

     0

Объединение Чередующихся Задержек и Других Задержек.  Если вы используете сверточный interleavers в скрипте, который подвергается дополнительной задержке, d, между interleaver вывод и входом deinterleaver (например, задержка от фильтра), то восстановленная последовательность отстает от исходной последовательности суммой d и суммы из таблицы Delays of Interleaver/Deinterleaver Pairs. В этом случае d должен быть целочисленным кратным количество сдвиговых регистров, или иначе сверточный deinterleaver не может восстановить исходные символы правильно. Если d не является естественно целочисленным кратным количество сдвиговых регистров, то можно настроить задержку вручную путем дополнения вектора, который формирует вход к deinterleaver.

Сверточное чередование и устранение чередования Используя последовательность последовательных Целых чисел в MATLAB

Пример ниже иллюстрирует сверточное чередование и устранение чередования использования последовательности последовательных целых чисел. Это также иллюстрирует свойственную задержку interleaver/deinterleaver пары.

x = [1:10]'; % Original data
delay = [0; 1; 2]; % Set delays of three shift registers.
hInt = comm.MultiplexedInterleaver('Delay', delay);
hDeint = comm.MultiplexedDeinterleaver('Delay', delay);
y = step(hInt,x) % Interleave.
z = step(hDeint,y) % Deinterleave.

В этом примере функция muxintrlv инициализирует эти три сдвиговых регистра к значениям [], [0] и [0 0], соответственно. Затем функциональные процессы входные данные [1:10]', выполняя внутренние вычисления, как обозначено в приведенной ниже таблице.

Текущий входТекущий сдвиговый регистрТекущая производительностьСодержимое сдвиговых регистров
111
[]
[0]
[0 0]
220
[]
[2]
[0 0]
330
[]
[2]
[0 3]
414
[]
[2]
[0 3]
522
[]
[5]
[0 3]
630
[]
[5]
[3 6]
717
[]
[5]
[3 6]
825
[]
[8]
[3 6]
933
[]
[8]
[6 9]
10110
[]
[8]
[6 9]

Вывод от примера ниже.

y =

     1
     0
     0
     4
     2
     0
     7
     5
     3
    10


state_y =

    value: {3x1 cell}
    index: 2


z =

     0
     0
     0
     0
     0
     0
     1
     2
     3
     4

Заметьте, что столбец “Текущей производительности” приведенной выше таблицы соглашается со значениями в векторном y. Кроме того, последняя строка приведенной выше таблицы указывает, что последний сдвиговый регистр, обработанный для набора определенных данных, является первым сдвиговым регистром. Это соглашается со значением 2 для state_y.index, который указывает, что любые дополнительные входные данные были бы направлены к второму сдвиговому регистру. Можно опционально проверять, что значения состояния, перечисленные в state_y.value, совпадают с “Содержимым Сдвиговых регистров” запись в последней строке таблицы путем ввода state_y.value{:} в Командном окне после выполнения примера.

Другая функция, чтобы заметить о примере, который вывод - то, что z содержит шесть нулей вначале прежде содержащий любой из символов от исходного набора данных. Эти шесть нулей иллюстрируют, что задержкой этой сверточной interleaver/deinterleaver пары является length(delay)*max(delay) = 3*2 = 6. Для получения дополнительной информации о задержках, смотрите Задержки Сверточного Interleavers.

Сверточное чередование и устранение чередования Используя последовательность последовательных Целых чисел в Simulink

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

Откройте модель путем ввода doc_convinterleaver в командной строке MATLAB. Чтобы создать модель, соберите и сконфигурируйте эти блоки:

  • Сползайте в библиотеке Simulink Sources. Используйте параметры по умолчанию.

  • Нулевой порядок Содержит в библиотеке Simulink Discrete. Используйте параметры по умолчанию.

  • Сверточный Interleaver

    • Установите Rows of shift registers на 3.

    • Установите Initial conditions на [-1 -2 -3]'.

  • Сверточный Deinterleaver

    • Установите Rows of shift registers на 3.

    • Установите Initial conditions на [-1 -2 -3]'.

  • Две копии К Рабочей области, в библиотеке Simulink Sinks

    • Установите Variable name на interleaved и restored, соответственно, в двух копиях этого блока.

    • Установите Save format на Array в каждой из двух копий этого блока.

Соедините блоки как показано в предыдущей схеме. Из меню Simulation окна модели выберите Model Configuration parameters. В диалоговом окне Configuration Parameters, набор Stop time к 20. Запустите симуляцию и выполните следующую команду:

comparison = [[0:20]', interleaved, restored]

comparison =

     0     0    -1
     1    -2    -2
     2    -3    -3
     3     3    -1
     4    -2    -2
     5    -3    -3
     6     6    -1
     7     1    -2
     8    -3    -3
     9     9    -1
    10     4    -2
    11    -3    -3
    12    12     0
    13     7     1
    14     2     2
    15    15     3
    16    10     4
    17     5     5
    18    18     6
    19    13     7
    20     8     8

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

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

Для подобного примера, который также указывает на содержимое сдвиговых регистров на каждом шаге процесса, смотрите Сверточное Чередование и Устранение чередования Используя Последовательность Последовательных Целых чисел в MATLAB.

Выбранная библиография для чередования

[1] Berlekamp, E.R., и П. Тонг, “Улучшенный Interleavers для алгебраических блочных кодов”, США патентуют 4559625 17 декабря 1985.

[2] Кларк, Джордж К. Младший, и J. Затвор Каин, кодирование с коррекцией ошибок для цифровой связи, Нью-Йорка, нажатия пленума, 1981.

[3] Форни, G. D. Младший, “Исправляющие пакет Коды для Классического Пульсирующего Канала”, Транзакции IEEE на Коммуникациях, издании COM-19, октябрь 1971, стр 772-781.

[4] Heegard, Крис и Стивен Б. Викер, турбокодирование, Бостон, Kluwer академические издатели, 1999.

[5] Рэмси, J. L, “Реализация Оптимального Interleavers”, Транзакции IEEE на Теории информации, IT-16 (3), май 1970, стр 338-345.

[6] Takeshita, O. Y. и Д. Дж. Костелло младший, “Новые Классы Алгебраического Interleavers для Турбокодов”, Proc. 1 998 IEEE Международный Симпозиум по Теории информации, Бостону, 16-21 августа 1998. стр 419.