Тема: «Радиотелефонная сеть связи»
Часть 3 – Физический уровень
Целью данной курсовой работы является проектирование радиотелефонной сети связи, предназначенной для предоставления услуг передачи данных и речи небольшого числа абонентов в пределах ограниченной территории.
Основные требования к системе:
телефонный трафик является доминирующим.
Исходные данные к проекту:
· Количество абонентов в сети: 55;
· Радиус зоны радиопокрытия: 400 м;
· Тип местности: производственные помещения;
· Вероятность ошибки на бит Pb: 10-5;
· Мощность излучения подвижной станции Ризл :< 0.35 Вт ;
· Диапазон частот, вид модуляции выбирается самостоятельно;
PR: 90%;
Вероятность отказа обслуживания: 5%.
1.7. Построение результирующих иерархических моделей терминала и выделенных узлов сети (в соответствии с концепцией OSI) с отражением путей доставки служебных, так и информационных сообщений.
В разрабатываемой сети используются три нижних уровня взаимодействия модели OSI: физический, канальный и сетевой.
К Основный задачам, выполняемым на физическом уровне, относится сформирование необходимого для L2 уровня количество/тип ФК и обеспечение достоверной доставки битов по назначению.
Для выполнения задачи достоверной доставки применяются меры:
· синхронизация;
· помехоустойчивое кодирование;
· модуляция;
· эквалайзинг.
На Рисунке 1 представлена результирующая иерархическая модель сети в соответствии с концепцией OSI
Рисунок1 - Иерархическая модель системы
Физический уровень – это самый нижний уровень системы, который отвечает за непосредственный передачу (прием) сигнала в (из) радиоканал(а). Основная задача уровня – сформировать необходимое для L2 уровня количество/тип ФК и обеспечить достоверную доставку битов по назначению
Канальный уровень отвечает за формирование пакетов стандартного вида, адресную доставку сообщений и контроль правильности приема. Здесь производится управление доступом к сети, обнаруживаются ошибки передачи.
Уровень принятия решений является управляющим ядром узла сети. Он обрабатывает данные полученные с нижних уровней и принимает решения на основе анализа этих данных. Например, он обрабатывает данные радиоизмерений и передает на физический уровень команды о выборе профиля передачи и регулировки мощности. А так же, на ряду с пользовательским устройством, он может являться источником служебных сообщений.
С уровня принятия решений на физический уровень поступают результаты радиоизмерений (профиль передачи и мощность излучения). От канального уровня на физический поступают пакеты L2 и информация об их количестве. Пакеты L2 проходят через следующие процедуры: канальное кодирование, квадратурная модуляция. Далее образуется информационное поле сообщения физического уровня.
Буфер накопления пакетов L2 предназначен для накопления нескольких пакетов, чтобы между потоком пакетов разместить служебное поле для корректировки правильности действий на приемной стороне.
На основе профиля передачи, типа сообщения, извлеченного из первого пакета L2 и значения количества пакетов в сообщении ФУ, поступившего от L2, формируется служебное поле. Служебное и информационное поля объединяются с заранее сформированной (а так же записанной в память, поскольку она всегда имеет одинаковый вид) преамбулой и образуют полное сообщение физического уровня. Оно усиливается до необходимого уровня и излучается в радиоканал.
На приемной стороне происходят аналогичные
преобразования, которые так же отображены на рисунке1.
Для физического уровня разделения на служебные сообщения и сообщения трафика не существует, принятые сообщения будут подвергаться одинаковым преобразованиям.
2. Экспериментальная часть. Разработка и экспериментальное исследование программной модели канала передачи данных
2.1. Разработка и описание блок-схемы алгоритма модели
На рисунке 2 и рисунке 3 представлены блок схемы алгоритмов передающей и приемной части системы, основанные на алгоритмах , проработанных во второй части (физический уровень).

Рисунок 2 - Блок-схема передающей части модели

