Целью данного этапа курсового проектирования является  построение и описание модели передачи сообщения логического канала случайного доступа (RACH), (Система сбора данных с подвижных станций. Часть 3 п.1.6.2.).
Сообщение случайного доступа формируется радиомаяком и затем посылается на точку сбора. В результате приема этого сообщения ТС должна определить дальнейший сценарий взаимодействия с РМ. Поэтому в рамках моделирования существует необходимость построения как передающей, так и приемной частей.
Передающая часть.
На первом этапе выполняется формирование пакета канального уровня, содержащего поле с указанием размера информационной части пакета, поле адреса, поле с указанием типа пакета, поле данных и поле контрольной суммы (Система сбора данных с подвижных станций. Часть 3. п.1.6.4.)

Рис.1. Структура сообщения канала случайного доступа RACH.
Сообщения канала RACH будут являться вторым типом сообщений в системе. В поле адреса указывается идентификатор ТС, полученный радиомаяком в результате приема широковещательного сообщения (BCCH). Поле DATA будет содержать код запрашиваемой радиомаяком услуги. В качестве CRC будет использовано CRC-12. Неотъемлемой частью пакета будет являться идентификатор (адрес) радиомаяка, делающего запрос (Система сбора данных с подвижных станций. Часть 3. п.1.6.1.).
Соответственно необходимо задать параметры каждого из полей. 
%% Формирование сообщения канального уровня
%Формируется сообщение канала случайного
%доступа RACH
% Получение длины информационной
%части пакета в двоичном 7-и разрядном виде   
L_inf = my_de2bi(40,'left_msb',7);

% Получение адреса ТС в двоичном 7-и разрядном виде 
ID_TC = my_de2bi(118,'left_msb',7);

% Получение типа пакета в двоичном 3-х разрядном виде
%пакет RACH является 2-ым типом пакетов
packet_type = my_de2bi(2,'left_msb',3);

%Идентификатор РМ делающего запрос
ID_RM = my_de2bi(30,'left_msb',7);
    
% Поле data содержит код запрашиваемой услуги
DATA =my_de2bi(1,'left_msb',4);

% Сборка части L2-сообщения
msg_Lev2 = [L_inf ID_TC packet_type ID_RM DATA];
  
% Получение CRC кода
% Вставка нулей в поле CRC (сдвиг влево на величину st.n)
m=[msg_Lev2 zeros(1,st.y-1)];

% Поиск частного и остатка от деления
% информационной части на порождающий полином CRC кода
[q r] = deconv(m,st.poly); 
r = mod(abs(r),2);

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

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

% Массив нулевых битов
tail_bits = zeros(1,106-length(msg_Lev1));

% Сообщение канального уровня
trx = [msg_Lev1 tail_bits];

На втором этапе происходит формирование сообщения физического уровня (Система сбора данных с подвижных станций. Часть 3. п.1.7).
Вначале сообщение канального уровня проходит процедуры помехоустойчивого кодирования, блочного перемежения и модуляции. В зависимости от качества канала связи в системе реализовано два профиля настройки физического уровня ( Система сбора данных с подвижных станций. Часть 3. п.1.7.1). В данном случае для передачи сообщения RACH будем использовать профиль с QPSK модуляцией и БЧХ кодированием (127,106,3). Этот код вносит избыточность в размере 21 бита и способен исправлять 3 ошибки в блоке данных (Система сбора данных с подвижных станций. Часть 3. п.1.7.4). Для эффективной реализации процедур блочного перемежения и модуляции, необходимо в конец сформированного сообщения  добавить один нулевой бит для приведения длины этого сообщения к кратной степени 2.

%% Формирование сообщения физического уровня
% Помехоустойчивое кодирование БЧХ
code_word = encode(trx,st.n,st.k,'bch/binary');

% Добавление к сообщению нулевого бита с целью
%приведения длины сообщения к кратной степени 2
code_word = [code_word 0]'; 

%Блочное перемежение
intrlved_bits = matintrlv(code_word, 8, 16);

