3. Экспериментальная часть. 3.1. Разработка модели в среде Matlab, демонстрирующей пример передачи сообщений между объектами верхнего уровня.
Произведем передачу текстового сообщения по каналу трафика с помощью экспериментальной модели.
В модели реализована передача текстового сообщения, передаваемого по каналу трафика от  терминала к точке доступа.
Терминалу необходимо передать короткое текстовое сообщение .Сначала терминал вступает в конкурентную борьбу за канал , получив в свое распоряжения канал он начинает передачу точке доступа.Далее ТД отправляет подтверждение приема в случае успешной передачи, а уже в следующем кадре сама отправляет это сообщение адресату.
Профиль - QPSK (код Хэмминга 255/247) 

Рисунок 1. Структура передаваемого пакета.
T_ID = my_de2bi(45,'left_msb',7);% Получение адреса Т  в двоичном 7-и разрядном виде
P_type = my_de2bi(4,'left_msb',3); %получение типа пакета в двоичном 3-х разрядном вид
P_num=my_de2bi(1,'left_msb',7) %номер покета
DATA =[strtobin('текст коротко сообщения')'];  %заполнение поля DATA
if length(DATA)< 214
   zero_bits = zeros(1,214-length(DATA));  %дополнение нулями
   DATA=[DATA zero_bits];
end;
L2_msg = [T_ID P_type P_num DATA];% Сборка части L2-сообщения

poly=[1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0];% Полином CRC кода
% Поиск частного и остатка от деления
        % информационной части на порождающий полином CRC кода
[x y]=size(poly);                
m=[L2_msg zeros(1,y-1)];
[q r] = deconv(m,poly);
r = mod(abs(r),2);
CRC = r(length(L2_msg) + 1:end);

% Сборка сообщения
L1_msg = [L2_msg CRC];

enc_L1=encode(L1_msg,255,247,'hamming/binary');
% Добавление к сообщению нулевого бита с целью
%приведения длины сообщения к кратной степени 2
enc_L1 = [enc_L1 0]';
encl1=reshape(enc_L1,1,256)
%Блочное перемежение
intrlved_L1 = matintrlv(encl1, 8, 32);
  mPos=4; %QPSK
 
Ngr  = 0; % количество неиспользуемых поднесущих и приходящихся на защитные интервалы  
% номера пилотных поднесущих в OFDM-символе
pilotIndexes = [1 14 26 39 51 64];
%Размерность OFDM-символа
Nc=64;

%В качестве примера задан большой блок битов, для передачи которого
%потребуется несколько OFDM-символов  
msg_length = length(intrlved_L1);% длина передаваемого сообщения, битов

% количество поднесущих с данными
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
   h = modem.pskmod(2); % BPSK профиль
   h.inputtype = 'bit';
   h.SymbolOrder = 'gray';
   h.PhaseOffset = 0;
   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 = intrlved_L1;
 % выбор вида модуляции
   
       h = modem.pskmod(mPos); % QPSK профиль

   % Параметры модуляции
   h.inputtype = 'bit';
   h.SymbolOrder = 'gray';
   h.PhaseOffset = pi/4;
   % дополнение блока битов сообщения нулями до той величины, которую
   % способны транспортировать рассчитанное выше количество OFDM-символов
   data = [data fil_zero]';
   % собственно квадратурная модуляция
   IQ_signal = modulate(h, data);

   %формирование 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 5*long_trs 5*ofdmFrame];
% plot(abs(phy_frame));
%%% Канал передачи данных %%%
figure(1);
plot(abs(phy_frame));
chan_fr =awgn(phy_frame,15);

%%% Приемник %%%
% Выделение и поля данных
OfdmFramer =  chan_fr(385:end);
h = modem.pskdemod(4);
h.SymbolOrder = 'gray';
h.PhaseOffset = pi/4;
h.OutputType = 'bit';
% Выполняем выделение OFDM символов из общего потока
IQ_signalr = [];
% вектор, необходимый для устранения пилот сигналов
nopilotIndexes = [2:13 15:25 27:38 40:50 52:63];
OSr = [];
OSpr = [];
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');
rec_data = demodulate(h,IQ_signalr); %демодуляция
MSGL2r = rec_data(1:end - length(fil_zero));%удаление нулей
 code_word = matdeintrlv(MSGL2r,8,32);%деперемежние
  code_word = code_word(1:255);%удаление последнего 0
trx = decode(code_word, 255,247,'hamming/binary');%декодирование

received_mes_L1 = (trx(18:231)); %Подготовка к проверке CRC
[q r]=deconv(received_mes_L1,3);
%Проверка остатка
r=mod(abs(r),2);
if r == zeros(1,length(received_mes_L1));
detect=0;% ошибок нет
else
detect=1;% обнаружены ошибки
end;
%ID терминала-адресата
TID = my_bi2de(trx(1:7),'left_msb');
%Тип принятого пакета
pocket_type = my_bi2de(trx(8:10),'left_msb');
%номер принятого пакета
pocket_num = my_bi2de(trx(11:17),'left_msb');
%декодирование данных
DATA_r=(trx(18:231))
DATA_r=DATA_r(1:end - length(zero_bits));
text=bintostr(DATA_r);
 В результате моделирование было успешно получено и декодированно сообщение.При ОСШ < 12дб наблюдались ошибки.Были получены следующие диаграммы:
 
Рис.2. Временная реализация пакета физического уровня.

Рис.3. Созвездие QPSK сигнала после обратного преобразования OFDM.
Список используемой литературы:
  1. А.В. Бакке. «Лекции по курсу ССПО».
  2. Скляр Б. «Цифровая связь. Теоретические основы и практическое применение». - М.: Вильямс, 2003 г. 
  3. Тема 3. Локальная радиосеть. Часть 3.
  4. Тема 3. Локальная радиосеть. Часть 2.
  5. Тема 3. Локальная радиосеть. Часть 1.
  6. OFDM модулятор.
  7. КП на тему "Локальная радиосеть" п. 2 - п.3 (часть №4) 
  8. Система сбора данных с подвижных станций. Часть 4.
  9. Исходный код модели