Понеаснни. Моделирование систем связи в matlab
Скачать 2.78 Mb.
|
Пример. Понять архитектуру схемы деления можно с помощью примера, приведенного на рисунке 2.5. В примере, как и ранее, используются такие величины: 41 сообщение D = 1010001101; D(Х) = X 9 + X 1 + Х 3 + Х 2 + 1; делитель P = 110101; Р(Х) = X 5 + X 4 + X 2 + 1. На рисунке 2.5, а представлена реализация регистра сдвига. Процесс начинается с очистки регистра (все ячейки обнуляются). После этого передаваемое сообщение (делимое) побитово вводится в регистр, начиная со старшего бита. На рисунке 2.5, б приведена таблица, которая иллюстрирует пошаговую работу схемы по мере введения отдельных битов. Строки таблицы содержат значения пяти ячеек регистра сдвига в соответствующие моменты времени. Кроме того, в строках таблицы приводятся значения на выходе трех схем исключающего ИЛИ. Последнее число в каждой строке – значение следующего входного бита, который станет доступен для работы на следующем этапе. Отметим, что операция исключающего ИЛИ влияет на значения ячеек С 4 , С 2 и С 0 при следующем сдвиге, что идентично рассмотренному ранее процессу двоичного деления. Процесс выполняется для всех битов передаваемого сообщения. Для обеспечения корректности выходного сигнала используются два ключа. При вводе битов данных оба ключа находятся в положении А. В результате за первых 10 шагов входные биты подаются в регистр сдвига и также используются в качестве выходных битов. По окончании обработки последнего бита данных регистр сдвига coдержит остаток деления (FCS), выделенный серым цветом. При вводе последнего бита данных в регистр оба ключа устанавливаются в положение В. В этом случае: 1) все логические элементы больше не изменяют значения битов; 2) за следующие 5 шагов на выход подаются 5 бит CRC. T 4 T 3 T 2 T 1 T 0 Ключ 1 Ключ 2 A B A B Вход k=10 бит Выход n=15 бит Рисунок 3.9 Реализация устройства формирования кода CRC-5 Рисунок 2.5 – Реализация устройства формирования кода CRC-5 42 Таблица 3.1 Пошаговая работа устройства формирования кода CRC-5 Такт ы Т 4 Т 3 Т 2 Т 1 Т 0 Т 4 Т 3 I Т 4 Т 1 I Т 4 I I (ввод данных ) 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 1 1 0 2 1 1 1 1 1 1 1 0 1 3 1 1 1 1 0 0 0 1 0 4 0 1 0 0 1 1 0 0 0 5 1 0 0 1 0 1 0 1 0 6 1 0 0 0 1 0 0 0 1 7 0 0 0 1 0 1 0 1 1 8 1 0 0 0 1 1 1 1 0 9 1 0 1 1 1 0 1 0 1 10 0 1 1 1 0 В приемнике используется аналогичная логика. Принятые биты последовательности К вводятся в регистр сдвига по мере поступления. Если ошибки отсутствуют, то после обработки К бит регистр сдвига будет содержать последовательность R. После этого начинает поступать переданная последовательность R. В результате на выход регистра будут подаваться двоичные нули и по завершении приема все ячейки будут иметь значение 0. На рисунке 2.6 представлена общая архитектура реализации регистра сдвига CRC для полинома P(X) = A i X i , где A 0 = A n-k = 1, все остальные A i равны 0 или 1. Вход (k бит) Рисунок 3.11 Общая архитектура формирования кода CRC для реализации полинома-делителя P(X) = X n-k + A n-k-1 X n-k-1 + …+ A 2 X 2 + A 1 X + 1 T n-k-1 T n-k-2 T 1 T 0 Выход (n бит) A B Ключ 1 Ключ 2 A B A n-k-1 A n-k-2 A 2 A 1 Рисунок 2.6 – Общая архитектура формирования кода CRC для реализации полинома-делителя P(X) = X n-k + A n-k-1 X n-k-1 +…+A 2 X 2 + A 1 X+1 43 2.4.2 Блочные коды с коррекцией ошибок Методы обнаружения ошибок широко применяются на практике в протоколах управления каналами передачи данных, таких, как HDLC, а также в транспортных протоколах, таких, как TCP. В то же время под использованием кодов обнаружения ошибок подразумевается повторная передача блоков данных согласно процедуре ARQ. Для беспроводных приложений такой подход неприемлем по двум причинам. 1. Уровень ошибок в беспроводном канале может быть довольно высок; в результате потребуется значительное число повторных передач. 2. В некоторых случаях, особенно в спутниковой связи, задержка распространения сигнала довольно велика по сравнению со временем передачи одного кадра. При повторной передаче, как правило, передается кадр, содержащий ошибку, а также все последующие кадры. При большом расстоянии между приемником и передатчиком ошибка в одном кадре приводит к необходимости повторной передачи множества кадров. Вместо повторной передачи было бы лучше, если бы приемник мог исправлять ошибки в полученном сигнале, используя информацию, содержащуюся в самом сигнале. На рисунке 2.7 представлена схема реализации этой идеи. С помощью кодера FEC (forward error correction – прямое исправление ошибок) передатчик преобразует каждый k-битовый блок данных в n-битовый блок (n > k),именуемый кодовым словом, который затем передается (в беспроводной связи для передачи используется созданный модулятором аналоговый сигнал). При распространении сигнал может подвергаться воздействию шума, что может привести к появлению ошибочных битов. Приемник демодулирует полученный сигнал, преобразовывая его в строку битов, подобную переданной, но, возможно, с ошибками. Полученный блок данных обрабатывается декодером FEC, в результате возможны такие ситуации: 1. При отсутствии ошибочных битов вход декодера FEC идентичен исходному кодовому слову, так что на выход декодера поступает исходный блок данных; 2. Декодер может обнаружить и исправить определенные последовательности ошибок. Поэтому даже если вход декодера отличается от исходного кодового слова, из него можно получить исходные данные; 3. Некоторые последовательности ошибок могут быть обнаружены декодером, но не могут быть исправлены. В этом случае декодер сообщает о наличии неисправимой ошибки; 4. Наличие некоторых (обычно довольно редких) последовательностей ошибок не может быть обнаружено декодером. В результате декодер преобразовывает входной n-битовый блок в k-битовую последовательность, которая отличается от переданной, но которую кодер считает правильной. 44 Д ан ны е k б ит Кодер FEC К од ов ое с л ов о n б ит К од ов ое с л ов о n б ит Д ан ны е k б ит Декодер FEC Отправитель Получатель Нет ошибок, или нет исправимых ошибок Обнаруживаемые, но неисправляемые ошибки Указание на ошибку Рисунок 4.1 Пояснение принципа прямого исправления ошибок Рисунок 2.7 – Принцип прямого исправления ошибок Каким образом декодер исправляет ошибки? По сути, исправление ошибок производится с помощью добавления избыточных данных к передаваемому сообщению. Избыточность позволяет приемнику восстановить исходное сообщение даже при наличии определенного уровня ошибок. В данном разделе будет рассмотрен широко используемый класс кодов с коррекцией ошибок, известный как блочные коды, В начале будут рассмотрены общие принципы, после чего мы перейдем к анализу конкретных кодов. Отметим, что довольно часто коды с коррекцией ошибок используются по схеме, изображенной на рисунок 2.4 для кодов обнаружения ошибок. Т.е. в алгоритме FEC квходному k-битовому блоку данных добавляется (n - k) контрольных битов, в результате размер передаваемого блока составляет n бит, все биты исходного k-битового блока содержатся в полученном n- битовом блоке. Для некоторых схем прямого исправления ошибок (например, сверточных кодов) входная k-битовая последовательность так преобразовывается в n-битовое кодовое слово, что исходные k бит не фигурируют явно в кодовом слове. Принципы блочных кодов Для начала определим термины, которыми мы будем оперировать. Расстоянием Хэмминга (Hamming distance) d(v 1 , v 2 ) между двумя n-битовыми двоичными последовательностями v 1 , и v 2 называют число несовпадающих разрядов v 1 и v 2 . Например, 45 3 ) , ( , 110001 , 011011 2 1 2 1 v v d v v Рассмотрим теперь метод блочного кодирования с целью коррекции ошибок. Пусть требуется передать определенное количество k-битовых блоков данных. Вместо передачи каждого блока как последовательности k бит, преобразуем каждую k-битовую последовательность в уникальное n- битовое кодовое слово. Важные свойства блочных кодов с коррекцией ошибок. Блочный код (n, k)преобразует k бит данных в n-битовые кодовые слова. В большинстве случаев каждое корректное кодовое слово – это исходные k бит данных плюс (n-k)контрольных битов. Таким образом, структура блочного кода эквивалентна структуре функции вида v c = f(v d ), где v d – вектор, состоящий из k бит данных; v с – вектор, состоящий из n бит кодового слова. В блочном коде (n, k)имеется 2 k приемлемых кодовых слов из 2 n возможных. Отношение числа избыточных битов к числу битов данных (n - k)/k принято называть избыточностью кода (code redundancy); отношение количества битов данных к полному числу битов (k/n)называют степенью кодирования (code rate). Степень кодирования – это мера того, какая дополнительная полоса потребуется после кодирования, если скорость передачи данных мы хотим сохранить такой же, какая была до кодирования. Например, при степени кодирования 1/2 для сохранения скорости передачи системе потребуется полоса, в два раза большая, чем та, которая необходима для передачи некодированного сигнала. Если степень кодирования равна 2/5, следовательно, для сохранения скорости передачи потребуется увеличить ширину полосы в 2,5 раза. Т.е. если скорость передачи сигнала на входе кодера равна 1 Мбит/с, то для сохранения прежних параметров скорость выходного сигнала должна быть равна 2,5 Мбит/с. Для кода, состоящего из кодовых слов w 1 , w 2 , ..., w s , где s = 2 n , минимальное расстояние кода d min определяется следующим образом ) , ( min min j i w w d d (3.18) Можно показать, что если для кода выполняется неравенство d min > 2t + 1 (t – некоторое положительное целое число), то с помощью данного кода можно исправить все символы, содержащие до t ошибочных битов, включительно. Если d min ≥ 2t, то можно исправить все символы, содержащие до (t-1)ошибочных битов. Кроме того, будут обнаружены все символы с t ошибочными битами, исправить которые, в общем случае нельзя. Верно и обратное утверждение – каждый код, позволяющий исправлять до t ошибочных битов, должен удовлетворять условию d min ≥ 2t + 1. Для каждого 46 кода, позволяющего исправлять до (t-1) ошибочных битов и обнаруживать все символы с t ошибками, должно выполняться условие d min ≥ 2t. Связь между d min и t можно записать другим способом, выразив максимальное количество битовых ошибок в кодовом слове, гарантированно исправляемых кодом, в таком виде 2 1 min d t (3.19) где x – наибольшее целое число, не превышающее x (например, 6,3 = 6). Более того, если нас интересует только обнаружение ошибок, но не их исправление, количество обнаруживаемых ошибок t удовлетворяет следующему равенству 1 min d t (3.20) Последнее выражение можно понять интуитивно, если вспомнить, что d min битовых ошибок может изменить одно корректное кодовое слово на другое. При любом меньшем количестве ошибок этого произойти не может. Выбирая блочный код, нужно учитывать следующие соображения: 1. При данных n и k предпочтительным является максимально возможное d min ; 2. Код должен быть сравнительно простым для кодирования и декодирования требуя минимальной памяти и времени обработки; 3. Для уменьшения ширины требуемой полосы число избыточных битов (n – k) должно быть небольшим; 4. Для снижения уровня ошибок число избыточных битов (n - k) должно быть большим. Очевидно, что два последних требования противоречат друг другу, так что нужно выбирать некоторый компромиссный вариант. Перед тем как перейти к рассмотрению примеров кодов, обратимся к рисунку 2.8. Графики подобного типа довольно часто приводятся в литературе для демонстрации эффективности разных схем кодирования. Кодирование может использоваться для снижения необходимого значения E b /N 0 , что позволяет достичь заданного уровня битовых ошибок. Методы кодирования (модуляции) основываются на определении сигнальных посылок, представляющих биты. Кодирование, рассматриваемое в данном разделе влияет на отношение E b /N 0 . На рисунке 2.8 кривая справа соответствует системе модуляции без кодирования; в затененной области параметры системы могут быть улучшены. В этой области, при заданном E b /N 0 , достигается меньшее 47 значение BER. Верно и обратное утверждение – при заданном ВЕR требуется меньшее значение E b /N 0 , Кривая, расположенная левее, представляет собой типичный результат обработки сигнала кодом со степенью кодирования 1/2 (в этом случае число битов данных равно числу контрольных битов). Для частоты возникновения ошибок 10 -5 использование кодирования позволяет снизить E b /N 0 на 2,77 дБ. Это улучшение называется эффективностью кодирования. Эффективность кодирования – это снижение необходимого уровня E b /N 0 для системы с кодированием по сравнению с системой без кодирования (подразумевается одна и та же модуляция) для достижения заданной частоты ошибок. Необходимо отметить, что частота появления ошибок при коде со степенью 1/2 – это частота появления неисправленных ошибок, а Е b – энергия на один бит данных. Поскольку степень кодирования равна 1/2, каждому биту данных соответствуют два канальных бита, следовательно удельная энергия кодированного бита в два раза меньше удельной энергии бита данных, т.е. разница Е b /N 0 составляет 3 дБ. Если рассмотреть удельную энергию кодированного бита такой системы, уровень битовых ошибок в канале составит 2,4 10 -2 , или 0,024. В завершение необходимо отметить, что если значение E b /N 0 – ниже определенного порогового, методы кодирования отрицательно сказываются на производительности системы. В примере, приведенном на рисунке 2.8, это пороговое значение равно приблизительно 5,4 дБ. При более низком значении E b /N 0 использование дополнительных контрольных битов снижает удельную энергию битов данных, что ведет к увеличению числа ошибок. Если значение E b /N 0 выше порогового, способность кода исправлять ошибки (эффективность кодирования) позволяет компенсировать снижение Е b и улучшить работу системы. Перейдем к рассмотрению конкретных примеров кодов с коррекцией ошибок. Коды Хэмминга Коды Хэмминга – это семейство блочных кодов с коррекцией ошибок (т, k), которые характеризуются следующими параметрами: Длина блока n = 2 m - 1 Количество битов данных k = 2 m – m – 1 Количество контрольных битов n – k = m Минимальное расстояние d min = 3 Здесь т ≥ 3. Коды Хэмминга просты в использовании и легко поддаются анализу, однако редко используются на практике. Рассмотрим 48 этот тип кодов, чтобы проиллюстрировать на их примере некоторые фундаментальные принципы работы блочных кодов. A F B D C E Некодированная Кодированная 10 -2 10 -4 10 -6 E b /N 0 ( дБ) P B Рис.4.2 Сравнение достоверности передачи при использовании схемы с кодированием и без кодирования 8 9 14 Рисунок 2.8 – Сравнение достоверности передачи при использовании схемы кодирования и без кодирования Коды Хэмминга созданы для исправления 1-битовых ошибок. Для начала определим необходимую длину кода. Коды Хэмминга применяются так же, как методы определения ошибок (см. рисунок 2.4) – в процессе кодирования сохраняются k бит данных и добавляются (n – k)контрольных битов. При декодировании используются две последовательности из (n-k) бит, одна из которых является кодовым словом входящего сигнала, а другая рассчитывается на основе полученных битов данных. Последовательности побитово сравниваются с помощью логического исключающего ИЛИ. Результат сравнения называют синдромом. Биту синдрома присваивается значение 0, если биты двух последовательностей совпадают, и 1 – в противном случае. Синдром – это (n – k)-битовое слово в диапазоне от 0 до 2 (n-k) – 1. Значение 0 свидетельствует об отсутствии ошибки. Если же ошибка присутствует, ее местоположение определяется из синдрома. Поскольку 49 ошибочным может быть любой из k бит данных или (n - k)проверочных битов, должно выполняться следующее соотношение: n k n k k n ) ( 1 2 ) ( (3.21) Приведенное уравнение определяет количество битов, необходимое для исправления 1-битовой ошибки в слове, содержащем k бит данных. В табл. 3.2 приводится число контрольных битов, необходимое для последовательностей данных разной длины. Таблица 3.2 – Требования к кодам Хэмминга Количество битов данных Исправление 1-битовых ошибок Исправление 1-битовых ошибок, обнаружение 2- битовых ошибок Количество контрольных битов Увеличение блока в % Количество контрольных битов Увеличение блока в % 8 4 50 5 62,5 16 5 31,25 6 37,5 32 6 18,75 7 21,875 64 7 10,94 8 12,5 128 8 6,25 9 7,03 256 9 3,52 10 3,91 Для удобства генерируемый синдром должен обладать следующими свойствами: Если синдром состоит только из нулей – ошибки не обнаружены; Если один и только один бит синдрома равен 1 – ошибка присутствует в одном из контрольных битов; в этом случае исправлять ошибку не нужно; Если синдром содержит более одного бита со значением 1, он является указателем на положение ошибки в слове для исправления которой указанный бит инвертируется. Для получения заданных характеристик контрольные биты и биты данных следующим образом комбинируются в n-битовый блок. Начиная с младшего (крайнего правого) разряда через промежутки, которые соответствуют степеням 2 (т.е. на позиции 1, 2, 4, ..., 2 (n-k) ), вводятся контрольные биты Хэмминга. Оставшиеся позиции заполняются битами данных. Для расчета контрольных битов каждый бит данных созначением 1 представляется двоичным значением, соответствующим его положению в последовательности. 50 Таким образом, если 9-й бит равен 1, то соответствующее ему значение – 1001. Затем ко всем битам последовательности применяют операцию исключающего ИЛИ, в результате получают биты кода Хэмминга. В приемнике операция исключающего ИЛИ применяется ко всем элементам последовательности со значением 1. В этом случае операция применяется и к контрольным битам, и к битам данных. Поскольку положение контрольных битов определяется степенями 2, операцию исключающего ИЛИ можно применить ко всем информационным элементам последовательности, имеющим значение 1, и коду Хэмминга (состоящему из контрольных битов). Ошибки отсутствуют, если результатом операции будет 0. Если результат отличен от нуля – он представляет собой синдром, значение которого соответствует положению ошибочного бита. Описанный код известен как код исправления однобитовых ошибок (single-error-correcting – SEC). Одной из разновидностей этого кода является код исправления 1-битовых и обнаружения 2-битовых ошибок (single-error- correcting, double-error-detecting – SEC-DED). Как показано в табл. 3.1, для таких кодов требуется на один бит больше, чем для кодов SEC. Этот дополнительный бит является битом четности для всего кодового блока. Циклические коды Большинство используемых на практике блочных кодов с коррекцией ошибок относятся к категории циклических. Для циклических кодов справедливо следующее: если n-битовая последовательность с = (c 0 , c 1 , ..., c n- 1 ) является кодовым словом, то последовательность (с n-1 , с 0 , с 1 , ..., с n-2 ), полученная с помощью циклического сдвига с на одну позицию вправо, также используется в качестве кодового слова. Данный класс кодов можно легко кодировать и декодировать с использованием линейных регистров сдвига с обратной связью (linear feedback shift register – LFSR). Примерами циклических кодов являются коды Боуза-Чоудхури-Хоквенгема (БХЧ) и коды Рида-Соломона. Реализация циклического кодера как регистра LFSR подобна реализации приведенной на рисунке 2.6 для кодов обнаружения ошибок. Основное отличие состоит в том, что вход кода CRC имеет произвольную длину и в результате получается контрольный код CRC фиксированной длины, тогда как циклический код скоррекцией ошибок генерирует контрольный код (n – k)бит на основе входной последовательности фиксированной длины (k бит). На рисунке 2.9 представлена реализация в виде LFSR декодера циклического блочного кода. Можно сравнить данный рисунок с логикой кодера, приведенной на рисунке 2.6. Отметим, что в кодере k бит данных используются как вход для получения в регистре сдвига кода длиной (n - k) бит. Для декодера входом являются полученные n бит, которые содержат k бит данных, за которыми следуют (n-k)контрольных битов. При отсутствии 51 ошибок после первых k тактов регистр сдвига содержит последовательность контрольных битов, идентичную переданной. После оставшихся (n - k) тактов регистр сдвига будет содержать код-синдром. Вх Рис. 4.7 Структурная схема кодера циклического кода T n-k-1 T n-k-2 T 1 T 0 A n-k-1 A n-k-2 A 1 A 0 X 0 X 1 X 2 X n-k-1 X n-k 1 2 П 1 Вых 1 2 П 2 Рисунок 2.9 – Структурная схема декодера циклического кода Для декодирования циклического кода используется следующая процедура: 1. С помощью полученных битов вычисляется код-синдром. Вычисления проводятся аналогично тому, как кодер обрабатывает биты данных для получения контрольного кода; 2. Если все биты синдрома равны нулю – ошибки отсутствуют; 3. Если синдром отличен от нуля, производится дополнительная обработка для исправления ошибки. Значение синдромов можно понять, изучив блочный код с использованием полиномов. Как и при проверке четности с избыточностью, конкретный циклический код можно представить полиномиальным делителем, именуемым порождающим многочленом (или генератором). Для кода (n, k)порождающий многочлен можно записать в таком виде: 1 1 , 1 ) ( k n i k n i i X X A X P (3.22) где каждый из коэффициентов А i может принимать значения 0 или 1, что соответствует двоичному разряду в делителе. Например, для Р= 11001 многочлен Р(Х) имеет вид X 4 + X 3 + 1. Аналогично последовательность битов данных представляется полиномом D(X), а контрольный код – полиномом R(Х). Контрольный код определяется следующим образом , ) ( ) ( ) ( ) ( ) ( X P x R X Q X P X D X k n (3.23) Т.е. блок данных D(X)сдвигается влево на (n-k)бит и делится на Р(Х). В результате получим частное Q(X)и остаток R(Х)длиной (n – k)бит. Передаваемый блок – это конкатенация D(X) и R(Х): 52 ), ( ) ( ) ( X R X D X X T k n (3.24) При отсутствии ошибок передачи Т(Х)должно делиться на Р(Х)без остатка, что легко продемонстрировать ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( X Q X P X R X P X R X Q X P X R X P X D X X P X T k n (3.25) Последнее выражение справедливо в соответствии с правилами арифметики по модулю 2 (а а = 0). Следовательно, если ошибки отсутствуют, Т(Х)делится на Р(Х)без остатка. Если один или более битов являются ошибочными, полученный блок Z(X) будет иметь такой вид: ), ( ) ( ) ( X E X T X Z (3.26) где Е(Х)– n-битовый полином ошибок, содержащий 1 в каждом двоичном разряде, где в Z(X) имеется ошибка. Если Z(X) передается через регистр LFSR, который показан на рисунок 2.9, фактически производится деление Z(X)/P(X), что в результате дает синдром S(X)длиной (n - k)бит , ) ( ) ( ) ( ) ( ) ( X P X S X B X P X Z (3.27) где B(Х) – частное, a S(X) – остаток деления. Следовательно, S(X) является функцией Z(X). Каким же образом полученный результат можно использовать для исправления ошибок? Для ответа на этот вопрос, запишем уравнение в развернутой форме Z(X) ( ) ( ) , P(X) ( ) ( ) ( ) ( ) ( ) , ( ) ( ) ( ) ( ) ( ) ( ) , ( ) ( ) ( ) ( ) ( ) ( ) , ( ) ( ) S X B X P X T X E X S X B X P X P X E X S X Q X B X P X P X E X S X Q X B X P X P X (3.28) 53 Видим, что деление Е(Х)/Р(Х)дает тот же остаток, что и Z(X)/P(X). Следовательно, значение синдрома S(X)зависит только от ошибочных битов и не зависит от начальной последовательности битов (переданного значения Т(Х)). Если ошибочные биты Е(Х)можно получить из синдрома S(X), то ошибки в Z(X)можно исправить посредством простого сложения ), ( ) ( ) ( ) ( ) ( ) ( X T X E X E X T X E X Z (3.29) Поскольку S(X)зависит только от Е(Х), возможности блочного циклического кода определить очень легко. Синдром состоит из (n-k)бит, следовательно, он может принимать 2 n-k возможных значений. Нулевой синдром указывает на отсутствие ошибок. Следовательно, всего можно исправить (2 n-k - 1) различных ошибочных комбинаций. Чтобы с помощью кода (n, k)можно было исправить все возможные однобитовые ошибки, должно выполняться неравенство n ≤ (2 n-k - 1). Исправление всех 1- и 2- битовых ошибок требует выполнения следующего неравенства ), 1 2 ( 2 ) 1 ( k n n n n (3.30) Способ получения Е(Х)из S(X)может зависеть от используемого кода. Наиболее простой подход – построить таблицу, которая ставила бы в соответствие значениям Е(Х)значения S(X)После этого потребуется простой способ выполнения поиска в такой таблице. |