% Тип модуляции
h = modem.pskmod(st.mPos);

% Параметры модуляции
h.inputtype = 'bit';
h.SymbolOrder = 'gray';
h.PhaseOffset = pi/4;

% Модуляция
IQ_signal = modulate(h, intrlved_bits);



Рис.2. Сигнально кодовое созвездие сигнала с QPSK модуляцией.

Далее сформированное сообщение необходимо отразить в виде OFDM символов (Система сбора данных с подвижных станций. Часть 3. п.1.7.7). Как было отмечено ранее передача одного OFDM символа должна осуществляться с использованием 9 поднесущих. В данной модели поднесущие, необходимые для использования защитных интервалов и идентификации центральной частоты сигнала, задействованы не будут. Поэтому передача одного символа OFDM будет осуществляться с использованием 6 поднесущих: 4 поднесущие используются для передачи данных, 2 – для передачи пилот сигналов. На каждую из 4 поднесущих, использующихся для передачи данных, будет отводится 2 бита сообщения канального уровня (QPSK модуляция).

Рис.3. Структура поднесущих OFDM символа.

% номера пилотных поднесущих в OFDM-символе
pilotIndexes = [2 5 0];

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

%Размерность OFDM-символа
Nc=6;

% количество поднесущих с данными
Ndata = Nc - (length(pilotIndexes)-1);

% количество битов, передаваемых в одном OFDM-символе
s_length = Ndata * log2(st.mPos);

% Количество OFDM-символов
ns = floor(length(intrlved_bits)/s_length);

%формирование OFDM-символов 
ofdmFrame = makeOfdmFrame(IQ_signal, ns);

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

%символы пилотных поднесущих промодулированы псевдослучайным кодом Баркера
seqBarker = [-1 -1 -1 1 1 1 -1 1 1 -1 1]*4/3;
ofdmSymbol = [];
ofdmFrame = [];
indexOfPilot = 1;
indexOfData = 1;
for i=1:Nofdm
    for j=1:Nc % собираются IQ-символы будущего OFDM-символа 
        if (j==pilotIndexes(indexOfPilot))
            ofdmSymbol(j)=seqBarker(indexOfPilot);
            indexOfPilot=indexOfPilot+1;
        else
            ofdmSymbol(j) = dataMod(indexOfData);
            indexOfData=indexOfData+1;
        end
    end 
    indexOfPilot=1;
    ofdmSymbol = ifft(ofdmSymbol);
    
%формирование циклического префикса, как часть OFDM-символа,
%используется 1/2 часть символа
    cp = ofdmSymbol(Nc-Nc/2+1:Nc);

% добавление ЦП в начало OFDM-символа 
    ofdmSymbol=[cp ofdmSymbol];
    
% Сборка информационных OFDM-символов пакета физического уровня
    ofdmFrame=[ofdmFrame ofdmSymbol];
    ofdmSymbol=[];
end

В соответствии с описанной ранее структурой сообщения физического уровня (Система сбора данных с подвижных станций. Часть 3. п.1.7.7), необходимо к сформированным OFDM символам добавить поле преамбулы, предназначенное для синхронизации по частоте и по времени (данные процедуры в рамках модели не рассматриваются) и сервисного поля, содержащего информацию о параметрах сформированного сообщения физического уровня.

Рис.4.Структура пакетов физического уровня и формирование OFDM сигнала.

