Примечание: В ходе выполнения данной части был выявлен недостаток выполнения второй части работы, посвященной физическому уровню. В служебное поле сообщения физического уровня, следовало добавить 1 бит для определения типа сообщения (трафик или служебное/широковещательное). На основе этого "флага" и поля указывающего на размер сообщения в пакетах L2 на применой стороне предполагается расчет общей длинны сообщения, а так же определение размера одного пакета L2. Эта информация требуется для выделения пакетов L2 из общего информационного поля.
 
При рассмотрении данной работы прошу учесть, что в предыдущую часть [3], а именно в пункт 1.4.3, рисунок 5, внесены вышеуказанные изменения.
Спасибо.
 
1.5. Построение результирующих иерархических моделей терминала и выделенных узлов сети (в соответствии с концепцией OSI) с отражением путей доставки служебных, так и информационных сообщений.
 

 

Рис. 1 – Иерархическая модель системы

 

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

  • физический уровень (L1); 
  • канальный уровень (L2) с двумя подуровнями: подуровень управления доступом к среде МАС и подуровень управления доступом к каналу САС;
  • уровень управления сетевым соеденением (L3).
    Физический уровень – это самый нижний уровень системы, который отвечает за непосредственный передачу (прием) сигнала в (из) радиоканал(а). Основная задача уровня – достоверная передача потока битов, поступающего с верхнего, канального уровня, по средствам радиоканала физическому уровню другого узла сети. На этом уровне реализуются все механизмы направленные на оптимизацию и повышение эффективности процесса передачи битов.
    Канальный уровень отвечает за формирование пакетов стандартного вида, адресную доставку сообщений и контроль правильности приема. Здесь производится управление доступом к сети, обнаруживаются ошибки передачи. МАС-подуровень реализует набор протоколов, которые обеспечивают безопасность, маршрутизацию, энергосберегающие функции и обмен данными с протоколами вышележащих уровней. САС-подуровень описывает процедуру доступа к общему каналу связи. Сначала МАС-уровень формирует и передает  пакет L1 уровню САС. Уровень CAC начинает процедуру конкурентной борьбы и получения доступа к физическому каналу связи. В разрабатываемой сети доступ к КС осуществляется на основе протокола CSMA (см. пункт 1.3.2).
    Уровень принятия решений является управляющим ядром узла сети. Он обрабатывает  данные полученные с нижних уровней и принимает решения на основе анализа этих данных. Например, он обрабатывает данные радиоизмерений и передает на физический уровень команды о выборе профиля передачи и регулировки мощности. А так же, на ряду с пользовательским устройством, он может являться источником служебных сообщений.

            С уровня принятия решений на физический уровень поступают результаты радиоизмерений (профиль передачи и мощность излучения). От канального уровня на физический поступают пакеты L2 и количество этих пакетов в одном сообщении. Этот набор пакетов L2 проходит через следующие процедуры: канальное кодирование, IQ-модуляция, OFDM-модуляция и образует информационное поле сообщения физического уровня На основе профиля передачи, поступившего от L3, типа сообщения, извлеченного из первого пакета L2 и значения количества пакетов в сообщении ФУ, поступившего от L2, формируется служебное поле. Служебное и информационное поля объединяются с заранее сформированной (а так же записанной в память, по скольку она всегда имеет одинаковый вид) преамбулой и образуют полное сообщение физического уровня. Оно усиливается до необходимого уровня и излучается в радиоканал.


 2.1. Разработка и описание блок-схемы алгоритма модели. 

 

Описание алгоритмов (рис. 2-4), в особенности назначение некоторых условий, представлено в виде соответствующих комментариев к коду в п. 2.2.


 

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

 

 

Рис. 3 – Блок-схема моделирования прохождения сигнала через AWGN-канал с задержкой

 

 

Рис. 4 – Блок-схема приемной части модели 

 

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

 

Элемент сценария описываемый в модели представляет собой передачу сообщения трафика между терминалом и точкой доступа. В ответ на получение сообщения точка доступа формирует ARQ-отчет, в котором сообщает о правильном\не правильном приеме сообщения. В случае не правильного получения сообщения точкой доступа терминал повторяет передачу. Если первичная попытка передачи осуществлялась с помощью профиля QAM-16 и была провальной, профиль передачи меняется на более помехоустойчивый - QPSK. 

