1.5. Построение результирующих иерархических моделей терминала и выделенных узлов сети (в соответствии с концепцией OSI) с отражением путей доставки служебных, так и информационных сообщений.
Модель OSI описывает схему взаимодействия сетевых объектов, определяет перечень задач и правила передачи данных.
Эталонная модель OSI включает в себя семь уровней:- физический (Physical);канальный (Data-Link);
- сетевой (Network);
- транспортный (Transport);
- сеансовый (Session);
- представления данных (Presentation);
- прикладной (Application).
Рис. 1 – Иерархическая модель системы и пути доставки различных сообщений
Для выполнения задач поставленных перед разрабатываемой сетью, на основе эталонной модели синтезирована иерархическая модель узлов сети (рис. 1), включающая в себя следующие уровни:
- физический уровень;
- канальный уровень с двумя подуровнями: подуровень управления доступом к среде МАС и подуровень управления доступом к каналу САС;
- верхний уровень (уровень принятия решений).
2.1. Разработка и описание блок-схемы алгоритма модели.
Описание алгоритмов (рис. 2 и 3) представлены в виде соответствующих комментариев к коду программных модулей в п. 2.2.
Рис. 2 – Блок-схема алгоритма передачи пакета канального уровня
Рис. 3 – Блок-схема алгоритма приема пакета канального уровня
2.2. Разработка программных модулей передачи и приема сообщений канального уровня.
Программный модуль состоит из 6 частей (и тестового сообщения):
- start.m – файл настройки и запуска модуля, а так же в нем моделируется прохождение сообщения через канал связи и подсчет BER;
- high_sender.m – канальный уровень передатчика;
- phy_sender.m – физический уровень передатчика;
- phy_recipient.m – физический уровень приемника;
- high_recipient.m – канальный уровень приемника;
- makeOfdmFrame.m - функция для формирования OFDM-символа.



