В данном разделе КП предложено описание разработанной системы в среде MATLAB, демонстрирующей реализацию сценария, описанного в статье 2 (п. 2.3, 3. Режим передачи). На рис.1 представлена часть сценария взаимодействия АР и Т, которая как раз и будет программно реализована.
Рис.1. Процедура опроса терминалов и ответ терминала с запросом канала.
· TYPE – поле, идентифицирующее принадлежность сообщения определенному логическому каналу(3 бита);
· поле «IDTerm» - для адресной передачи сообщений(7 бит);
· DATA – имеет в своем составе четыре нуля(4 бита);
· СRC - необходимо для определения целостности пакета на приемной стороне.(16 бит);
· FILL - для приведения сообщения к стандартной длине(48 бит).
В ответ на сообщение канала AGCH, терминал формирует сообщение, содержащее в себе один из вариантов:
% 1 - активен (1)(канал не требуется, пассивный режим)
% 2 - характер трафика пульсирующий(если да, то 1)
% 3 - характер трафика постоянный(если да, то 1)
Данное сообщение передается по каналу АСН и имеет следующие поля:
· поле «IDTerm» - чтобы АР знала, от какого терминала сообщение(6 бит);
· DATA – имеет в своем составе один из выше перечисленных вариантов(4 бита);
· СRC - необходимо для определения целостности пакета на приемной стороне.(12 бит);
· FILL - для приведения сообщения к стандартной длине(50 бит).
На физическом уровне сообщение подвергается тем же процедуры, что и для сообщения канала AGCH.
Рассмотрим функцию, которая устанавливает параметры модели.
function set = initSettings()
% параметры модели
% Идентификаторы сообщений
set.bcch = 0;
set.ach = 1;
set.tch = 2;
set.agch = 3;
set.rach = 4;
% ....
%Параметры помехоустойчивого кодека
%Для примера используется код БЧХ :
%Длина кодового слова
set.n=127;
set.k=78;
% Параметры CRC
% CRC-16
set.poly=[1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1];
[set.x set.y]=size(set.poly); %размерность полинома
%размер сообщения каналького уровня без учета CRC
set.lenght_info=62;
% ОСШ в канале связи
set.SNR=15;
Рассмотрим функцию, которая отражает передатчик АР.
function [phy_frame] = transmitter_AP( TypeMSG ,ID_T, DATA, NUMBER_PROFILE )
% TYPE - Тип сообщения
% DATA - Поле DATA содержит код запрашиваемой услуги
% ID_Term - Идентификатор терминала
% NUMBER_PROFILE - профиль функционирования
% 1 - BPSK
% 2 - QAM-16
% Установка параметров модели
st=initSettings();
global Nc
global pilotIndexes
global ns;
% определение кода типа сообщения (3-х битовое поле)
% Предусмотрены 5 возможных типов сообщений
% BCCH - широковещательное сообщение
% АСН - соообщение ответ
% ТСН - соообщение трафика
% AGCH - соообщение опрос
% RACH - cообщение заявка
tps = my_de2bi(TypeMSG,'left_msb',3);
% FILL - битs заполнения
FILL=zeros(1,59);
% сборка части L2-сообщения
msg_Lev2 = [tps ID_T DATA FILL];
% получение CRC кода
m = [msg_Lev2 zeros(1,st.y-1)]; %вставка нулей в поле CRC
[q r] = deconv(m,st.poly); % поиск частного и остатка от деления
%информационной части на порождающий полином CRC кода
r = mod(abs(r),2);
%расчет CRC
CRC = r(length(msg_Lev2) + 1:end);
% Cборка сообщения
msg_Lev1 = [msg_Lev2 CRC];
% ================== Физический уровень ================================
% Кодирование сообщения кодом БЧХ (127, 85)
code = encode(msg_Lev1,st.n,st.k,'bch/binary');
%добавление дополнительныхо бита для приведения размера сообщения к числу
%кратному 2 или 4 (следует из определения позиционности BPSK и QAM-16 модуляции
code_word = [0 code];
%Блочное перемежение
alternation_bits = matintrlv(code_word, 16, 8);
% Выбор профиля функционирования
if NUMBER_PROFILE==1
% Параметры модуляции
% h - модем BPSK
mPos=4;
elseif NUMBER_PROFILE==2
% Параметры модуляции
% h - модем QАМ-16
% h - модем BPSK
mPos=16;
end
% номера пилотных поднесущих в OFDM-символе
pilotIndexes = [1 6 11 16 25 30 35 40 0];
% количество неиспользуемых поднесущих и приходящихся на защитные интервалы
Ngr = 0;
% Размерность OFDM-символа
Nc=40;
% количество поднесущих с данными
Ndata = Nc - (length(pilotIndexes)-1);
% количество битов, передаваемых в одном OFDM-символе
s_length = Ndata * log2(mPos);
% Количество OFDM-символов
ns = floor(length(alternation_bits)/s_length);
% Параметры модуляции
% h - модем QAM с позиционностью mPos
h = modem.qammod(mPos);
h.inputtype = 'bit';
IQ_signal = modulate(h, alternation_bits');
figure;
plot(IQ_signal,'xr');
%формирование OFDM-символов
ofdmFrame = makeOfdmFrame(IQ_signal, ns);
%Формирование символов преамбулы
%Короткие символы - для подстройки частоты (синхронизация по частоте)
ShortTrainingSymbols = 2*[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);
% выделение первых 15 отсчетов
Strs = short_symbols(2:11);
% Формирование 3 кототких символов преамбулы на основе выбранного набора
short_trs= [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(7:26));
long_trs = [long_symbol];
% Пакет физического уровня (символы преамбулы и OFDM-символы)
phy_frame = [short_trs long_trs ofdmFrame];
figure;
plot(abs(phy_frame));
end
В третьей статье говорилось, что передача одного OFDM-символа осуществляется с использованием 96 поднесущих: 84 поднесущие для передачи данных, 6 – для пилот сигнала, 2 и 3 – для использования защитных интервалов и 1 нулевая поднесущая для идентификации нулевой частоты OFDM сигнала.
Рис. 2. Структура поднесущих (OFDM символов).
%формирование OFDM-символов
ofdmFrame = makeOfdmFrame(IQ_signal, ns);
В начале каждого сформированного OFDM-символа находится циклический префикс. Размер циклического префикса составляет ¼ часть длины символа.
function ofdmFrame = makeOfdmFrame(dataMod, Nofdm)
global pilotIndexes;
global Nc;
global len_cp;
global len_ofdmSymbol;
%символы пилотных поднесущих промодулированы псевдослучайным кодом (для
%примера, код Баркера), как результат - BPSK
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/4 часть символа
cp = ofdmSymbol(Nc-Nc/4+1:Nc);
len_cp=length(cp);
% добавление ЦП в начало OFDM-символа
ofdmSymbol=[cp ofdmSymbol];
len_ofdmSymbol=length(ofdmSymbol);
% Сборка информационных OFDM-символов пакета физического уровня
ofdmFrame=[ofdmFrame ofdmSymbol];
ofdmSymbol=[];
end
end
Формирование преамбулы
%Формирование символов преамбулы
%Короткие символы - для подстройки частоты (синхронизация по частоте)
ShortTrainingSymbols = 2*[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);
% выделение первых 15 отсчетов
Strs = short_symbols(1:15);
% Формирование 5 коротких символов преамбулы на основе выбранного набора
short_trs= [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(7:26));
long_trs = [long_symbol];
% Пакет физического уровня (символы преамбулы и OFDM-символы)
phy_frame = [short_trs long_trs ofdmFrame];
figure;
plot(abs(phy_frame));
end
Передатчик Т формирует сообщение канала АСН, в котором передается запрос на выделение канала для пульсирующего трафика.
Рассмотрим функцию, которая отражает передатчик Т.
function [phy_frame] = transmitter_T( TYPE ,ID_T, DATA, NUMBER_PROFILE )
% TYPE - Тип сообщения
% DATA - Поле DATA содержит код запрашиваемой услуги
% ID_Term - Идентификатор терминала
% NUMBER_PROFILE - профиль функционирования
% 1 - BPSK
% 2 - QAM-16
% Установка параметров модели
st=initSettings();
global Nc
global pilotIndexes
global ns;
% FILL - биты заполнения
FILL=zeros(1,48);
% сборка части L2-сообщения
msg_Lev2 = [TYPE ID_T DATA FILL];
% получение CRC кода
m = [msg_Lev2 zeros(1,st.y-1)]; %вставка нулей в поле CRC
[q r] = deconv(m,st.poly); % поиск частного и остатка от деления
%информационной части на порождающий полином CRC кода
r = mod(abs(r),2);
%расчет CRC
CRC = r(length(msg_Lev2) + 1:end);
% Cборка сообщения
msg_Lev1 = [msg_Lev2 CRC];
% ================== Физический уровень ================================
% Кодирование сообщения кодом БЧХ (127, 78)
code = encode(msg_Lev1,st.n,st.k,'bch/binary');
%добавление дополнительныхо бита для приведения размера сообщения к числу
%кратному 2 или 4 (следует из определения позиционности QPSK и QAM-16 модуляции
code_word = [0 code];
%Блочное перемежение
alternation_bits = matintrlv(code_word, 16, 8);
% Выбор профиля функционирования
if NUMBER_PROFILE==1
% Параметры модуляции
% h - модем BPSK
mPos=2;
elseif NUMBER_PROFILE==2
% Параметры модуляции
% h - модем QАМ-16
% h - модем BPSK
mPos=16;
end
% номера пилотных поднесущих в OFDM-символе
pilotIndexes = [6 20 34 48 0];
% количество неиспользуемых поднесущих и приходящихся на защитные интервалы
Ngr = 0;
% Размерность OFDM-символа
Nc=52;
% количество поднесущих с данными
Ndata = Nc - (length(pilotIndexes)-1);
% количество битов, передаваемых в одном OFDM-символе
s_length = Ndata * log2(mPos);
% Количество OFDM-символов
ns = floor(length(alternation_bits)/s_length)+1;
Serv = zeros(1,(ns*s_length-length(alternation_bits)));
alternation_bits = [alternation_bits Serv];
% Параметры модуляции
% h - модем QAM с позиционностью mPos
if mPos==16
h = modem.qammod(mPos);
elseif mPos==2
h = modem.pskmod(mPos);
end
h.inputtype = 'bit';
IQ_signal = modulate(h, alternation_bits');
figure(1);
plot(IQ_signal,'xr');
%формирование OFDM-символов
ofdmFrame = makeOfdmFrame(IQ_signal, ns);
%Формирование символов преамбулы
%Короткие символы - для подстройки частоты (синхронизация по частоте)
ShortTrainingSymbols = [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);
% выделение первых 15 отсчетов
Strs = short_symbols(2:11);
% Формирование 3 кототких символов преамбулы на основе выбранного набора
short_trs= [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(7:26));
long_trs = [long_symbol];
% Пакет физического уровня (символы преамбулы и OFDM-символы)
phy_frame = [short_trs long_trs ofdmFrame];
figure(2);
plot(abs(phy_frame));
end
Программа, которая реализует сценарий рис.1 выглядит следующим образом:
clear;%очистка рабочей области
clc; %очистка командного окна
% Установка параметров модели
st=initSettings();
%% Формирование сообщения AP
% вид модуляции
% bpsk - 1
% qam-16 - 2
profile=1;
%Поле DATA = [1 2 3 4] содержит код команды управления
% 1 - активен (1)
% 2 - характер трафика пульсирующий(если да, то 1 )
% 3 - характер трафика постоянный(если да, то 1 )
% 4 - готов/не готов к приему сообщений(если да, то 1)
DATA=[0 0 0 0];
% Идентификатор терминала
ID_Term=[0 0 1 0 1 1 1];
% Типы каналов
% BCCH = 0
% ACH = 1
% TCH = 2
% AGCH = 3
% RACH = 4
% формирование блока OFDM-символов
% для передачи сообщения по радиоканалу
phy_frame = transmitter_AP(st.agch, ID_Term, DATA, profile);
%% Наложение шума на блок символов
phy_frame_R=awgn(phy_frame,st.SNR,'measured');
%% Прием сообщения терминалом
[TYPE_R, ID_Tr, DATA_R, detect] = receiver_T (phy_frame_R, profile);
disp('----------------------------------');
disp('Сообщение, полученное T');
disp('----------------------------------');
% Отображение отсутствия/наличия битовых ошибок
if detect == 0
disp('Битовые ошибки: нет' );
if TYPE_R==st.agch
disp('Принятое сообщение');
disp('TYPE'); disp(st.agch);
if ID_Tr==ID_Term
disp('Адресное сообщение');
disp('получатель:'); disp(['терминал c ID']);disp(ID_Tr);
disp('DATA');disp(DATA_R);
disp('формирование сообщения канала асh')
if ID_Tr==[0 0 0 0 0 0 0]
disp('Широковещательное сообщение');
end;
%при передачи сообщений канала ach передатчик терминала выполняет
%те же функции, что и передатчик АР
%Поле DATA = [1 2 3 4] содержит код команды управления
% 1 - активен (1)
% 2 - характер трафика пульсирующий(если да, то 1 )
% 3 - характер трафика постоянный(если да, то 1 )
% 4 - готов/не готов к приему сообщений(если да, то 1 )
DATA_2=[0 1 0 0];
%% формирование блока OFDM-символов
% для передачи сообщения по радиоканалу
phy_frame_2=transmitter_AP(st.ach, ID_Term, DATA_2, profile);
phy_frame_R_2=awgn(phy_frame_2,st.SNR,'measured');
% Прием сообщения AP
[Power_T, TYPE_R_2, ID_Tr, DATA_R_2, detect] = receiver_AP (phy_frame_R_2, profile);
disp('----------------------------------');
disp('Сообщение, полученное AP');
disp('----------------------------------');
disp('Мощность принятого сигнала');
disp(Power_T);
if detect == 0
disp('Битовые ошибки: есть' );
disp('сообщение от Т с ID'); disp(ID_Tr);
disp('TYPE'); disp(st.ach);
if [0 1 0 0]==DATA_R_2
disp('выделение подканала для передачи пульсирующего трафика для Т с ID' );
disp(ID_Tr);
elseif [0 0 1 0]==DATA_R_2
disp('выделение подканала для передачи постоянного трафика для Т с ID' );
disp(ID_Tr);
elseif [0 0 0 1]==DATA_R_2
disp('Т с ID готово к приему сообщений' );
disp(ID_Tr);
elseif [1 0 0 0]==DATA_R_2
disp('Т с ID активен');
disp(ID_Tr);
end
else
disp('Битовые ошибки есть' );
end;
else
disp('получатель:'); disp(' другой терминал');
end
else
disp('Принятое сообщение');
disp('TYPE'); disp('сообщение не рассматриваемого типа');
end
else
disp('Битовых ошибок нет' );
end;
Продемонстрируем результаты работы модели. Мы пронаблюдаем сигнально-кодовое созвездие, сформированное АР (рис.3) и OFDM-символы во временной области, соответствующие передачи сообщения канала AGCH.
Рис.3. Сигнально-кодовое созвездие, сформированное АР
Рис.4. OFDM-символы во временной области, соответствующие передачи сообщения канала AGCH.
Сигнально-кодовое созвездие после демодуляции OFDM-символов изображено на рис.5. В результате демодуляции полученных IQ символов и функций, выполняемых приемником Т, терминалом получено сообщение
Рис.5. Сигнально-кодовое созвездие после демодуляции OFDM-символов (ОСШ = 15дБ)
Далее, сформированное сообщение будет проходить через канал с АБГШ и поступает на приемник АР. Сигнально-кодовое созвездие после демодуляции OFDM-символов изображено на рис.6. В результате демодуляции полученных IQ символов и функций, выполняемых приемником Т, терминалом получено сообщение
Рис.6. Сигнально-кодовое созвездие после демодуляции OFDM-символов (ОСШ = 15дБ).
В ходе моделирования мы добились всех поставленных задач.