В модели присутствует возможность регулирования ОСШ в КС (переменная SN) и количества попыток после которого считается что сообщения передать не удалось (переменная iMax). По умолчанию эти значения равны 15 и 5. А так же, имеется возможность включения/отключения вывода в консоль результатов радиоизмерений (флаг rMeasure): мощности принятого сигнала и максимального СКО среди символов принятого СКС и включения/отключения отображения графиков при работе ФУ (флаг showImg).

Программный модуль состоит из Matlab-функций имитирующих работу ФУ и КУ, функции предназначенной для непосредственного формирования OFDM-символов, функции для определения максимального СКО среди символов СКС принятого сигнала, а так же скрипта отражающего часть сценария работы сети, а именно - передача псевдослучайного сообщения трафика (состоящего из одного пакета) от терминала к точке доступа.

  • start.m – часть сценария работы сети, частично затрагивает работу канального уровня сети;
  • l2_func.m – функция отражающая работу канального уровня системы;
  • phy_lvl.m функция отражающая работу физического уровня системы;
  • makeOfdmFrame.m функция для формирования OFDM-символа;
  • IQ_maxSKO.m функция для определения максимального СКО среди символов СКС принятого сигнала.
    Настройка работы модуля производится в файле start.m (см. соответствующие комментарии).
    Пример работы модуля (QAM-16, ОСШ 11 дБ, iMax = 5, rMeasure = 1, showImg = 0) приведен на рисунке 5. Программный модуль формирует пакеты L2 и сообщение физического уровня согласно структурам (рис. 6-9) из предыдущих частей КР.
 Рис. 5 – Пример работы модуля (консоль Matlab)
 Рис. 6 – Пакет сообщения трафика канального уровня
 
 
  Рис. 7 – Пакет служебного сообщения канального уровня
 
  
Рис. 8 – Сообщение физического уровня
 
 
Рис. 9 – Структура сигнала
 
Листинг функции физического уровня
 
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 - QAM-16
% SN - ОСШ в КС, SN = 0 - моделирование прохождения через КС отключено
% img - показ графиков, 0 - выкл. 1 - вкл.
% rMeasure - вывод в консоль данных радиоизмерений на ФУ, 0 - выкл. 1 - вкл.

%== Физический уровень передатчика ==%

    global noninfSubcarriers;
    global Nc;
    global ampPilot;
    trell = poly2trellis( 7, [ 171 133 ] );
    errorFlag = 0;
% Список не информационных поднесущих в OFDM-символе
    noninfSubcarriers = [ 1 2 3 4 5 12 26 39 53 60 61 62 63 64 ];
% Размерность OFDM-символа
    Nc = 64;
% Определяем типа пакетов L2
    if all( L2_msgs( 6:9 ) == [ 0 0 0 0 ] )
        msgType = 0;
    else
        msgType = 1;
    end
    
%% Формирование служебного поля
% Выбор типа модуляции для служебного символа (всегда QPSK)

    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, 6 );
    for i = 1:6
        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 = 4;
        mParam = modem.pskmod( mPos );
        ampPreamb_short = 0.75; % КУ усиления для выравнивания уровня преамбулы к данным
        ampPreamb_long = 1; % КУ усиления для выравнивания уровня преамбулы к данным
        ampPilot = 2; % КУ для пилот сигнала
    else
        mPos = 16;
        mParam = modem.qammod( mPos );
        ampPreamb_short = 3; % КУ усиления для выравнивания уровня преамбулы к данным
        ampPreamb_long = 3; % КУ усиления для выравнивания уровня преамбулы к данным
        ampPilot = 4; % КУ для пилот сигнала
    end;
        
%% Работа над пакетами L2
% Определяем размер пакета L2 исходя из его типа

    if msgType == 1
        packLength = 120;
    else
        packLength = 300;
    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