%Формирование символов преамбулы
%Идея построения заимствована из спецификации 802.11а
 %Короткие символы - для подстройки частоты (синхронизация по частоте)
 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= 3*[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 = 3*[long_symbol(64-2*16+1:64) long_symbol long_symbol];

 %Формирование сервисного поля
 service_type = [1 1 0 0 1 0 0 1]';
 IQ_service = modulate(h, service_type);
 service = ifft(IQ_service)';
 
 % Пакет физического уровня (символы преамбулы и OFDM-символы)
phy_frame = [short_trs long_trs  service ofdmFrame];



Рис.5. Сформированный OFDM кадр.

Моделирование передачи сигнала по каналу связи.
% Наложение шума на сигнал
noise_sgn = awgn(phy_frame,15);


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



Рис.6. Сигнально-кодовое созвездие принимаемого OFDM сигнала.


Переданное радиомаяком сообщение случайного доступа должно быть принято и обработано ТС.
Вначале происходит выделение из принятого  сигнала сервисного поля и символов OFDM, содержащих непосредственно передаваемые данные.

% Выделение из принимаего OFDM сигнала полей service
% и ofdmFrame
phy_frame_R = noise_sgn(321:length(noise_sgn));
IQ_service = phy_frame_R(1:4);
ofdmFrame =  phy_frame_R(5:length(phy_frame_R));
 
% Извлечение данных содержащихся в поле service
service_type = fft(IQ_service');
service = demodulate(h,service_type)';

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

%Выделение промодулированных данных из принятого
% OFDM сигнала
% Удаление циклического префикса из OFDM символов
 n=1;
 for i=1:6:91
    ofdmSymbol(i:i+5) = ofdmFrame(n+3:n+8);
    n=n+9;  
 end
 
 %БПФ,перевод сигнала в частотную область
  for i=1:6:91
     ofdmSymbol_ifft = ofdmSymbol(i:i+5);
     ofdmSymbol(i:i+5) = fft(ofdmSymbol_ifft);
  end
  
% Удаление пилот сигналов
indexOfPilot=1;
k=0;
for i=1:6:91
    IQ_signal = ofdmSymbol(i:i+5);
    for j = 1:6
        if j == (pilotIndexes(indexOfPilot));
            indexOfPilot = indexOfPilot+1;                   
        else
        IQ_signal_2 =  IQ_signal(j);
            k=k+1;
        IQ_signal_3(k) = IQ_signal_2;
        end
    end
          indexOfPilot=1;
end
IQ_signal = IQ_signal_3;

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

 % Демодуляция  
    deintrlved_bits = demodulate(h,IQ_signal);
    deintrlved_bits = reshape(deintrlved_bits,128,1);
    
 % Блочное деперемежение
 code_word = matdeintrlv(deintrlved_bits,8,16)';
    
 %Устранение лишнего нулевого бита
 code_word = code_word(1:127);
    
 %Декодирование
 trx = decode(code_word,st.n,st.k,'bch/binary',st.errocorr);
    
% Выделение информационной части пакета
% Определение длины информационной части
   L_inf = my_bi2de(trx(1:7),'left_msb');
   
%Собственно выделение ИЧ   
   received_mes_L1 = trx(1:40); 
   
%Подготовка к проверке 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
detect=1;% обнаружены ошибки
end;

% Принятое сообщение
received_mes_L2 = received_mes_L1(1:(length(received_mes_L1)-12));

% Адрес ТС
ID_TC = my_bi2de(received_mes_L2(7:14),'left_msb');

%Тип принятого пакета
packet_type = my_bi2de(received_mes_L2(14:17),'left_msb');

%Идентификатор РМ делающего запрос
ID_RM = my_bi2de(received_mes_L2(17:24),'left_msb');

% Код запрашиваемой услуги
DATA = my_bi2de(received_mes_L2(25:28),'left_msb');

В результате разбора пакета ТС получает следующие данные:

Идентификатор ТС
   118

Тип пакета
     2

Идентификатор РМ
    30

Код запрашиваемой услуги
     1

Точка сбора должна сравнить полученный идентификатор РМ с записанным в своей памяти, и на основании этого сравнения определить дальнейший сценарий взаимодействия с РМ.


В результате моделирования было установлено, что надежная доставка сообщения возможна при ОСШ не менее    14 дБ.


Список литературы:
1. А.В. Бакке. «Лекции по курсу ССПО», Рязань, РГРТУ 2012.
2. Основы построения беспроводных сетей стандарта 802.11: методические указания к лабораторной работе / Рязан. гос. радиотехн. ун-т; сост.: А.В. Бакке. -Рязань, 2008. -52 с.

Ламтев К.М.