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