2. Экспериментальная часть

2.1. Разработка модели системы в среде Matlab, демонстрирующей пример передачи сообщений между объектами верхнего уровня.


Рис. 27 Структура передаваемого пакета

Передающая часть:

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

mod_type = 0; % 0 -> BPSK , 1-> QAM-16

 

Формирование поля данных:

% Формирование пакета канального уровня

% Заполнение поля данных

ADD_RECEVIER    = [1 1 0 0 1 ]; % 5 бит

ADD_TRANSMITTER    = [1 0 1 0 1 ]; % 5 бит

PTYPE  = [1 1 1 ]; % 3 бит трафик

NUMBER  =[0 0 0 0 0 0]; % 6 бит

USRDATA =[strtobin('ТЕРМИНАЛ №.. ПРИГОТОВЬТЕСЬ К ПРИЕМУ!')']; % 256 бит

 

Формирование пакета физического уровня:

% Формирование окончательного пакета

FL   = [1 0 1 0 1]; % Флаг, 5 бит 

DATA = [ADD_RECEVIER ADD_TRANSMITTER PTYPE NUMBER USRDATA] % 275 бит

CRC  = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; % 16 бит

TAIL =  [0 0 0 0 0 0 0]; % 7 бит

% Заполнение поля CRC

[q,r] = deconv([DATA CRC],poly);

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

CRC   = r(end-length(CRC)+1:end);

% Формирование пакета физического уровня

MSGL2 = [FL DATA CRC TAIL]; % 303 бит

 

Блок помехоустойчивого кодирования:

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

t = poly2trellis(7, [171 133]);

codMSGL2ni = convenc(MSGL2,t);

Перемежение.

% Перемежение

codMSGL2 = randintrlv(codMSGL2ni, 534);

 

Выбор модуляции

if mod_type == 0 % BPSK

    mPos = 2; % позиционность модуляции

else % QAM-16

    mPos = 16;

end;

Инициализация OFDM

Ngr  = 0; % количество неиспользуемых поднесущих и приходящихся на защитные интервалы 

% номера пилотных поднесущих в OFDM-символе

pilotIndexes = [1 14 26 39 51 64];%Размерность OFDM-символа

Nc=64;

%В качестве примера задан большой блок битов, для передачи которого

%потребуется несколько OFDM-символов 

msg_length = length(codMSGL2);% длина передаваемого сообщения, битов

% количество поднесущих с данными

Ndata = Nc - length(pilotIndexes); % 58 поднесущих

% количество битов, передаваемых в одном OFDM-символе

s_length = Ndata * log2(mPos); %

ns = floor(msg_length/s_length)+1; сколько потребуетсяOFDM-символов

% сколько потребуется добавить незначащих битов - как разница между тем

% количеством битов, что обеспечивает расчетное количество OFDM-символов, и

% количеством блоком в передаваемом сообщении

fil_zero = zeros(1, ns*s_length - msg_length);

% формирование символа, переносящего служебную информацию

% Информация о применяемом профиле модуляции BPSK

 

Формирование сервисного OFDM символа.

Вначале каждого сформированного OFDM-символа находится циклический префикс. Размер циклического префикса составляет 1/16 часть длины символа. Один OFDM-символ будет передаваться с использованием 58 поднесущих.

h = modem.pskmod(mPos); % BPSK профиль

h.inputtype = 'bit';

h.SymbolOrder = 'gray';

h.PhaseOffset = pi/2;

seqBarker = [0 0 0 1 1 1];

SERVMSG = zeros(1,Nc);

SERVMSG(pilotIndexes) = seqBarker; %Последовательность Баркера

SERVMSG(2) = mod_type; Информация о виде модуляции

IQ_SERV = modulate(h, SERVMSG');% Формирование OFDM символа

serv = ifft(IQ_SERV);% Cообщение канального уровня

data = codMSGL2;

 

Инициализация модулятора.

% выбор вида модуляции

   if mPos == 16

          h = modem.qammod(mPos); % QAM-16 профиль

   else           

       h = modem.pskmod(mPos); % BPSK профиль

   end;

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

  h.inputtype = 'bit';

   h.SymbolOrder = 'gray';

   h.PhaseOffset = 0;

   % дополнение блока битов сообщения нулями до той величины, которую способны транспортировать рассчитанное выше количество OFDM-символов

   data = [data fil_zero]';

 

Модуляция сигнала.

    % квадратурная модуляция

   IQ_signal = modulate(h, data);

   %формирование OFDM-символов и добавление символа, переносящего служебную информацию 

 

Формирование OFDM символов.

[mof,OS,OSf,OSp] = makeOfdmFrame(IQ_signalns);

ofdmFrame =[serv' mof];

 

 Формирование символов преамбулы. 

 %формирование символов преамбулы

 %Короткие символы - для подстройки частоты (синхронизация по частоте)

ShortTrainingSymbols = 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];

  short_symbols = ifft(ShortTrainingSymbols);% выделение первых 16 отсчетов

 Strs = short_symbols(1:16);% Формирование 10 коротких символов преамбулы на основе выбранного набора

 short_trs=[Strs Strs Strs Strs Strs Strs Strs Strs Strs Strs]; %длинный символ преамбулы для подстройки времени (синхронизация по времени)

 LongTrainingSymbols=[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];

 long_symbol = ifft(LongTrainingSymbols);

 long_trs = [long_symbol(64-2*16+1:64) long_symbol long_symbol]; % Пакет физического уровня (символы преамбулы и OFDM-символы)

phy_frame = [short_trs long_trs ofdmFrame];

plot(abs(phy_frame));Канал связи

figure(1);

plot(abs(phy_frame));


Рис. 28 Временные реализации пакетов физического уровня для BPSK


Рис. 29 Временные реализации пакетов физического уровня для QAM-16

Добавление белого гауссовского шума:

phy_framer =awgn(phy_frame,28);

 

Приемная часть

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

% Выделение преамбулы, служебной информации и поля данных + FEC

long_trs = phy_framer(1:320);

servr = phy_framer(321:384);

OfdmFramer =  phy_framer(385:end);

Демодуляция служебного символа.

% Обработка служебного сообщения с целью определения вида модуляции (BPSK, QAM-16)

IQ_SERVr = fft(servr');

h = modem.pskdemod(2);

h.SymbolOrder = 'gray';

h.PhaseOffset = 0;

h.OutputType = 'bit';

 

SERVMSGr= demodulate(h,IQ_SERVr);

mod_typer = SERVMSGr(2);

Принятие решения об использовании необходимого профиля.

if mod_typer == 1

    h = modem.qamdemod(16); % QAM-16 профиль

else           

    h = modem.pskdemod(2); % BPSK профиль

end;

Инициализация демодулятора.

h.SymbolOrder = 'gray';

h.PhaseOffset = 0;

h.OutputType = 'bit';

% Выполняем выделение OFDM символов из общего потока

IQ_signalr = [];

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

nopilotIndexes = [2:13 15:25 27:38 40:50 52:63];

OSr = [];

OSpr = [];

Обратное OFDM преобразование.

for i = 0 : (length(OfdmFramer)/68)-1

    убираем префикс   

    IQ_sig = OfdmFramer((5:68)+ i*68);

    OSr = [OSr; IQ_sig];  

    % переход к частотной области

    IQ_sign = fft(IQ_sig);

   

    OSpr = [OSpr; IQ_sign];

    % убираем пилот сигналы и Формируем поток данных

    IQ_signalr = [IQ_signalr IQ_sign(nopilotIndexes)];

end;

 

figure(3);

plot(IQ_signalr,'x');

Демодуляция сигнала.

datar = demodulate(h,IQ_signalr);


Рис. 30 Сигнально-кодовое созвездие для BPSK модуляции


Рис. 31 Сигнально-кодовое созвездие для QAM-16 модуляции

 

Полученные сигнально-кодовых построены при ОСШ=28 дБ

 

Деперемежение.

codMSGL2nir =  randdeintrlv(codMSGL2r,534);

 

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

MSGL2r = vitdec(codMSGL2nir,t,7,'cont','hard');

Выделение полей FL, DATA, CRC.

MSGL2r = MSGL2r(8:end);

FLr    = MSGL2r(1:length(FL));

DATAr  = MSGL2r(length(FL)+(1:length(DATA)));

CRCr   = MSGL2r(length(FL)+length(DATA)+(1:length(CRC)));

 

Проверка целостности принятого сообщения.

% Проверка пакета на наличие ошибок

 [q r]=deconv([DATAr CRCr], poly);% Проверка остатка

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

   if r == zeros(1,length([DATAr CRCr]))

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

        'Без ошибок!'

   else

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

        'Обнаружены ошибки!'

   end;

Выделение полей ADD_RECEVIER, ADD_TRANSMITTER, TYPE, NUMBER, MAINDATA.

ADD_RECEVIERr    = DATAr(1:length(ADD_RECEVIER));

ADD_TRANSMITTERr    = DATAr(1:length(ADD_TRANSMITTER));

PTYPEr  = DATAr(length(ADD_RECEVIER)+length(ADD_TRANSMITTER)+(1:length(PTYPE)));

NUMBERr = DATAr(length(ADD_RECEVIER)+length(ADD_TRANSMITTER)+length(PTYPE)+(1:length(NUMBER)));

USRDATAr= DATAr(length(ADD_RECEVIER)+length(ADD_TRANSMITTER)+length(PTYPE)+length(NUMBER)+(1:length(USRDATA)));

'ТЕРМИНАЛ №.. ПРИГОТОВЬТЕСЬ К ПРИЕМУ!!'

 

Результат работы модели можно наблюдать в командном окне MATLAB:

>> mainModule

DATA =….

ans =Битовые ошибки отсутствуют!

ans =ТЕРМИНАЛ №.. ПРИГОТОВЬТЕСЬ К ПРИЕМУ!!


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

  1. А.В. Бакке. «Лекции по курсу ССПО»
  2. КП "Локальная радиосеть".Часть 4