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

В разрабатываемой сети используются три нижних уровня взаимодействия модели OSI: физический, канальный и сетевой.

 Канальный уровень делится на 2 подуровня:  

1.      RLC – уровень, отвечающий за взаимодействие с уровнем L3.  

2.      MAC – службы, отвечающие за сообщения канального уровня. Он оформляет пакеты в кадры в соответствующем формате. Пакеты как трафика, так и служебных сообщений.  

 

Рис.1 Модель OSI на примере взаимодействия терминала с ТД.

 Канальные уровни имеют лишь косвенное взаимодействие, в отличие от физических. Подуровень RLC может взаимодействовать с физическим, минуя MAC, при проведении радиоизмерений.

 К основным задачам, выполняемым на физическом уровне, относится сформирование необходимого для L2 уровня количества типа ФК, и обеспечение достоверной доставки битов по назначению.

 Для выполнения задачи достоверной доставки применяются меры:

·         синхронизация;

·         помехоустойчивое кодирование;

·         модуляция;

·         эквалайзинг.

 На Рисунке 2 представлена результирующая иерархическая модель сети в соответствии с концепцией OSI.


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

Физический уровень – это самый нижний уровень системы, который отвечает за непосредственный передачу (прием) сигнала в (из) радиоканал(а). Основная задача уровня – сформировать необходимое для L2 уровня количество/тип ФК и обеспечить достоверную доставку битов по назначению

    Канальный уровень отвечает за формирование пакетов стандартного вида, адресную доставку сообщений и контроль правильности приема. Здесь производится управление доступом к сети, обнаруживаются ошибки передачи. 

    Уровень принятия решений является управляющим ядром узла сети. Он обрабатывает  данные полученные с нижних уровней и принимает решения на основе анализа этих данных. Например, он обрабатывает данные радиоизмерений и передает на физический уровень команды о выборе профиля передачи и регулировки мощности. А так же, на ряду с пользовательским устройством, он может являться источником служебных сообщений.

            С уровня принятия решений на физический уровень поступают результаты радиоизмерений (профиль передачи и мощность излучения). От канального уровня на физический поступают пакеты L2 и информация об их количестве. Пакеты L2 проходят через следующие процедуры: канальное кодирование, квадратурная модуляция. Далее образуется информационное поле сообщения физического уровня. 

             Буфер накопления пакетов L2 предназначен для накопления нескольких пакетов, чтобы между потоком пакетов разместить служебное поле для корректировки правильности действий на приемной стороне.

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

              Для физического уровня разделения на служебные сообщения и сообщения трафика не существует, принятые сообщения будут подвергаться одинаковым преобразованиям.

 

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

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

На рисунке 2 и рисунке 3 представлены блок схемы алгоритмов передающей и приемной части системы, основанные на алгоритмах , проработанных во второй части (физический уровень).

 


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



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

             Передающая часть модели.

Сначала происходит определение параметров профиля передачи, таких как: мощность передачи, тип модуляции и др. Далее происходит формирования служебного поля, выбор вида модуляции и кодирование служебного поля. Служебное поле всегда модулируется QPSK для лучшей защищенности. После того как служебное поле закодировано начинается цикл канального кодирования каждого L2 пакета и их накопление для последующих преобразований. Дальше происходит квадратурная модуляция, которая выбирается в зависимости от флага (если флаг равен нулю, то QPSK модуляция, если нет - PSK-8).

Приемная часть модели.

При приеме сообщения сначала происходят определение преамбулы, первичные радиоизмерения и выделение полей сообщения и преамбулы. Далее  происходит квадратурная демодуляция и канальное декодирование служебного поля  и извлечение из него информации о профиле передачи, типе сообщения и количестве пакетов L2. Затем  начинается настройка фильтра эквалайзера


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

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


Рис.5 Структура сообщения на выходе передатчика.


         Рис.6 Пример работы модуля.

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

% Выбор файла для сохранения сформированного сигнала

set.SignalFileName = 'signal.bin';

 % Кодировка символа текста: 2 байта на символ

set.sym_size = 2;

% Длина однократно считываемого текстового сообщения

set.Str_size = 14;

% Смещение указателя чтения символа из файла на заданную величину

set.byte_off = 0;

% параметры модели