Рисунок 3 - Блок- схема приемной части модели
Передающая часть модели.
Сначала происходит определение параметров профиля передачи, таких как: мощность передачи, тип модуляции и др. Далее происходит формирования служебного поля, выбор вида модуляции в зависимости от помеховой обстановки и кодирование служебного поля. Служебное поле всегда модулируется QPSK для лучшей защищенности.
После того как служебное поле закодировано начинается цикл канального кодирования каждого L2 пакета и их накопление для последующих преобразований.
Дальше происходит квадратурная модуляция, которая выбирается в зависимости от флага (если флаг равен нулю, то QPSK модуляция, если нет - PSK-8).
Приемная часть модели.
При приеме сообщения сначала происходят определение преамбулы, первичные радиоизмерения и выделение полей сообщения и преамбулы.
Далее происходит квадратурная демодуляция и канальное декодирование служебного поля и извлечение из него информации о профиле передачи, типе сообщения и количестве пакетов L2.
Затем начинается настройка фильтра эквалайзера
После формирования потока данных осуществляется квадратурная демодуляция ( в зависимости от значения флага: 0- QPSK , 1- PSK-8), определение СКО и, наконец, происходит сравнение длины информационного поля на передающей и приемной стороне (FEC). Здесь возможны несколько вариантов: если длины больше - лишние биты убираются, если длина поля меньше - устанавливается флаг об ошибке, если длина соответствует - начинается дальнейшее преобразование сообщения.
Если ошибки обнаружены - происходят оповещение КУ, если же ошибки не обнаружены начинается цикл чтения пакетов L2 и их декодирование.
2.2 Разработка программных модулей передачи и приема сообщений канального уровня.
Элемент сценария описываемый в модели представляет собой передачу сообщения трафика между терминалом и точкой доступа. В ответ на получение сообщения точка доступа формирует ARQ-отчет, в котором сообщает о правильном\не правильном приеме сообщения. В случае не правильного получения сообщения точкой доступа терминал повторяет передачу. Если первичная попытка передачи осуществлялась с помощью профиля PSK-8 и была провальной, профиль передачи меняется на более помехоустойчивый - QPSK.
В
модели присутствует возможность регулирования ОСШ в КС (переменная SN) и
количества попыток после которого считается что сообщения передать не удалось
(переменная iMax). По умолчанию эти значения равны 15 и 5. А так же, имеется
возможность включения/отключения вывода в консоль результатов радиоизмерений
(флаг rMeasure): мощности принятого сигнала и максимального СКО среди символов
принятого СКС и включения/отключения отображения графиков при работе
ФУ (флаг showImg).
Программный модуль состоит из Matlab-функций имитирующих работу ФУ и КУ, функции для определения максимального СКО среди символов СКС принятого сигнала, а так же скрипта отражающего часть сценария работы сети, а именно - передача псевдослучайного сообщения трафика (состоящего из одного пакета) от терминала к точке доступа.
· start.m – часть сценария работы сети, частично затрагивает работу канального уровня сети;
· l2_func.m – функция отражающая работу канального уровня системы;
· phy_lvl.m – функция отражающая
работу физического уровня системы;
· IQ_maxSKO.m – функция для определения максимального СКО среди символов СКС принятого сигнала.
Настройка работы модуля производится в файле start.m (см. соответствующие комментарии в скрипте).
Пример работы модуля (PSK-8, ОСШ 11 дБ, iMax = 6, rMeasure = 1, showImg = 0) приведен на рисунке 4. Программный модуль формирует пакеты L2 и сообщение физического уровня согласно структурам представленным на рисунках 5 и 6 из второй части работы.

Рисунок 4. Пример работы модуля start.m
Рисунок5- Структура сообщения физического уровня

