Целью данного курсового проекта является
проектирование радиосети предназначенной для беспроводного сбора данных с подвижных
объектов в процессе их движения по определенному маршруту.
Основные требования к системе:
Точки
доступа располагаются вдоль трассы предполагаемого движения подвижного объекта
и обеспечивают получение оперативных данных с датчиков, расположенных на
подвижных объектах.
Исходные данные к проекту:
Радиус
зоны радиопокрытия терминала: 200м
Вероятность
ошибки на бит Pb: 3*10-6
Мощность
излучения подвижной станции Ризл : < 150 мВт
Тип
CRC: CRC-8
PR: 95%
1.7. Построение результирующих иерархических моделей терминала и выделенных
узлов сети (в соответствии с концепцией OSI) с отражением путей доставки
служебных, так и информационных сообщений.
Модель
OSI описывает схему взаимодействия сетевых объектов, определяет перечень задач
и правила передачи данных. Ее можно представить следующим образом (рисунок 1):
Рис.1
- Модель OSI
Подробно рассмотрим физический уровень модели OSI.
Это нижний уровень модели, необходимый для непосредственной передачи потока
данных.
К Основный задачам, выполняемым на
физическом уровне, относится сформирование необходимого для L2 уровня
количество/тип ФК и обеспечение достоверной доставки битов по назначению.
Для выполнения задачи
достоверной доставки применяются меры:
· синхронизация;
· помехоустойчивое
кодирование;
· модуляция;
· применение
технологии OFDM;
· эквалайзинг.
Ниже представлена результирующая
иерархическая модель сети в соответствии с концепцией OSI.
Рис.2- Иерархическая
модель системы
Физический уровень – нижний уровень модели OSI. Обеспечивает установление и управление физическим
каналом. Реализует механические, электрические, функциональные и процедурные
аспекты взаимодействия двух сетевых устройств. Основной задачей ФУ является
надежная передача потока битов, поступающего с верхнего (канального уровня). На
физическом уровне могут быть реализованы любые технические решения,
направленные на повышение достоверности приема битов. Для эффективной
реализации поставленных задач необходимо оптимальным образом подобрать
параметры функционирования системы связи на физическом уровне.
Канальный уровень определяет функции, отвечающие за
организацию канала передачи данных. Канальный уровень необходим для
осуществления надежной доставки пакетов между узлами сети. На канальном уровне
решаются следующие задачи: формирование пакетов, выделение пакетов из потока
бит, организация доступа к физическому каналу связи, проверка целостности
пакетов, адресация сообщений, пакетная синхронизация.
Уровень принятия решений является
управляющим ядром узла сети. Он обрабатывает данные полученные с нижних
уровней и принимает решения на основе анализа этих данных. Например, он обрабатывает
данные радиоизмерений и передает на физический уровень команды о выборе профиля
передачи и регулировки мощности. А так же, на ряду с пользовательским
устройством, он может являться источником служебных сообщений.
С уровня принятия решений на физический уровень поступают результаты
радиоизмерений (профиль передачи и мощность излучения) и информация о том,
по какому каналу будет происходить передача. От канального уровня на физический
поступают пакеты L2. Пакеты L2 проходят через следующие процедуры: канальное
кодирование, квадратурная модуляция, OFDM-модуляция и образуется информационное
поле сообщения физического уровня.
На основе профиля передачи, типа сообщения, извлеченного из первого
пакета L2, формируется служебное поле. Служебное и информационное поля
объединяются с заранее сформированной (а так же записанной в память, поскольку
она всегда имеет одинаковый вид) преамбулой и образуют полное сообщение
физического уровня. Оно усиливается до необходимого уровня и излучается в
радиоканал.
На приемной стороне происходят аналогичные
преобразования, которые так же отображены на рисунке1.
Для физического уровня
разделения на служебные сообщения и сообщения трафика не существует, принятые
сообщения будут подвергаться одинаковым преобразованиям.
2. Экспериментальная
часть. Разработка и экспериментальное исследование программной модели
канала передачи данных
2.1. Разработка и описание блок-схемы
алгоритма модели
На рисунке 3 и рисунке 4 отображены блок схемы алгоритмов передающей и приемной
части системы, на основании алгоритмов , проработанных во второй части
(физический уровень).
Рис.3-
Блок схема передающей части модели
Рис.4-
Блок схема приемной части модели
Передающая часть модели.
В первую очередь
определяются параметры профиля передачи, таких как: мощность передачи, тип
модуляции и др. затем формируется служебное поле, выбирается вид модуляции в
зависимости от помеховой обстановки и кодирование служебного поля. Служебное
поле всегда модулируется BPSK в пользу
защищенности.
После того как
служебное поле закодировано начинается цикл канального кодирования
каждого L2 пакета и их накопление для последующих
преобразований.
Далее символы OFDM проверяется на полноту и если символы не
полные, то они дополняются случайными битами (вариант с заполнением нулями или единицами повлияет на работу и эффективность
FEC не с лучшей стороны) . После этого происходит квадратурная модуляция,
которая выбирается в зависимости от флага (если флаг равен нулю, то BPSK модуляция, если нет - QAM16), и цикл сборки OFDM символов. Информация о количестве OFDM символов передается с первым символом.
Дальше служебное и
информационное поля объединяются, формируется преамбула и происходит сборка
сообщения L1 уровня.
Приемная часть модели.
При приеме сообщения
сначала происходят определение преамбулы, первичные радиоизмерения и выделение
полей сообщения и преамбулы.
Затем происходит
квадратурная демодуляция и канальное декодирование служебного поля и
извлечение из него информации о профиле передачи и типе сообщения.
Потом начинается
цикл чтения OFDM- символов и
извлечение из них пилот сигналов, настройка фильтра эквалайзера и формирование
потока данных из поднесущих.
Сформировав поток
данных осуществляется квадратурная демодуляция ( если значение флага: 0- BPSK , 1- QAM-16), определение СКО и, наконец,
происходит сравнение длины информационного поля на передающей и приемной
стороне (FEC). Возможны несколько исходов: если длина поля
больше - лишние биты убираются, если длина поля меньше - устанавливается флаг
об ошибке, если длина соответствует - начинается дальнейшая обработка сообщения.
При обнаружении ошибки
- происходит оповещение КУ, если же ошибки не обнаружены - начинается цикл
чтения пакетов L2 и их декодирование.
Листинг №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 - BPSK, 1 - QAM-16
% SN - ОСШ в КС, SN = 0 - моделирование
прохождения через КС отключено
% img - показ графиков, 0 - выкл. 1 - вкл.
% rMeasure - вывод в консоль данных
радиоизмерений на ФУ, 0 - выкл. 1 - вкл.
%== Физический уровень передатчика ==%
global noninfSubcarriers;
global Nc;
global ampPilot;
trell = poly2trellis( 8, [255 148 ] );
errorFlag = 0;
% Список не информационных поднесущих в
OFDM-символе
noninfSubcarriers = [ 1 2 6
13 20 27 31 31];
% Размерность OFDM-символа
Nc = 32;
% Определяем тип пакетов L2
if all( L2_msgs( 6:9 ) == [
0 0 0 0 ] )
msgType = 0;
else
msgType = 1;
end
%% Формирование служебного поля
% Выбор типа модуляции для служебного
символа
mParam = modem.pskmod( 2 );
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' );
% Формирование OFDM символа
symbol = ifft( IQ_service );
ofdmFrame = [ symbol' ];
%% Определение профиля передачи
if mProfile == 0
mPos = 2;
mParam = modem.pskmod(
mPos );
ampPreamb_short = 0.75; %
КУ усиления для выравнивания уровня преамбулы к данным
ampPreamb_long
= 1; % КУ усиления для выравнивания уровня
преамбулы к данным
ampPilot =
2; % КУ для пилот сигнала
else
mPos = 16;
mParam = modem.qammod(
mPos );
ampPreamb_short = 5; % КУ усиления для выравнивания уровня преамбулы к
данным
ampPreamb_long
= 5; % КУ усиления для выравнивания
уровня преамбулы к данным
ampPilot =
7; % КУ для пилот сигнала
end;
%% Работа над пакетами L2
% Определяем размер пакета L2 исходя из
его типа
if msgType == 1
packLength = 54;
else
packLength = 26;
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 = L2_msg_c;
L2_msgs_cai =L2_msg_cai ;
end
%% Модуляция (квадратурная и OFDM)
% Размер передаваемого сообщения
L2_msg_length = length(
L2_msgs_cai );
% Количество поднесущих с информацией
Nc_data = Nc - length(
noninfSubcarriers ); % 50 поднесущих
% Количество бит на OFDM-символ
symbolLength = Nc_data * log2(
mPos );
% Требуемое количество OFDM-символов
symbolCounter = ceil(
L2_msg_length / symbolLength );
% Формирование блока незначащих битов
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 );
% Формирование OFDM-символов и добавление
служебного символа
[ mof, OS, OSf, OSp ] =
makeOfdmFrame( IQ_signal, symbolCounter );
ofdmFrame
= [ ofdmFrame mof ];
%% Формирование символов преамбулы
% Короткий символ преамбулы
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(
32 - 2 * 16 + 1:32 ) 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 + 32 - 1 ) );
ofdmFrame_rcv = l1Frame_rcv( (
Preamb_End_rcv + 32 ):end );
IQ_service_rcv = fft( symbol_rcv' );
%% Демодуляция
% Настройка вида модуляции сервисного
поля
mParam = modem.pskdemod( 2 );
mParam.SymbolOrder = 'gray';
mParam.PhaseOffset = 0;
mParam.OutputType = 'bit';
% Демодуляция сервисного поля
serviceMsg_cai_rcv = demodulate( mParam,
IQ_service_rcv );
serviceMsg_c_rcv = serviceMsg_cai_rcv;
% Декодирование по Витерби
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 = 16;
mParam = modem.qamdemod(
mPos_rcv );
else
mPos_rcv = 2;
mParam = modem.pskdemod(
mPos_rcv );
end;
mParam.SymbolOrder = 'gray';
mParam.PhaseOffset = 0;
mParam.OutputType
= 'bit';
% Определение типа сообщения
if msgType_rcv == 1
packLength_rcv = 54;
else
packLength_rcv
= 26;
end
% Выполняем выделение OFDM символов из
общего потока
IQ_signal_rcv = [];
% Список поднесущих с информацией
infSubcarriers = [ 3:5 7:12 14:19
21:26 29:30 ];
pilotSubcarriers = [6 13 20 27];
equSubcarrLine = 1:32;
OSr = [];
OSpr = [];
for i = 0:( length( ofdmFrame_rcv ) / 68
) - 1
IQ_sig = ofdmFrame_rcv( (
5:68 ) + i * 68 ); % Удаление префикса
OSr = [ OSr; IQ_sig ];
IQ_sign = fft( IQ_sig
); % Переход к частотной области
pilot_rcv = IQ_sign(
pilotSubcarriers ); % Выделение пилот-сигналов
pilot_rcv( 1 ) = pilot_rcv( 2 ); % Дублирование крайних пилот сигналов на "концы"
символа
pilot_rcv( 6)
= pilot_rcv( 13 );
equInterpol =
interp1( pilotSubcarriers, abs( pilot_rcv ), equSubcarrLine, 'pchip' ); % Интерполяция АЧХ канала
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
% Убираем лишние биты. Лишние биты
появляются в двух случаях:
% 1) Их специально добавили на этапе
передачи для полного
% заполнения
OFDM-символа;
% 2) Возникла ошибка в приеме полей типа,
модуляции или длинны сообщения
% в этом случае не
совпадает фактическая и ожидаемая длинна принятого
% информационного поля и
если эти значения не уравнять возникнет ошибка
% на этапе канального
декодирования.
% Рассчитываем ожидаемую длинну
информационного поля
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
%% Отображение интерполированной АЧХ КС
if img == 1
figure( 2 );
plot( equInterpol ./
ampPilot, 'r' );
grid on
title( 'Интерполированная АЧХ канала связи (в номерах поднесущих)' )
%% Отображение СКС
figure( 3 );
plot( IQ_signal_rcv, 'x'
);
grid on
title( 'Сигнально-кодовое созвездие принятого сигнала' )
end;
%% Канальное декодирование
L2_msgs_rcv = [];
% Если во время приема физический уровень обнаружил критическую ошибку
% которая не позволит ему произвести декодирование, он выдает на КУ
% пустой пакет трафика L2 и соответствующий поднятый флаг errorFlag
if errorFlag == 0
for pack = 1:msgCount_rcv
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, 256
); % "мусор"
msgType_rcv = 0;
msgCount_rcv = 1;
end
end
Рис.5
– Временная диаграмма сообщения физического уровня
Рис.
6- Временные реализации пакетов физического уровня для BPSK
Рис.
7- Временные реализации пакетов физического уровня для QAM-16
2.3 Исследование процедуры
тактовой (символьной) синхронизации физического уровня.
В
ходе моделирования прохождения сигнала по каналу связи приемная часть не знает
точного времени прихода OFDM-сигнала. Процесс синхронизации в
коде модели представляет собой процесс обнаружения OFDM-сигнала с
помощью скользящего по сигналу окна размером 320 отсчетов (как и преамбула) и
последующего определения минимума СКО между окном и преамбулой
Сначала составляется массив всех окон принятого сигнала длинной 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
Рис.8-
минимумы СКО
2.4. Исследование качества приема сообщений по
различным каналам связи.
Для исследования прохождения сообщения по
каналу связи в программном модуле присутствует возможность включения
моделирования AWGN-канала.
Пронаблюдаем прохождения сообщения по каналу связи для различных условий в
канале. При ОСШ = 20 дБ рисунок 9 и рисунок 10 сообщения приняты
правильно при обоих профилях передачи.
Рис.
9- Сигнально-кодовое созвездие для BPSK модуляции
Рис.
10-Сигнально-кодовое созвездие для QAM-16 модуляции
Рис.11 - СКС принятого сигнала
при ОСШ = 4 дБ и модуляции BPSK
Рис.12-
СКС принятого сигнала при ОСШ = 11 дБ и модуляции QAM-16
Список используемой литературы:
1.Бакке А. В. "Лекции по курсу: Системы и сети
связи с подвижными объектами"
2. http://omoled.ru/publications/view/840
3. http://omoled.ru/publications/view/1057
4.http://omoled.ru/publications/view/848
5. http://omoled.ru/publications/view/850
6. http://omoled.ru/publications/view/996
7. Методические
указания к лаб. работе по спецификации 802.11а
8. http://omoled.ru/publications/view/995