% профиль передачи

set.mProf;

% позиционность модуляции - QPSK

set.mPos = 4;

% Параметры помехоустойчивого кодека кодека

% Для примера используется линейный блоковый код Хэмминга:

% Длина кодового слова n = 2^m-1 = 255 при m = 8

% Размер кодируемого блока k = n-m = 247

set.m = 8;

set.n = 2^set.m-1; % Codeword length = 255

set.k = 247; % Message length = 247

% размер блока символов, формируемых в модуляторе из одного пакета

% 256 - количество битов в пакете,log2(mPos) - количество битов,

% приходящихся на символ

set.mod_size = 276/log2(set.mPos);

% Параметры CRC

set.poly=[1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0];

[set.x set.y]=size(set.poly); %размерность полинома

% переменная, равная длине передаваемого сообщения 2 уровня

set.length_msg_Lev2 = 134;% сообщение состоит из 134 битов

 

% установка параметров модели

st=initSettings();

% Открытие файла на запись и получение его идентификатора

% В этот файл будет записываться сигнал с выхода канала связи

global noninfSubcarriers;

global Nc;

global ampPilot;

% Определяем тип пакетов L2

[fidw, message] = fopen(st.SignalFileName, 'wb');

 if all(L2_msgs(6:9) == [ 0 0 0 0 ])

        msgType = 0;

    else

        msgType = 1;

 end  

%формирование msg

msg=randi(2,1,128)-1;

%% Подготовка к передаче сообщения

   % сообщение переводится в двоичный вид

    str_bin = msg;

    % получение адреса терминала в двоичном 3-х разрядном виде (Address=5)

   % получение кода услуги в двоичном 3-х разрядном виде

   addr_bin = my_de2bi(5,'left_msb',3);

   cod_bin = my_de2bi(1,'left_msb',3);

   % сборка части L2-сообщения

   msg_Lev2 = [ cod_bin addr_bin str_bin];

   % получение CRC кода

   m=[msg_Lev2 zeros(1,st.y-1)]; %вставка нулей в поле CRC

   [q r] = deconv(m,st.poly); % поиск частного и остатка от деления

   %информационной части на порождающий полином CRC кода

   r = mod(abs(r),2);

   CRC = r(134 + 1:end);%расчет CRC

   % сборка сообщения L1

   msg_Lev1 = [msg_Lev2 CRC];

   %формирование trx

   trx = [msg_Lev1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ………0];

   %% Помехоустойчивое кодирование

   code_word = encode(trx,st.n,st.k,'hamming/binary');

   %После помехоустойчивого кодирования должна выполнятся функция перемежения

   code_word = code_word;

   % добавление дополнительного бита с целью приведения итогового блока к

   % величине, кратной степени 2

   code_word = [0 code_word];

   %формирование эквалайзера

   eqlz=[randi(2,1,10)-1];

   %формирование флагов начала и конца сообщения

   fls = [ 1 1 1 1 1 ];

   %сборка code_word

   code_word = [fls code_word eqlz fls]';

   %% Модуляция

   h = modem.pskmod(st.mPos);

   % h - модем PSK с позиционностью mPos

   % Требуется настроить остальные его параметры:

   % Параметры модуляции

   h.inputtype = 'bit';

   h.SymbolOrder = 'gray';

   h.PhaseOffset = pi/4;

   % собственно модуляция

   IQ_signal = modulate(h, code_word);

   %% Определение профиля передачи

    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;

   % Наложение шума на сигнал

   noise_sgn = awgn(IQ_signal,40);

   % Наложение шума на сигнал

   noise_sgn = awgn(IQ_signal,40);

   % отображение сигнально-кодового созвездия

   figure(10);

   plot(noise_sgn,'.');

   % закрытие файла

   fclose (fidw);

 

% установка параметров модели

st = initSettings();

% инициализация переменной, в которой будет сохраняться принимаемое

% сообщение

R_message = '';

i=sqrt(-1);

error = 0;

% Синхронизация

% Подготовка окна   

    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 );

% Параметры демодуляции

h = modem.pskdemod(st.mPos);

h.SymbolOrder = 'gray';

h.PhaseOffset = 0;

h.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 );

% Определение профиля передачи поля данных

    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 ) ];

