Перемежение

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

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

Блок 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®. Чтобы создать модель, соберите и сконфигурируйте эти блоки:

  • Bernoulli Binary Generator, в подбиблиотеке Random Data Sources библиотеки Comm Sources

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

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

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

  • Buffer, в подбиблиотеке Buffers библиотеки Signal Management в DSP System Toolbox™

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

  • Random Interleaver, в подбиблиотеке Block библиотеки Interleaving в Communications Toolbox™

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

  • Logical Operator, в библиотеке Simulink Math Operations

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

  • Signal From Workspace, в библиотеке Sources продукта DSP System Toolbox

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

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

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

  • Random Deinterleaver, в подбиблиотеке Block библиотеки Interleaving в Communications Toolbox

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

  • Buffer, в подбиблиотеке Buffers библиотеки Signal Management в DSP System Toolbox

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

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

  • Error Rate Calculation, в библиотеке Comm Sinks

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

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

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

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

На вкладке Simulation, в разделе Simulate, устанавливает Stop time на length(errors). Раздел Simulate появляется на нескольких вкладках.

Создание Вектора Ошибок.  Прежде, чем запустить модель, используйте следующий код, чтобы создать бинарный вектор в рабочем пространстве 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). K-ой сдвиговый регистр содержит 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, в котором значение задержки для k-ого сдвигового регистра является (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. Чтобы создать модель, соберите и сконфигурируйте эти блоки:

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

  • Zero-Order Hold, в библиотеке Simulink Discrete. Используйте параметры по умолчанию.

  • Convolutional Interleaver

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

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

  • Convolutional Deinterleaver

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

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

  • Две копии To Workspace, в библиотеке Simulink Sinks

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

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

Соедините блоки как показано в предыдущей фигуре. На вкладке Simulation, в разделе Simulate, устанавливает Stop time на 20. Раздел Simulate появляется на нескольких вкладках. Запустите симуляцию и выполните следующую команду:

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.

Для просмотра документации необходимо авторизоваться на сайте