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

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

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


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

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

 

%%% -----Передатчик----- %%%

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

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

Формирование поля DATA (рис. 2).

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

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

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

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

PTYPE  = [1 1 1 1]; % 4 бит

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

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

 

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

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

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

DATA = [ADD_RECEVIER ADD_TRANSMITTER PTYPE NOMBER USRDATA] % 278 бит

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]; % 306 бит

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

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

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_signal, ns);

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

 

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

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

 

%%% Приемник %%%

% Выделение преамбулы, служебной информации и поля данных + 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);

codMSGL2r = datar(1:end - length(fil_zero));


Рис.30. Созвездие BPSK сигнала после обратного преобразования OFDM при ОСШ=25 дБ .


Рис.31. Созвездие QAM-16 сигнала после обратного преобразования OFDM при ОСШ=25 дБ.

 

При построении сигнально-кодовых созвездий (рис.3) были выбраны минимальные значения ОСШ, при которых не возникают ошибки.

 

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

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

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

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

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

 

Продемонстрируем результаты работы модели. После запуска программы в командном окне среды MATLAB, появится сообщение, которое передается по каналу разрешенного доступа AGCH терминалу.

 

Модуляция BPSK, ОСШ = 25 дБ:

ans =

 

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

 

 

ans =

 

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

Модуляция QAM-16, ОСШ = 25 дБ:

ans =

 

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

 

 

ans =

 

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



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

 

1.А.В. Бакке. «Лекции по курсу ССПО»

2.Скляр Б. «Цифровая связь. Теоретические основы и практическое применение».- М.: Вильямс, 2003г.

3.Феер К. «Беспроводная цифровая связь», пер. с англ./под ред. В.И. Журавлева, М.: Радио и связь, 2000 г.

4Локальная радиосеть. Часть 1.1-1.5 Савко В.В.

КП "Локальная радиосеть". Часть 2 Савко В.В.

6.КП "Локальная радиосеть".Часть 3 Савко В.В.

7.КП "Локальная радиосеть". Часть 4. Калинкин В.В.

8.КП на тему "Локальная радиосеть" п. 2 - п.3 (часть №4) Ночная Анна

9Исходный код модели