Целью данного этапа курсового проектирования является построение и описание модели передачи сообщения логического канала случайного доступа (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 с.
Ламтев К.М.