%%start.m
%== Программный модуль передачи/приема сообщений канального уровня ==%
clc
clear
load test_signal % Тестовый сигнал, подробнее - в high_sender.m
% Выбор модуляции профиля на основе проведенных р/и
% 0 - QAM-16
% 1 - QAM-64
mProfile = 1;
% Включение моделирования AWGN канала
% Первый бит - вкл./выкл. канала
% Второй бит - вкл./выкл. отображение реализации после AWGN
awgnFlag = [0 0];
% Соотношение сигнал/шум (дБ)
SN = 18;
% Включение подсчета BER
berFlag = 0;
% Включение расчета пик-фактора
pfFlag = 1;
high_sender;
phy_sender;
%% AWGN-канал
if awgnFlag(1) == 1
l1Frame_rcv = awgn( l1Frame, SN );
if awgnFlag( 2 ) == 1
figure( 2 );
plot( abs( l1Frame_rcv ) );
grid on
title( 'Временная реализация сообщения физического уровня (после AWGN)' )
end
else
l1Frame_rcv = l1Frame;
end
%% Приемник
phy_recipient;
high_recipient;
%% Подсчет BER по информационному блоку L2
if berFlag == 1
bitErrors = 0;
for i = 1:272
if L2_inf_block( i ) ~= L2_inf_block_rcv( i )
bitErrors = bitErrors + 1;
end
end
BER = bitErrors / 272
end
if pfFlag == 1
pF = max( abs( l1Frame ) ) / mean( abs( l1Frame ) )
end
%== Формирование пакета канального уровня ==%
% Полином CRC кода
poly = [ 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 ];
% Заполнение полей и сборка пакета
% Будем считать что в качестве передаваемой информации - закодированая
% в бинарном виде команда под номером 3
% Роль команды исполняет набор случайных символов
% Сгененированный с помощью randint( 1, 262 ) хранящийся в test_signal.mat
addr = [ 1 1 0 1 1 ];
L2_type = [ 0 0 1 1 ];
L2_number = [ 0 0 0 0 0 1 ];
L2_inf = [ test_signal ];
L2_fl = [ 1 0 1 0 1 ];
L2_inf_block = [ L2_type L2_number L2_inf ];
L2_crc = [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ];
L2_tail = [ 0 0 0 0 0 0 0 ];
% Если сообщение меньше предусмотреного в пакете L2 дополняем его нулями
if length( L2_inf ) < 262
nulls = zeros( 1, 262 - length( L2_inf ) );
L2_inf = [ L2_inf nulls ];
end;
% Расчет CRC
[ z, x ] = deconv( [ L2_inf_block L2_crc ], poly );
x = mod( abs( x ), 2 );
L2_crc = x( (end - length( L2_crc ) + 1):end );
% Формирование пакета
L2_msg = [ L2_fl L2_inf_block L2_crc L2_tail ]; % 300 бит
global noninfSubcarriers;
global Nc;
%% Канальное кодирование
% Помехоустойчивое кодирование
trell = poly2trellis( 7, [ 171 133 ] );
L2_msg_c = convenc( L2_msg,trell ); % 600 бит
% Перемежение
L2_msg_cai = randintrlv( L2_msg_c, 534 ); % 600 перемеженных бит
%% Модуляция (квадратурная и OFDM)
% Выбор модуляции
if mProfile == 0
mPos = 16;
ampPreamb = 3; % КУ усиления для выравнивания уровня преамбулы к данным
else
mPos = 64;
ampPreamb = 6; % КУ усиления для выравнивания уровня преамбулы к данным
end;
% Список не информационных поднесущих в OFDM-символе
noninfSubcarriers = [ 1 2 3 4 11 25 32 39 53 61 62 63 64 ];
% Размерность OFDM-символа
Nc = 64;
% Размер передаваемого сообщения
L2_msg_length = length( L2_msg_cai );
% Количество поднесущих с информацией
Nc_data = Nc - length( noninfSubcarriers ); % 51 поднесущая
% Количество бит на OFDM-символ
symbolLength = Nc_data * log2( mPos );
% Требуемое количество OFDM-символов
carrierCounter = floor( L2_msg_length / symbolLength ) + 1;
% Формирование блока незначащих битов (12-ть нулей)
symbolGarbage = zeros( 1, carrierCounter * symbolLength - L2_msg_length );
% Выбор типа модуляции для служебного символа (всегда QAM-16)
mParam = modem.qammod( 16 );
mParam.inputtype = 'bit';
mParam.SymbolOrder = 'gray';
mParam.PhaseOffset = 0;
% Формирование служебного символа
serviceMsg = zeros( 1, Nc );
% Информация о виде модуляции
serviceMsg( 1 ) = mProfile;
% Кол-во передаваемых пакетов (пока, увы, не реализованно)
% Поле только размечается
msgLength = [ 0 0 0 0 0 1 ];
serviceMsg( 2:7 ) = msgLength;
% Адрес
serviceMsg( 8:12 ) = addr;
% Квадратурная модуляция
IQ_service = modulate( mParam, serviceMsg' );
% Формирование OFDM символа
symbol = ifft( IQ_service );
% Cообщение канального уровня
data = L2_msg_cai;
% Выбор модуляции
mParam = modem.qammod( mPos );
mParam.inputtype = 'bit';
mParam.SymbolOrder = 'gray';
mParam.PhaseOffset = 0;
% Добавление незначащих битов (12-ть нулей)
data = [ data symbolGarbage ]';
% Квадратурная модуляция
IQ_signal = modulate( mParam, data );
% Формирование OFDM-символов и добавление служебного символа
[ mof, OS, OSf, OSp ] = makeOfdmFrame( IQ_signal, carrierCounter );
ofdmFrame = [ symbol' 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( 64 - 2 * 16 + 1:64 ) Preamb_longSymb Preamb_longSymb ];
%% Сборка сообщения физического уровня (усиление преамбулы чтобы выровнить ее уровень к уровню данных)
l1Frame = [ ampPreamb * Preamb_shortComplete (ampPreamb + 1) * Preamb_longComplete ofdmFrame ];
figure( 1 );
plot( abs( l1Frame ) );
grid on
title( 'Временная реализация сообщения физического уровня' )
%== Физический уровень приемника ==%
% Выделение преамбулы, сервисного поля и поля данных
Preamb_longComplete = l1Frame_rcv( 1:320 );
symbol_rcv = l1Frame_rcv( 321:( 321 + 15 ) );
ofdmFrame_rcv = l1Frame_rcv( ( 321 + 16 ):end );
IQ_service_rcv = fft( symbol_rcv' );
%% Демодуляция
% Настройка вида модуляции сервисного поля (всегда QAM-16)
mParam = modem.qamdemod( 16 );
mParam.SymbolOrder = 'gray';
mParam.PhaseOffset = 0;
mParam.OutputType = 'bit';
% Демодуляция сервисного поля
serviceMsg_rcv = demodulate( mParam,IQ_service_rcv );
mProfile_rcv = serviceMsg_rcv( 1 );
% Определение вида модуляции поля данных
if mProfile_rcv == 0
mParam = modem.qamdemod( 16 );
else
mParam = modem.qamdemod( 64 );
end;
mParam.SymbolOrder = 'gray';
mParam.PhaseOffset = 0;
mParam.OutputType = 'bit';
% Выполняем выделение OFDM символов из общего потока
IQ_signal_rcv = [];
% Список поднесущих с информацией
infSubcarriers = [ 5:10 12:24 26:31 33:38 40:52 54:60 ];
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 ); % Переход к частотной области
OSpr = [ OSpr; IQ_sign ];
IQ_signal_rcv = [ IQ_signal_rcv IQ_sign( infSubcarriers ) ]; %Формирование потока данных
end;
% Квадратурная демодуляция закодированного и перемеженного пакета L2
data_rcv = demodulate( mParam, IQ_signal_rcv );
%% Отображение СКС
figure( 3 );
plot( IQ_signal_rcv, 'x' );
grid on
title( 'Сигнально-кодовое созвездие принятого сигнала' )
%% Канальное декодирование
% Выделение кодированного и перемеженного пакета L2
L2_msg_cai_rcv = data_rcv( 1:end - length( symbolGarbage ) );
% Деперемежение
L2_msg_c_rcv = randdeintrlv( L2_msg_cai_rcv, 534 );
%Декодирование по Витерби
L2_msg_rcv = vitdec( L2_msg_c_rcv, trell, 7, 'cont', 'hard' );
%== Получение пакета канального уровня ==%
%% Выделение пакета L2
L2_msg_rcv = L2_msg_rcv( 8:end );
L2_fl_rcv = L2_msg_rcv( 1:length( L2_fl ) );
L2_inf_block_rcv = L2_msg_rcv(length(L2_fl)+(1:length(L2_inf_block)));
L2_crc_rcv = L2_msg_rcv(length(L2_fl)+length(L2_inf_block)+(1:length(L2_crc)));
%% Проверка пакета на наличие ошибок
[ z x ] = deconv( [ L2_inf_block_rcv L2_crc_rcv ], poly );
% Проверка остатка
x = mod( abs( x ), 2 );
if x == zeros( 1, length( [ L2_inf_block_rcv L2_crc_rcv ] ) )
'Сhecksum correct.'
else
'Сhecksum incorrect.'
end;
%% Выделение информационного блока (тип, номер сообщения, информация)
L2_type_rcv = L2_inf_block_rcv((1:length(L2_type)));
L2_number_rcv = L2_inf_block_rcv(length(L2_type)+(1:length(L2_number)));
L2_inf_rcv = L2_inf_block_rcv(length(L2_type)+length(L2_number)+(1:length(L2_inf)));
%== Функция для формирования OFDM-символа ==%
function [ ofdmFrame, OS, OSf, OSp ] = makeOfdmFrame( dataMod, Nofdm )
global noninfSubcarriers;
global Nc;
% Вектор для заполнения защитных интервалов и пилот-сигналов
noninfSequence = [ 0 0 0 0 1 -1 0 -1 1 0 0 0 0 ];
% Инициализация переменных
ofdmSymbol = [];
ofdmFrame = [];
indexOfnoninf = 1;
indexOfData = 1;
OS = [];
OSf = [];
OSp = [];
% Сборка OFDM-символов
for i = 1:Nofdm
% Сборка IQ-символов будущего OFDM-символа
for j = 1:Nc
if ( j == noninfSubcarriers( indexOfnoninf ) )
ofdmSymbol( j ) = noninfSequence( indexOfnoninf );
indexOfnoninf = indexOfnoninf + 1 ;
else
ofdmSymbol( j ) = dataMod( indexOfData );
indexOfData = indexOfData + 1;
end
end
indexOfnoninf = 1;
OSf = [ OSf; ofdmSymbol ];
ofdmSymbol = ifft( ofdmSymbol );
OS = [ OS; ofdmSymbol ];
OSp = [ OSp; fft( ofdmSymbol ) ];
% Формирование циклического префикса
cp = ofdmSymbol(Nc - Nc / 16 + 1:Nc );
% Добавление ЦП в начало OFDM-символа (32 IQ-символа)
ofdmSymbol = [ cp ofdmSymbol ];
% Сборка информационных OFDM-символов пакета физического уровня
ofdmFrame = [ ofdmFrame ofdmSymbol ];
ofdmSymbol = [];
end
end




На рисунках 7 и 8 можно наблюдать последствия не оптимального расчета OFDM-модуляции, а именно выбора параметров OFDM-символа. Изображенный пик (рис. 7 и 8) вызван добавление незначащих нулей в сообщение физического уровня. В ходе выполнения расчета физического уровня не удалось уменьшить количество незначащих нулей до нуля без изменения размера пакета канального уровня. После экспериментов с параметрами OFDM-символа, количеством поднесущих и др. количество не значащих битов было уменьшено до 12.
Пик-фактор (считается в start.m) для разных профилей модуляции:
- QAM-16: pF = 9,3888;
- QAM-64: pF = 4,5271.
2.3. Исследование процедуры тактовой (символьной) синхронизации физического уровня.
- обнаружение OFDM сигнала;
- настройка АРУ;
- частотная синхронизация.


При ОСШ = 18 дБ (рис. 13 и 14) CRC принятых сообщений не совпадают – сообщения приняты не правильно при обоих профилях передачи. BER для информационного блока L2 сообщения (считается в start.m):
- для QAM-16: 0,0074;
- для QAM-64: 0,0294.


Полученные значения BER не совпадают с теоретическими, полученными с помощью утилиты BER Tool, по следующим причинам:
- малое время передачи (недостаточное для более точной статистической оценки);
- при моделировании AWGN-канала не учитывалась мощность сигнала на 1 Ом (требуется для точного определения значения ОСШ).
- Исправленная часть 1. Локальная
радиосеть;
- Исправленная часть 2. Локальная радиосеть (канальный уровень);
- Исправленная часть 2. Локальная радиосеть (физический уровень);
- Подкопаева С.А. «Курсовой проект: Локальная радиосеть»;
- Генеральский Д.Д. «Курсовой проект: Радиосеть передачи данных. Часть 4»;
- Бакке А.В. «Уровни взаимодействия открытых систем. Базовая эталонная модель OSI», 2014;
- Бакке А.В. «Лекции по курсу: Системы и сети связи с подвижными объектами»;
- Бакке А.В. «Основы построения беспроводных сетей стандарта 802.11» – Рязань: РГРТУ, 2008;
- Functional specification «HIPERLAN Type 1» ETSI ETS 300 652.