1.5. Построение результирующих иерархических моделей терминала и выделенных узлов сети (в соответствии с концепцией OSI) с отражением путей доставки служебных, так и информационных сообщений.

 

Модель OSI описывает схему взаимодействия сетевых объектов, определяет перечень задач и правила передачи данных.

Эталонная модель OSI включает в себя семь уровней:
  • физический (Physical);канальный (Data-Link);
  • сетевой (Network);
  • транспортный (Transport);
  • сеансовый (Session);
  • представления данных (Presentation);
  • прикладной (Application).

  

Рис. 1 – Иерархическая модель системы и пути доставки различных сообщений

 

    Для выполнения задач поставленных перед разрабатываемой сетью, на основе эталонной модели синтезирована иерархическая модель узлов сети (рис. 1), включающая в себя следующие уровни:

  • физический уровень; 
  • канальный уровень с двумя подуровнями: подуровень управления доступом к среде МАС и подуровень управления доступом к каналу САС;
  • верхний уровень (уровень принятия решений).
    Физический уровень – это самый нижний уровень системы, который отвечает за канальное кодирование и модуляцию передаваемой информации, во время передачи и за обратный процесс во время приема. Здесь же определяются требования к соединениям, разъёмам, электрическому согласованию, заземлению, защите от помех. 
    Канальный уровень также называется уровень управления линией передачи, отвечает за формирование пакетов стандартного вида. Здесь производится управление доступом к сети, обнаруживаются ошибки передачи. 
    МАС-подуровень реализует набор протоколов, которые обеспечивают безопасность, маршрутизацию, энергосберегающие функции и обмен данными с протоколами вышележащих уровней. САС-подуровень описывает процедуру доступа к общему каналу связи. 
    Сначала МАС-уровень формирует и передает  пакет L1 уровню САС. Уровень CAC начинает процедуру конкурентной борьбы и получения доступа к физическому каналу связи. В разрабатываемой сети доступ к КС осуществляется на основе протокола CSMA (см. пункт 1.3.2).
    Уровень принятия решений является управляющим ядром узла сети. Он обрабатывает  данные полученные с нижних уровней и принимает решения на основе анализа этих данных. Например, он обрабатывает данные радиоизмерений и передает на физический уровень команды о выборе профиля передачи и регулировки мощности. 
    Пути доставки сообщений различного вида так же отображены на рисунке 1. 
    Сообщение трафика начинает формироваться на MAC-подуровне на основе структуры, указанной в пункте 1.3.7, и информации, пришедшей через физический уровень от пользовательского устройства. Сформированный пакет L2 уровня передается на CAC-подуровень, который формирует сообщение RACH и начинает процедуру конкурентной борьбы за физический канал связи через физический уровень (прослушивание канала и т.д. согласно пункту 1.3.2). После победы в конкурентной борьбе CAC-подуровень передает пакет L2 физическому уровню, который преобразует его в сообщение физического уровня согласно алгоритму, описанному в пункте 1.4.9. Это сообщение посредствам радиоканала передается на физический уровень другого узла связи. Из сообщения физического уровня на применой стороне выделяется пакет L2, который передается на MAC-уровень. MAC-уровень проверяет целостность пакета и отчитывается об это верхнему уровню, который формирует в ответ сообщение о доставке. В случае правильного приема MAC-уровень выделяет информационную часть пакета L2 и передает ее через физический уровень пользовательскому устройству. 
    Путь служебного сообщения зависит от того, что было источником этого сообщения: пользователь (например, первичная регистрация в сети) или сам терминал (например, выбор профиля модуляции на основании радиоизмерений). Если автором какой-либо команды терминалу был пользователь, то она, проходя через физический уровень пользовательского устройства и терминал, через MAC-уровень терминала попадает на уровень принятия решений. На основании этой команды верхний уровень формирует сообщение и передает его MAC-подуровню. Далее, до MAC-подуровня узла-получателя сообщение проходит схожий путь с сообщением трафика. На MAC-подуровне сообщение, в зависимости от типа, передается на уровень принятия решений и на пользовательское устройство (например, подтверждение регистрации) или только на уровень принятия решения (например, сообщение AGCH). Верхний уровень анализирует принятое сообщение и, если требуется, выполняет указанные в нем команды.

 

 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-символа.
    Программный модуль формирует пакеты L2 и сообщение физического уровня согласно структурам (рис. 4-6) из предыдущих частей КР.
 
 Рис. 4 – Пакет канального уровня
  
