Скремблирование

advertisement
Практическая работа № 3
Скремблирование
Краткая справка. Существует код с двумя уровнями сигнала. При
передаче нуля он передаёт потенциал, который был установлен на
предыдущем такте (то есть не меняет его), а при передаче единицы
потенциал инвертируется на противоположный. Этот код называется
потенциальным кодом с инверсией при единице (Non Return to Zero with
ones Inverted, NRZI). Он удобен в тех случаях, когда наличие третьего
уровня сигнала весьма нежелательно, например в оптических кабелях, где
устойчиво распознаются только два состояния сигнала - свет и темнота.
Код NRZI не обладает свойством самосинхронизации. Даже при наличии
высокоточного тактового генератора приёмник может ошибиться с
выбором момента съёма данных, так как частоты двух генераторов никогда
не бывают полностью идентичными. Поэтому при высоких скоростях
обмена данными и длинных последовательностях единиц или нулей
небольшое рассогласование тактовых частот может привести к ошибке в
целый такт и, соответственно, считыванию некорректного значения бита.
Для улучшения кода NRZI и других потенциальных кодов
используется метод, основанный на предварительном «перемешивании»
исходной информации таким образом, чтобы вероятность появления единиц
и нулей на линии становилась близкой. Устройства, или блоки,
выполняющие такую операцию, называются скремблерами. При
скремблировании используется известный алгоритм, поэтому приёмник,
получив двоичные данные, передаёт их на дескремблер, который
восстанавливает исходную последовательность битов. Скремблирование
– это побитное вычисление результирующего кода на основании битов
исходного кода и полученных в предыдущих тактах битов результирующего
кода. Например, скремблер может реализовывать следующее соотношение:
Bi = Ai Bi-3 Bi-5.
(1)
Здесь Bi – двоичная цифра результирующего кода, полученная на i-м такте
работы скремблера, Ai – двоичная цифра исходного кода, поступающая на i-м
такте на вход скремблера, Bi-3 и Bi-5 - двоичные цифры результирующего
кода, полученные на предыдущих тактах работы скремблера (соответственно
на 3 и на 5 тактов ранее текущего такта) и объединенные операцией
исключающего ИЛИ (сложение по модулю 2).
После получения результирующей последовательности приёмник
передает
её
дескремблеру,
который
восстанавливает
исходную
последовательность на основании обратного соотношения:
Сi = Вi Bi-3 Bi-5 = (Ai Bi-3 Bi-5) Bi-3 Bi-5 = Ai.
(2)
Различные алгоритмы скремблирования отличаются количеством
слагаемых, дающих цифру результирующего кода, и сдвигом между
слагаемыми. Так, в сетях ISDN при передаче данных от сети к абоненту
используется преобразование со сдвигами на 5 и 23 позиции, а при передаче
данных от абонента в сеть - со сдвигами на 18 и 23 позиции.
Задание на практическую работу
Разработать скремблер (формула (1)) и дескремблер (формула (2)).
Провести и записать в тетрадь анализ результатов скремблирования для
кодов 00000000, 11111111, 00000001, 10000000, 0000000011111111,
1111111100000000, 1000000000000001.
Переменные блока скремблирования
ik$
dk
a(i), b(i), c(i)
i
исходный двоичный код
длина ik$
i-е биты (i = 1, 2, ..., dk) исходного кода, кода после
скремблирования и кода после дескремблирования
соответственно
счётчик циклов
Алгоритм программы
Ввод ik$
Расчёт dk
Размер массивов a(i), b(i), c(i)
Цикл i от 1 до dk: расчёт a(i) по i-му биту ik$. Конец цикла
Цикл i от 1 до 3: расчёт b(i) по i-му биту ik$. Конец цикла
b(4) = СЛОЖЕНИЕ ПО МОДУЛЮ 2 a(4)b(1)
b(5) = СЛОЖЕНИЕ ПО МОДУЛЮ 2 a(5)b(2)
Цикл i от 6 до dk: b(i) = СЛОЖЕНИЕ ПО МОДУЛЮ 2 a(i)b(i -3) b(i -5).
Конец цикла
9. Цикл i от 1 до dk: перевод b(i) в символ и вывод его на экран. Конец
цикла
10.c(1) = b(1)
11.c(2) = b(2)
12.c(3) = b(3)
13.c(4) = СЛОЖЕНИЕ ПО МОДУЛЮ 2 b(4)b(1)
14.c(5) = СЛОЖЕНИЕ ПО МОДУЛЮ 2 b(5)b(2)
15.Цикл i от 1 до dk: перевод b(i) в символ и вывод его на экран. Конец
цикла
16.Конец
1.
2.
3.
4.
5.
6.
7.
8.
Программа на языке QBasic
' Скремблирование
1 INPUT "Введи исходный код > 5 символов"; ik$
PRINT : COLOR 14: PRINT "
Исходный код "; ik$
dk = LEN(ik$) 'длина исх. кода
DIM a(dk), b(dk), c(dk)
IF dk < 6 THEN PRINT "Длина кода < 6": GOTO 1
FOR i = 1 TO dk
a(i) = VAL(MID$(ik$, i, 1))
NEXT
FOR i = 1 TO 3
b(i) = VAL(MID$(ik$, i, 1))
NEXT
b(4) = a(4) XOR b(1)
b(5) = a(5) XOR b(2)
FOR i = 6 TO dk
b(i) = a(i) XOR b(i - 3) XOR b(i - 5)
NEXT
COLOR 13: PRINT "
После скемблера ";
FOR i = 1 TO dk: PRINT RIGHT$(STR$(b(i)), 1); : NEXT
PRINT
c(1) = b(1): c(2) = b(2): c(3) = b(3)
c(4) = b(4) XOR b(1)
c(5) = b(5) XOR b(2)
COLOR 7: PRINT "После дескремблера ";
FOR i = 6 TO dk
c(i) = b(i) XOR b(i - 3) XOR b(i - 5)
NEXT
FOR i = 1 TO dk: PRINT RIGHT$(STR$(c(i)), 1); : NEXT:
PRINT
END
Download