Система передачи речевого трафика и данных по сети Ad Hoc.
Статья 4.
Ярославцева А.Е., группа 0110.
2. Разработка модели системы в среде Matlab, демонстрирующей пример передачи сообщений между объектами верхнего уровня.
Разработаем модель передачи сообщения маршрутизации между двумя датчиками.
Для этого вспомним структуры сообщений L1-L3 уровней для данного типа сообщений.
Исходя из данной структуры и рассмотренной ранее концепции можно предложить следующую модель передачи сообщения маршрутизации:
script;
clear all;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%% ПЕРЕДАЮЩЕЕ УСТРОЙСТВО %%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% msg_type %%%
route = [0 0]; % сообщение маршрутизации
manage = [0 1]; % сообщение управления
traffic = [1 0]; % сообщение трафика
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%Передача сообщения маршрутизации%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%Сборка сообщения L3 уровня%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Length_T = [0 0 0 0 1]; % число элементов, записанных в таблицу
% маршрутизации
ID = [0 0 0 0 0]; % идентификатор сообщения
S = 0; % флаг успешного достижения адресата
A1 = [1 1 0 0 1]; % адрес отправителя 25
Lgth_A1 = 5; % длина адреса, бит
TABLE = [A1 zeros(1,(155 - Lgth_A1))]; % в таблицу маршрутизации
%записывается адрес отправителя
STEP = [0 0 0 0 1]; % шаг поиска равен 1
msg_L3 = [Length_T ID S TABLE STEP]; % сообщение уровня управления
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%Сборка сообщения L2 уровня%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A2 = [1 0 0 0 1]; % адрес получателя 17
TYPE = route;
msg_L2_no_crc = [A1 A2 TYPE msg_L3];
% Полином CRC кода: CRC-16-CCITT
poly=[1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0];
[x y] = size(poly);
m=[msg_L2_no_crc zeros(1,y-1)]; % вставка нулей в поле CRC;
[q r] = deconv(m,poly); % поиск частного и остатка от деления;
r = mod(abs(r),2);
CRC = r(length(msg_L2_no_crc) + 1:end); % расчет CRC;
msg_L2 = [msg_L2_no_crc CRC]; % сообщение канального уровня
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%Сборка сообщения L1 уровня%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N = 255; % длина кодового слова
K = length(msg_L2); % длина сообщения L2 уровня (205 бит)
% Помехоустойчивое кодирование:
code_word = encode(msg_L2,N,K,'bch/binary'); % msg_L2 + FEC
code_word_0 = [code_word 0]';
% Блочное перемежение:
inter_code_word = matintrlv(code_word_0,32,8);
FCH = zeros(1,16); % подстройка частоты (16 нулевых бит)
SCH = [1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1];%псевдослучайная
% последовательность
msg_L1 = [FCH SCH inter_code_word']; % сообщение физического уровня
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%Модуляция%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
mPos = 4; % позиционность модуляции QPSK
h = modem.pskmod(mPos);
h.inputtype = 'bit';
h.SymbolOrder = 'gray';
h.PhaseOffset = pi/4;
mod_SCH = modulate(h,SCH'); % символы QPSK для SCH
IQ_signal_tr = modulate(h, msg_L1');
figure(1); plot(IQ_signal_tr,'.');title('СКС модулированного сигнала');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%Канал связи%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SNR = 20; % ОСШ
IQ_signal_rv = awgn(IQ_signal_tr, SNR);
figure(2); plot(IQ_signal_rv,'.');title('СКС после канала связи');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%Прием сигнала%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%Демодуляция%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
h = modem.pskdemod(mPos);
h.outputtype = 'bit';
h.SymbolOrder = 'gray';
h.PhaseOffset = pi/4;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%Временная синхронизация%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Вычисляет вкф пришедшего сигнала с QPSK символами последовательности
% SCH. Размер окна 8 символов
k = 0;
vkf = 0;
for i = 1:14
for j = i:(i+7)
k = k + 1;
vkf = vkf + IQ_signal_rv(j) * mod_SCH(k);
end;
k = 0;
maxvkf(j)=abs(vkf);
vkf =0;
end;
[maxvkff,number] = max(maxvkf); % возвращает максимум вкф и
% соответствующий номер QPSK символа
%демодуляция сообщения после синхронизации
IQ_signal_sync = IQ_signal_rv(number+1:144);
demod_IQ_signal = demodulate(h,IQ_signal_sync);
% Блочное деперемежение:
deinter_code_word = matdeintrlv(demod_IQ_signal, 32, 8);
% Помехоустойчивое декодирование:
decode_word = decode(deinter_code_word(1:255),N,K,'bch/binary');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%Извлечение сообщения%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
rv_CRC = [decode_word(184:199)]'; % из принятого сообщения
% извлекается поле CRC
% По принятому сообщению (кроме поля CRC) вычисляется контрольная сумма
% по тому же полиному, что и на передающей стороне
[x_rv y_rv] = size(poly);
m_rv=[decode_word(1:183)' zeros(1,y_rv-1)]; % вставка нулей в поле CRC;
[q_rv r_rv] = deconv(m_rv,poly); % поиск частного и остатка от деления;
r_rv = mod(abs(r_rv),2);
CRC_rv = r_rv(length(decode_word(1:183)) + 1:end); % расчет CRC;
% Подсчет количества ошибок
error = biterr(msg_L2_no_crc', decode_word(1:183));
% сравнивается принятое поле CRC (rv_CRC) c значчением CRC
% рассчитанным на приемной стороне (CRC_rv)
% Если они совпадают, то принимается решение о том, что сообщение
% принято без ошибок, иначе принимается решение об ошибочном приеме
% сообщений
if CRC_rv == rv_CRC
disp(['Информационная часть принята верно! Количество ошибок: '...
,int2str(error)]);
else
disp(['Информационная часть принята ошибочно! Количество ошибок: '...
,int2str(error)]);
end
% Если нет ошибок. то происходит инкапсуляция сообщения физического
% уровня
if error == 0
% Адрес отправителя
A1_rv = [decode_word(1:5)]';
% Адрес получателя
A2_rv = [decode_word(6:10)]';
% Тип сообщения
TYPE = [decode_word(11:12)]';
% адрес принимающего датчика
A_rv = [1 0 0 0 1];
% Если адрес получателя равен адресу принимающего терминала, то
% происходит распаковка пакета L3
if A2_rv == A_rv
disp('Сообщение предназначается данному датчику. Разборка пакета L3');
% Сообщение уровня L3
msg_L3_rv = [decode_word(13:183)]';
% число элементов, записанных в таблицу маршрутизации
Length_T_rv = msg_L3_rv(1:5);
% идентификационный номер сообщения
ID_rv = msg_L3_rv(6:10);
% флаг успешной доставки до адресата
S_rv = msg_L3_rv(11);
% данные маршрутизации
TABLE_rv = msg_L3_rv(12:167);
% шаг поиска
STEP_rv = msg_L3_rv(167:171);
Lgth_T = my_bi2de(Length_T_rv,'left_msb');
disp(['Идентификационный номер сообщения: ',int2str(my_bi2de(ID_rv,...
'left_msb'))]);
disp(['Флаг успешной доставки до адресата: ',int2str(my_bi2de(S_rv,...
'left_msb'))]);
disp(['Данные маршрутизации: ',int2str(my_bi2de(TABLE_rv(1:5*Lgth_T),...
'left_msb'))]);
disp(['Шаг поиска: ',int2str(my_bi2de(STEP_rv,'left_msb'))]);
else
disp('Сообщение предназначается другому датчику');
end
end
При работе системы с ОСШ = 20 дБ система работает без ошибок.
Список литературы:
1. Бакке А.В. Лекции по курсу ССПО. 2013-2014
2. Ярославцева А.Е.. КП "Система передачи речевого трафика и данных по сети Ad Hoc". Часть 2.
3. Ярославцева А.Е.. КП "Система передачи речевого трафика и данных по сети Ad Hoc". Часть 3.
4. Никишкин П.Б. КП "Система сбора данных с подвижных станций". Часть 4.