%% Модуляция (квадратурная и 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( 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' );

%% Демодуляция
% Настройка вида модуляции сервисного поля (всегда QPSK)
    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 = 16;
        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 = 240;
    else
       packLength_rcv = 600;
    end    
    
% Выполняем выделение OFDM символов из общего потока
    IQ_signal_rcv = [];
% Список поднесущих с информацией
    infSubcarriers = [ 6:11 13:25 27:38 40:52 54:59 ];
    pilotSubcarriers = [ 1 5 12 26 39 53 60 64 ];
    equSubcarrLine = 1:64;
    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( 8 ) = pilot_rcv( 7 );
        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
% Выделение кодированного и перемеженного пакета 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, 300 ); % "мусор"
        msgType_rcv = 0;
        msgCount_rcv = 1;
    end

end

        В ходе выполнения программного модуля были получены некоторые иллюстрации (рис. 10-12).
 

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

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


Рис. 12 – Интерполированная АЧХ канала связи (по оси абсцисс отложены номера поднесущих)
 
        Изображенная на рисунке 12 АЧХ канала связи получена путем выделения из поднесущих пилот-сигналов и их интерполяцией на все поднесущие. Полученный вектор используется для настройки эквалайзера (п. 1.4.2), который "выравнивая" принятый сигнал позволяет верно демодулировать его при меньших значениях ОСШ, что немного увеличивает общую эффективность системы.

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

 

        В ходе моделирования прохождения сигнала по каналу связи к нему добавляется псевдослучайная (от 0 до 200 отсчетов) задержка, это приводит к тому, что приемная часть не знает точного времени прихода OFDM-сигнала. Процесс синхронизации в коде модели представляет собой процесс обнаружения OFDM-сигнала с помощью скользящего по сигналу окна размером 320 отсчетов (как и преамбула) и последующего определения минимума СКО между окном и преамбулой
        Сначала составляется массив всех окон принятого сигнала длинной 320 отсчетов (длинна преамбулы). Для каждого элемента этого массива находится СКО двух блоков: окна и преамбулы. Потом из полученной выборки находится наименьшее значение СКО (рис. 13), свидетельствующее о полном приеме преамбулы в окне с началом в точке минимума - следовательно, отложив от этой точки 320 отсчетов можно найти начало служебного, а значит и информационного поля сообщения.
%% Синхронизация
% Подготовка окна   
    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;
 
 Рис. 13 – Минимумы СКО для всех окон размером 320 отсчетов
 
2.4. Исследование качества приема сообщений по различным каналам связи.
 
    Для исследования прохождения сообщения по каналу связи в программном модуле присутствует возможность включения моделирования AWGN-канала. 

    Пронаблюдаем прохождения сообщения по каналу связи для различных условий в канале. При ОСШ = 20 дБ (рис. 14 и 15) сообщения приняты правильно при обоих профилях передачи.  
 
 
Рис. 14 – СКС принятого сигнала при ОСШ = 20 дБ и модуляции QPSK

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

    Постепенно снижая ОСШ найдем для каждого профиля модуляции такое значение ОСШ, при котором начинают появляться ошибки. Исследование показало что это значение равняется 5 дБ для QPSK (рис. 16) и 12 дБ для QAM-16 (рис. 17).
 
 
Рис. 16 – СКС принятого сигнала при ОСШ = 5 дБ и модуляции QPSK
 
 
Рис. 17 – СКС принятого сигнала при ОСШ = 12 дБ и модуляции QAM-16

Сравним полученные значения ОСШ и теоретически рассчитанные в пункте 1.4.7:.

Таблица 1. Сравнение ОСШ для разных профилей передачи

 

QPSK, дБ

QAM-16, дБ

Выигрыш QPSK, дБ

Теоретическое значение

7,42

11,3

3,88

Полученное

значение

6

13

7

По умолчанию в модели количество попыток передать сообщение равно 5. Установим профиль передачи на самый помехоустойчивый (QPSK) и, продолжая уменьшать ОСШ, найдем такое значение отношения сигнал-шум, при котором не удастся передать сообщение за 5 попыток (рис. 18). Полученное критическое значение ОСШ, при котором неудалось передать сообщение за 5 попыток, равняется 3 дБ.

 

 

Рис. 18 - Консоль Matlab при проведении эксперимента по передачи с малыми ОСШ

Выводы

Моделирование передачи пакета трафика канального уровня показало, что система может передавать сообщения даже при малых значениях ОСШ (п. 2.4), сопоставимых (см. таблицу 1) с теоретически полученными в пункте 1.4.7. Хотя, следует заметить во-первых: в п. 1.4.7 не учитывалось наличие эквалайзера (п. 2.2); во-вторых: в модели передавался всего один пакет L2, что не позволяло произвести достаточно точную оценку BER. Для моделирования передачи нескольких пакетов L2 требуется внесение изменений в код канального и верхнего уровней системы [4] (код физического уровня подготовлен к приему/передачи сообщений из нескольких пакетов L2). 

Пункт 2.3 показал работоспособность выбранного метода обнаружения OFDM-сигнала, так как даже при малых значениях ОСШ сигнал удавалось обнаружить (п. 2.4).

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