% Квадратурная демодуляция закодированного и перемеженного пакета L2

data_rcv = demodulate( mParam, IQ_signal_rcv );

% Определяем максимальное СКО среди IQ-символов

[ maxSKO ] = IQ_maxSKO( IQ_signal_rcv, data_rcv, mPos_rcv );

% определение максимума функции корреляции flag_timing  

[Ymax, Xmax] = max(flag_timing);

% Рассчитываем ожидаемую длинну информационного поля

infoLength_rcv = ( packLength_rcv * msgCount_rcv );

% Рассчитываем фактически принятую длинну информационного поля

 data_size_rcv = size( data_rcv );

 dataLength_rcv = data_size_rcv( 1 ) * data_size_rcv( 2 );

 for k=1:rx_packet

% Организуется цикл чтения данных размером st.mod_size байт

% из файла до тех пор, пока не будет достугнут конец файла

   noise_sgn = rx_signal(rx_start+(k-1)*st.mod_size:rx_start+k*st.mod_size)';

   % демодуляция

   s = demodulate(h,noise_sgn);

    %% Помехоустойчивое декодирование

    L2_msgs_rcv = [];  

    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

%декодирование L2-сообщения

% Подготовка к проверке CRC

   [q r]=deconv(received_mes_L1,st.poly);

   %проверка остатка

   r=mod(abs(r),2);

   if r == zeros(1,length(received_mes_L1))'

        detect=0;% ошибок нет

   else

        error = error + 1;

        detect=1;% обнаружены ошибки

   end

   % В 1 пакете сессии доставки передается служебная информация (количество передаваемых блоков данных)

   if k==1

       packet_count = my_bi2de(received_mes_L2(8:23)','left_msb');

       % если сообщение принято с ошибкой, то доверия к выделенному блоку

       % битов нет: вероятнее всего блок битов received_mes_L2(8:23)

       % недостоверный

       if detect ==1

           packet_count = rx_packet;

       end;   

   else

       if k < packet_count +1

           % Извлечение принимаемого сообщения (в двоичном виде)

           txt_mesage = received_mes_L2(8:length(received_mes_L2))';

        

           % накопление частей принятого сообщения в переменной R_message

           R_message = [R_message txt];

        end;   

   end;   

   end;% окончание буфера приема  


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

         Сначала составляется массив всех окон принятого сигнала длинной  320 отсчетов (длина преамбулы). Для каждого элемента этого массива находится СКО двух блоков: окна и преамбулы. Потом из полученной выборки находится наименьшее значение СКО рисунок 10, свидетельствующее о полном приеме преамбулы в окне с началом в точке минимума - следовательно, отложив от этой точки 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 );


Рис.7 минимумы СКО.

2.4. Исследование качества приема сообщений по различным каналам связи.

Для исследования прохождения сообщения по каналу связи в программном модуле присутствует возможность включения моделирования AWGN-канала.  

    Пронаблюдаем прохождения сообщения по каналу связи для различных условий в канале при ОСШ = 20 дБ. 


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


Рис.9 СКС принятого сигнала при ОСШ = 20 дБ и модуляции PSK-8.

Постепенно снижая ОСШ, найдем для каждого профиля модуляции такое значение ОСШ, при котором начинают появляться ошибки. В результате получаем 10 дБ для QPSK рисунок  и 11 дБ для PSK-8 рисунок.


Рис.10  СКС принятого сигнала при ОСШ = 10 дБ и модуляции QPSK.


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

В процессе уменьшения ОСШ было получено критическое значение равное 3дБ, при котором сообщение  с наиболее помехоустойчивой модуляцией (QPSK) не удалось передать.

Если сравнить полученные экспериментально значения ОСШ разных профилей модуляции с теоретическими значениями, полученными  в пункте 1.6.7 расчета физического уровня системы, то получим выйгрыш в отношении сигнал/шум в 2 раза в ходе выполнения программных модулей. Это отличие состоит в том, что моделировалась передача нескольких пакетов L2 уровня, что позволило провести более точные расчеты.

Список использованной литературы:

1. Бакке А. В. "Лекции по курсу: Системы и сети связи с подвижными объектами".

2. http://omoled.ru/publications/view/1052

3. http://omoled.ru/publications/view/354