Рисунок6- Структура сигнала
Листинг №1 функции физического уровня
function [ L2_msgs_rcv msgType_rcv msgCount_rcv sigPower maxSKO errorFlag ] = phy_lvl( L2_msgs, msgCount, mProfile, SN, img, rMeasureFlag )
% L2_msgs - пакеты L2
% msgCount - количество передаваемых пакетов L2
% mProfile - профиль передачи 0 - QPSK, 1 - PSK-8
% SN - ОСШ в КС, SN = 0 - моделирование прохождения через КС отключено
% img - показ графиков, 0 - выкл. 1 - вкл.
% rMeasure - вывод в консоль данных радиоизмерений на ФУ, 0 - выкл. 1 - вкл.
%== Физический уровень передатчика ==%
global noninfSubcarriers;
global Nc;
global ampPilot;
trell = poly2trellis( 7, [ 171 133 ] );
errorFlag = 0;
% Определяем тип пакетов L2
if all( L2_msgs( 6:9 ) == [ 0 0 0 0 ] )
msgType = 0;
else
msgType = 1;
end
%% Формирование служебного поля
% Выбор типа модуляции для служебного символа
mParam = modem.pskmod( 4 );
mParam.inputtype = 'bit';
mParam.SymbolOrder = 'gray';
mParam.PhaseOffset = 0;
% Формирование служебного символа
serviceMsg = zeros( 1, Nc );
% Информация о виде модуляции
serviceMsg( 1 ) = mProfile;
% Информация о типе сообщения
serviceMsg( 2 ) = msgType;
% Кол-во пакетов в сообщении
msgLength = dec2bin( msgCount, 8 );
for i = 1:8
serviceMsg( 2 + i ) = str2num( msgLength( i ) );
end
% Помехоустойчивое кодирование
serviceMsg_c = convenc( serviceMsg, trell );
% Перемежение
serviceMsg_cai = randintrlv( serviceMsg_c, 534 );
% Квадратурная модуляция
IQ_service = modulate( mParam, serviceMsg_cai' );
%% Определение профиля передачи
if mProfile == 0
mPos = 4;
mParam = modem.pskmod( mPos );
ampPreamb_short = 0.75; % КУ усиления для выравнивания уровня преамбулы к данным
ampPreamb_long = 1; % КУ усиления для выравнивания уровня преамбулы к данным
ampPilot = 2; % КУ для пилот сигнала
else
mPos = 8;
mParam = modem.qammod( mPos );
ampPreamb_short = 5; % КУ усиления для выравнивания уровня преамбулы к данным
ampPreamb_long = 5; % КУ усиления для выравнивания уровня преамбулы к данным
ampPilot = 7; % КУ для пилот сигнала
end;
%% Работа над пакетами L2
% Определяем размер пакета L2 исходя из его типа
if msgType == 1
packLength = 200;
else
packLength = 400;
end
L2_msgs_cai = [];
for pack = 1:msgCount
packStart = ( pack - 1 ) * packLength + 1;
L2_msg = L2_msgs( packStart:( packStart + packLength - 1) );
%% Канальное кодирование
% Помехоустойчивое кодирование
L2_msg_c = convenc( L2_msg, trell );
% Перемежение
L2_msg_cai = randintrlv( L2_msg_c, 534 );
L2_msgs_cai = [ L2_msgs_cai L2_msg_cai ];
end
%% Модуляция
% Размер передаваемого сообщения
L2_msg_length = length( L2_msgs_cai );
% Количество поднесущих с информацией
Nc_data = Nc - length( noninfSubcarriers ); % 50 поднесущих
% Формирование блока незначащих битов
symbolGarbage = zeros( 1, symbolCounter * symbolLength - L2_msg_length );
% Cообщение канального уровня
data = L2_msgs_cai;
% Выбор модуляции
mParam.inputtype = 'bit';
mParam.SymbolOrder = 'gray';
mParam.PhaseOffset = 0;
% Добавление незначащих битов
if ( symbolCounter - L2_msg_length / symbolLength ) == 0
data = [ data ]';
else
data = [ data symbolGarbage ]';
end
% Квадратурная модуляция
IQ_signal = modulate( mParam, data );
%% Формирование символов преамбулы
% Короткий символ преамбулы
Preamb_shortline = sqrt( 13 / 6 )*[ 0 0 1+j 0 0 0 -1-j 0 0 0 1+j 0 0 0 -1-j 0 0 0 -1-j 0 0 0 1+j 0 0 0 0 0 0 -1-j 0 0 0 -1-j 0 0 0 ...
1+j 0 0 0 1+j 0 0 0 1+j 0 0 0 1+j 0 0 ];
Preamb_shortSymb = ifft( Preamb_shortline );
% Выделение первых 16 отсчетов
short = Preamb_shortSymb( 1:16 );
% Формирование 10 коротких символов преамбулы на основе выбранного набора
Preamb_shortComplete = [ short short short short short short short short short short ];
% Длинный символ преамбулы
Preamb_longline = [ 0 0 0 0 0 0 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 ...
1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1 1 0 0 0 0 0 0 ];
Preamb_longSymb = ifft( Preamb_longline );
Preamb_longComplete = [ Preamb_longSymb( 64 - 2 * 16 + 1:64 ) Preamb_longSymb Preamb_longSymb ];
% Окончательная сборка преамбулы (усиление чтобы выровнить уровень к уровню данных)
Preamb_Full = [ ampPreamb_short * Preamb_shortComplete ampPreamb_long * Preamb_longComplete ];
%% Сборка сообщения физического уровня
l1Frame = [ Preamb_Full ofdmFrame ];
if img == 1
figure( 1 );
plot( abs( l1Frame ) );
grid on
title( 'Временная реализация сообщения физического уровня' )
end;
%% Задержка сигнала на псевдослучайное кол-во отсчетов (от 0 до 200)
l1Frame_delay = [ zeros( 1, randi( 200 ) ) l1Frame ];
%% AWGN-канал
if SN ~= 0
l1Frame_rcv = awgn( l1Frame_delay, SN, 'measured' );
else
l1Frame_rcv = l1Frame_delay;
end
%== Физический уровень приемника ==%
%% Синхронизация
% Подготовка окна
sync_rcv = zeros(1, length( l1Frame_rcv ) - length( Preamb_Full ) );
% Сдвиг и расчет СКО
for i = 1: ( length( l1Frame_rcv ) - length( Preamb_Full ) )
searchBlock = l1Frame_rcv( i: ( i - 1 + length( Preamb_Full ) ) );
sync_rcv(i) = sum( abs( searchBlock - Preamb_Full).^2 );
end
% Нахождение минимума СКО и соответственно, начала преамбулы
[ SKO_min Preamb_Start_rcv ] = min( sync_rcv );
% Определение окончания преамбулы
Preamb_End_rcv = Preamb_Start_rcv + length( Preamb_Full );
% Отображение графика
if img == 1
figure( 4 );
plot( sync_rcv );
grid on
title( 'СКО между двумя блоками: скользящим окном и преамбулой' )
end;
% Измерение мощности принятого сигнала
sig = l1Frame_rcv( Preamb_Start_rcv:end );
sigPower = sum(abs(sig(:)).^2)/length(sig(:));
if rMeasureFlag == 1
display( 'Мощность принятого сигнала:' )
disp( sigPower );
end
%% Выделение полей
% Выделение преамбулы, сервисного поля и поля данных
Preamb_Full_rcv = l1Frame_rcv( Preamb_Start_rcv:Preamb_End_rcv );
symbol_rcv = l1Frame_rcv( ( Preamb_End_rcv ):( Preamb_End_rcv + 64 - 1 ) );
ofdmFrame_rcv = l1Frame_rcv( ( Preamb_End_rcv + 64 ):end );
IQ_service_rcv = fft( symbol_rcv' );
%% Демодуляция
% Настройка вида модуляции сервисного поля
mParam = modem.pskdemod( 4 );
mParam.SymbolOrder = 'gray';
mParam.PhaseOffset = 0;
mParam.OutputType = 'bit';
% Демодуляция сервисного поля
serviceMsg_cai_rcv = demodulate( mParam, IQ_service_rcv );
% Деперемежение
serviceMsg_c_rcv = randdeintrlv( serviceMsg_cai_rcv, 534 );
% Декодирование по Витерби
serviceMsg_rcv = vitdec( serviceMsg_c_rcv, trell, 7, 'cont', 'hard' );
% Определение профиля передачи
mProfile_rcv = serviceMsg_rcv( 8 );
% Определение типа принятого сообщения
msgType_rcv = serviceMsg_rcv( 9 );
% Определение длинны принятого сообщения
for i = 1:6
msgLength_rcv( i ) = num2str( serviceMsg_rcv( 9 + i ) );
end
msgCount_rcv = bin2dec( msgLength_rcv );
% Если количество принятых сообщений получилось равным 0, считаем что оно
% равно 1. В этом случае уже ясно, что сообщение принято не верно
% , однако возможно
% "угадать" количество пакетов L2. Если не угадаем, у КУ не сойдется
% контрольная сумма и он сделает вывод о неверно
% принятом сообщении.
if msgCount_rcv == 0
msgCount_rcv = 1;
end
% Определение профиля передачи поля данных
if mProfile_rcv == 1
mPos_rcv = 8;
mParam = modem.qamdemod( mPos_rcv );
else
mPos_rcv = 4;
mParam = modem.pskdemod( mPos_rcv );
end;
mParam.SymbolOrder = 'gray';
mParam.PhaseOffset = 0;
mParam.OutputType = 'bit';
% Определение типа сообщения
if msgType_rcv == 1
packLength_rcv = 400;
else
packLength_rcv = 800;
end
OSpr = [ OSpr; IQ_sign ];
IQ_sign_equalazied = IQ_sign ./ ( equInterpol ./ ampPilot ); % Непосредственно эквалайзер
IQ_signal_rcv = [ IQ_signal_rcv IQ_sign_equalazied( infSubcarriers ) ]; % Формирование потока данных
end;
% Квадратурная демодуляция закодированного и перемеженного пакета L2
data_rcv = demodulate( mParam, IQ_signal_rcv );
% Определяем максимальное СКО среди IQ-символов
[ maxSKO ] = IQ_maxSKO( IQ_signal_rcv, data_rcv, mPos_rcv );
if rMeasureFlag == 1
display( 'Максимальное СКО среди символов СКС принятого сигнала:' )
disp( maxSKO );
end
% Убираем лишние биты. Лишние биты появляются если
возникла ошибка в приеме полей типа, модуляции или длинны сообщения
% в этом случае не совпадает фактическая и ожидаемая длинна принятого
% информационного поля и если эти значения не уравнять возникнет ошибка
% на этапе канального декодирования.
% Рассчитываем ожидаемую длинну информационного поля
infoLength_rcv = ( packLength_rcv * msgCount_rcv );
% Рассчитываем фактически принятую длинну информационного поля
data_size_rcv = size( data_rcv );
dataLength_rcv = data_size_rcv( 1 ) * data_size_rcv( 2 );
% Если фактическая больше - уравниваем путем удаления лишнего.
if infoLength_rcv < dataLength_rcv
for i = dataLength_rcv:-1:( infoLength_rcv + 1 )
data_rcv( i ) = [];
end
% Если фактическая меньше - критическая ошибка. В программной модели она
% может наступить только в случае не правильного приема служебного поля,
% на практике, только в случае неисправности в радиоинтерфейсе т.к.
% в других случае, если ожидаемая длинна на приемнике окажется больше чем
% переданная отправителем, приемник будет принимать шумы радиоканала
elseif infoLength_rcv > dataLength_rcv
errorFlag = 1;
end
%% Отображение СКС
figure( 3 );
plot( IQ_signal_rcv, 'x' );
grid on
title( 'Сигнально-кодовое созвездие принятого сигнала' )
end;
%% Канальное декодирование
L2_msgs_rcv = [];
% Если во время приема физический уровень обнаружил критическую ошибку
% которая не позволит ему произвести декодирование, он выдает на КУ
% пустой пакет трафика L2 и соответствующий поднятый флаг errorFlag
if errorFlag == 0
for pack = 1:msgCount_rcv
% Выделение кодированного и перемеженного пакета L2
packStart = ( pack - 1 ) * packLength_rcv + 1;
L2_msg_cai_rcv = data_rcv( packStart:( packStart + packLength_rcv - 1) );
% Деперемежение
L2_msg_c_rcv = randdeintrlv( L2_msg_cai_rcv, 534 );
% Декодирование по Витерби
L2_msg_rcv = vitdec( L2_msg_c_rcv, trell, 7, 'cont', 'hard' );
L2_msgs_rcv = [ L2_msgs_rcv L2_msg_rcv ];
end
else
L2_msgs_rcv = zeros( 1, 400 ); % "избыточное"
msgType_rcv = 0;
msgCount_rcv = 1;
end
end
Графики, полученные в ходе выполнения программы представлены на рисунках 7-9.
Рисунок 7- Временная реализация сообщения физического уровня для QPSK

Рисунок 8- Временная реализация сообщения физического уровня для
PSK - 8

Рисунок 9- Интерполированная АЧХ КС
2.3 Исследование процедуры тактовой (символьной) синхронизации физического уровня.
Сначала составляется массив всех окон принятого сигнала длинной 320 отсчетов (длинна преамбулы). Для каждого элемента этого массива находится СКО двух блоков: окна и преамбулы. Потом из полученной выборки находится наименьшее значение СКО рисунок 10, свидетельствующее о полном приеме преамбулы в окне с началом в точке минимума - следовательно, отложив от этой точки 320 отсчетов можно найти начало служебного, а значит и информационного поля сообщения.
Листинг №2
%% Синхронизация
% Подготовка окна
sync_rcv = zeros(1, length( l1Frame_rcv ) - length( Preamb_Full ) );
% Сдвиг и расчет СКО
for i = 1: ( length( l1Frame_rcv ) - length( Preamb_Full ) )
searchBlock = l1Frame_rcv( i: ( i - 1 + length( Preamb_Full ) ) );
sync_rcv(i) = sum( abs( searchBlock - Preamb_Full).^2 );
end
% Нахождение минимума СКО и соответственно, начала преамбулы
[ SKO_min Preamb_Start_rcv ] = min( sync_rcv );
% Определение окончания преамбулы
Preamb_End_rcv = Preamb_Start_rcv + length( Preamb_Full );
% Отображение графика
if img == 1
figure( 4 );
plot( sync_rcv );
grid on
title( 'СКО между двумя блоками: скользящим окном и преамбулой' )
end

Рисунок 10- минимумы СКО
2.4. Исследование качества приема сообщений по различным каналам связи.
Для исследования прохождения сообщения по каналу связи в программном модуле присутствует возможность включения моделирования AWGN-канала.
Пронаблюдаем прохождения сообщения по каналу связи для различных условий в канале. При ОСШ = 20 дБ рисунок11 и рисунок12 сообщения приняты правильно при обоих профилях передачи.

Рисунок 11- СКС принятого сигнала при ОСШ = 20 дБ и модуляции QPSK

Рисунок 12- СКС принятого сигнала при ОСШ = 20 дБ и модуляции PSK-8
Постепенно снижая ОСШ найдем для каждого профиля модуляции такое значение ОСШ, при котором начинают появляться ошибки. В результате получаем 4 дБ для QPSK рисунок13 и 11 дБ для PSK-8 рисунок 14.
Рисунок13 - СКС принятого сигнала при ОСШ = 4 дБ и модуляции QPSK
Рисунок 14- СКС принятого сигнала при ОСШ = 11 дБ и модуляции PSK-8
В процессе уменьшения ОСШ было получено критическое значение равное 3дБ, при котором сообщение с наиболее помехоустойчивой модуляцией ( QPSK) не удалось передать.
Результат работы программы представлен на рисунке 15:
Рисунок15. Консоль Matlab при проведении эксперимента по передачи с малыми ОСШ
Сравнение теоретических ОСШ, полученных в пункте 1.6.7 , с практическими представлено в таблице1
Таблица1 - Сравнение ОСШ для различных профилей

Выводы:
Моделирование передачи пакета трафика канального уровня показало, что система может передавать сообщения даже при малых значениях ОСШ (п. 2.4). Рассматривая таблицу1, делаем выводы что выигрыш в отношении сигнал/шум
в 2 раза больше в ходе выполнения программных модулей, по сравнению с теоретическими. Отличие состоит в том, что в данной части работы моделировалась передача нескольких пакетов L2уровня, что позволило произвести более точные расчеты.
Используемая литература:
1.Бакке А. В. "Лекции по курсу: Системы и сети связи с подвижными объектами".
2. Статьи с сайта Omoled.ru прошлых лет.
3. http://omoled.ru/publications/view/1024
4. http://omoled.ru/publications/view/1031