В данном разделе необходимо
разработать модель системы в среде Matlab, которая
иллюстрировала бы элемент сценария, разработанного в п.1.5.6. В качестве
примера рассмотрим взаимодействие АР и Т на этапе опроса и ответа Т на него
(рис. 28).
Рис. 28. Процедура опроса терминала
и ответ с запросом на канал
АР опрашивает Т, прошедшие
регистрацию, о необходимости им канала для передачи данных по каналу AGCH для
последующего распределения канального ресурса. В ответ по каналу ACH Т
отправляет запрос на канал. Напомним структуру сообщения, передаваемого по
каналам доступа:
Поле Type – тип канала; адрес Т –
идентификатор терминала; DATA
– информация, содержащая одну из
команд, которые могут передаваться по каналу; CRC – поле для проверки целостности
сообщения; Fill –
заполнение нулями.
На физическом уровне данное
сообщение подвергается перемежению, канальному кодированию, модуляции и
формированию OFDM-символа.
Поле DATA сообщения AGCH
содержит в себе 4 нуля – команда «нужен ли канал». В сообщении ACH может
быть 3 варианта информации:
% 1 - активен (1)(канал не требуется, пассивный режим)
% 2 - характер трафика пульсирующий(если да, то 1)
% 3 - характер трафика постоянный(если да, то 1)
Программа модели составлена с
помощью функций Transmitter AP, Receiver
T, Transmitter
T, Receiver
AP, которые содержат в себе все то, о чем говорилось в
теоретической части.
Для начала рассмотрим функцию, в
которой содержатся параметры модели:
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-12
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;
Функция, реализующая передатчик АР.
Блок-схема данной функции изображена на рис. 29.
Рис. 29. Блок-схема Передатчика АР
Непосредственно сама программа:
function [phy_frame] =
transmitter_AP( TypeMSG ,ID_T, DATA, NUMBER_PROFILE )
% TYPE - Тип сообщения
% DATA - Поле DATA содержит
код запрашиваемой услуги
% ID_Term - Идентификатор
терминала
% NUMBER_PROFILE - профиль
функционирования
% 1 - QPSK
% 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,48);
% сборка части 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, 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 - модем QPSK
mPos=2;
elseif NUMBER_PROFILE==2
% Параметры модуляции
% h - модем QАМ-16
% h - модем QPSK
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,16);
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;
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-символа производится с использованием 64 поднесущих, из
которых 48 информационных и 4 для передачи пилот-сигналов:
Для формирования OFDM-символа используется функция makeOFDMFRame.m:
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-символа (64 IQ-символа)
ofdmSymbol=[cp
ofdmSymbol];
len_ofdmSymbol=length(ofdmSymbol);
% Сборка информационных
OFDM-символов пакета физического уровня
ofdmFrame=[ofdmFrame
ofdmSymbol];
ofdmSymbol=[];
end
end
Рассмотрим приемник терминала.
Блок-схема изображена на рис. 30.
Рис. 30. Блок-схема приемника
терминала
Программная реализация:
function [TYPE_R, ID_Tr, DATA_R,
detect] = receiver_T ( msgIQ, NUMBER_PROFILE)
%Поле DATA_R содержит код
принятой команды управления
%Поле TYPE_R необходимо для
реализации процедуры ARQ
% это поле необходимо Т для
того чтобы знать
% это новое сообщение или
повторно передаваемое
%% Установка параметров
модели
st=initSettings();
global pilotIndexes
global Nc
global ns;
global len_cp;
global len_ofdmSymbol;
% ==================
Физический уровень ================================
% Выделение преамбулы, и
поля данных
phy_frame_R = msgIQ(41:length(msgIQ));
ofdmFrame_R = phy_frame_R(1:end);
%Выделение
промодулированных данных из принятого
% OFDM сигнала
% Удаление циклического
префикса из OFDM символов
n=1;
for i=1:Nc:ns*Nc-Nc+1
ofdmSymbol(i:i+Nc-1) = ofdmFrame_R(n+len_cp:n+len_ofdmSymbol-1);
n=n+len_ofdmSymbol;
end
%БПФ,перевод сигнала в частотную
область
for i=1:Nc:ns*Nc-Nc+1
ofdmSymbol_ifft =
ofdmSymbol(i:i+Nc-1);
ofdmSymbol(i:i+Nc-1) =
fft(ofdmSymbol_ifft);
end
% Удаление пилот сигналов
indexOfPilot=1;
k=0;
for i=1:Nc:ns*Nc-Nc+1
IQ_signal =
ofdmSymbol(i:i+Nc-1);
for j = 1:Nc
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_signalr = IQ_signal_3;
figure;
plot(IQ_signalr,'x');
% % Параметры демодуляции
if NUMBER_PROFILE==1
% Параметры модуляции
% h - модем QPSK
mPos=2;
elseif NUMBER_PROFILE==2
% Параметры модуляции
% h
- модем QАМ-16
% h - модем QPSK
mPos=16;
end
if mPos==16
h = modem.qamdemod(mPos);
elseif mPos==2
h = modem.pskdemod(mPos);
end
h.OutputType = 'bit';
% собственно демодуляция
data_r_1 =
demodulate(h,IQ_signalr);
data_r = data_r_1(1:128);
deintrlved_bits =
reshape(data_r,128,1);
% Блочное деперемежение
deintrlved_bits =
matdeintrlv(deintrlved_bits,16,8);
%Устранение лишнего
нулевого бита
received_L1=deintrlved_bits(2:end);
% Помехоустойчивое
декодирование
%Декодирование сообщения
кодом БЧХ (127,85)
decode_word=decode(received_L1,st.n,st.k,'bch/binary');
received_mes_L1 = decode_word';
%%
% ==================
Канальный уровень
================================
% Подготовка к проверке 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:st.lenght_info);
% выделение поля TYPE_R
TYPE_R=my_bi2de(received_mes_L2(1:3), 'left_msb');
% выделение поля ID_Tr
ID_Tr=received_mes_L2(4:10);
% выделение поля DATA_R
DATA_R=received_mes_L2(11:14);
end
Функции ReceiverAP.m и
TransmitterT.m практически
идентичны рассмотренным выше. Функция ReceiverAP.m выполняет измерение мощности сигнала.
Программа модели, демонстрирующей
выбранный элемент сценария:
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;
Результаты выполнения:
Сообщение, полученное T
----------------------------------
Битовые ошибки: нет
Принятое сообщение
TYPE
3
Адресное сообщение
получатель:
терминал c ID
0 0 1
0 1 1
1
DATA
0 0 0
0
формирование сообщения канала асh
Сообщение, полученное AP
----------------------------------
Мощность принятого сигнала
5.5010e-005
Битовые ошибки: есть
сообщение от Т с ID
0 0 1
0 1 1
1
TYPE
1
выделение подканала для передачи
пульсирующего трафика для Т с ID
0 0 1
0 1 1
1
Рис. 31. СКС, сформированное АР.
Рис. 32. OFDM-символ, сформированный АР.
Рис. 32. Созвездие BPSK после наложения шума в канале связи
(ОСШ=9 дБ)
Рис.33. Сформированный Т OFDM-символ.