Рис. 5 – Кадр физического уровня
 
Рис. 6 – Структура поднесущих
 
%%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
 %======END=OF=FILE======%
%% high_sender.m
%== Формирование пакета канального уровня ==%


% Полином 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 бит
 %======END=OF=FILE======%
 
%% phy_sender.m
%== Физический уровень передатчика ==%
    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( 'Временная реализация сообщения физического уровня' )

  
%======END=OF=FILE======%
%% phy_recipient.m
%== Физический уровень приемника ==%

%% Выделение полей
% Выделение преамбулы, сервисного поля и поля данных
    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' );
 %======END=OF=FILE======%
%% high_recipient.m
%== Получение пакета канального уровня ==%
%% Выделение пакета 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)));
%======END=OF=FILE======%
%% makeOfdmFrame.m
%== Функция для формирования 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 
%======END=OF=CODE======% 
    В ходе выполнения программного модуля были получены несколько иллюстраций (рис. 7-10).

Рис. 7 – Временная реализация сообщения физического уровня для QAM-16

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


Рис. 9 – Сигнально-кодовое созвездие принятого сигнала для QAM-16


Рис. 10 – Сигнально-кодовое созвездие принятого сигнала для QAM-64
 

На рисунках 7 и 8 можно наблюдать последствия не оптимального расчета OFDM-модуляции, а именно выбора параметров OFDM-символа. Изображенный пик (рис. 7 и 8) вызван добавление незначащих нулей в сообщение физического уровня. В ходе выполнения расчета физического уровня не удалось уменьшить количество незначащих нулей до нуля без изменения размера пакета канального уровня. После экспериментов с параметрами OFDM-символа, количеством поднесущих и др. количество не значащих битов было уменьшено до 12.

Пик-фактор (считается в start.m) для разных профилей модуляции:

  • QAM-16: pF = 9,3888;
  • QAM-64: pF = 4,5271.


2.3. Исследование процедуры тактовой (символьной) синхронизации физического уровня.

 

    Процесс синхронизации узлов связи по времени и частоту ложится на преамбулу сообщения физического уровня (по аналогии с IEE 802.11a) которая состоит из 12 символов, 10 из  которых — «короткие», а два - «длинные». В коротких последовательностях OFDM-символы формируются на основе лишь 12 поднесущих, при этом отсутствуют защитные интервалы между символами. Короткие настроечные  последовательности  используются  для выполнения следующих задач:
  • обнаружение OFDM сигнала;
  • настройка АРУ;   
  • частотная синхронизация.
       Две  длинные  настроечные  последовательности  следуют  за  короткими с промежутком в два защитных интервала. Основная задача, выполняемая с помощью длинных последовательностей – временная синхронизация.
 
2.4. Исследование качества приема сообщений по различным каналам связи.
 
    Для исследования прохождения сообщения по каналу связи в программном модуле присутствует возможность включения моделирования AWGN-канала. 

    Выставим флаг awgnFlag = 1 и пронаблюдаем прохождения сообщения по каналу связи для различных условий в канале.При ОСШ = 20 дБ (рис. 11 и 12) CRC принятых сообщений совпадают – сообщения приняты правильно при обоих профилях передачи.  
 
 
Рис. 11 – СКС принятого сигнала при ОСШ = 20 дБ и модуляции QAM-16

 
Рис. 12 – СКС принятого сигнала при ОСШ = 20 дБ и модуляции QAM-64


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

Полученные значения BER не совпадают с теоретическими, полученными с помощью утилиты BER Tool, по следующим причинам:

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