Система передачи речевого трафика и данных по сети Ad Hoc.

Статья 4.

Воробьев А.Г., группа 9110.

 

2. Разработка модели системы в среде Matlab, демонстрирующей пример передачи сообщений между объектами верхнего уровня.

Разработаем модель передачи сообщения маршрутизации между двумя датчиками.

Для этого вспомним структуры сообщений L1-L3 уровней для данного типа сообщений.


Рис. 1. Структура сообщений при передаче сообщений маршрутизации.

Исходя из данной структуры и рассмотренной ранее концепции можно предложить следующую модель передачи сообщения маршрутизации:

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 уровня (199 бит)


% Помехоустойчивое кодирование:

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 дБ система работает без ошибок.


Рис. 2. Сигнально кодовое созвездие сигнала после модулятора.


Рис. 3. Сигнально кодовое созвездие сигнала после канала связи.


Рис. 4. Результат работы системы при отсутствии ошибок и при

 совпадения адреса получателя с адресом принимающего терминала.


Рис. 5. Сигнально кодовое созвездие сигнала после канала связи при ОСШ = 5дБ.



Рис. 6. Результат работы системы при наличие ошибок.



Рис. 7. Результат работы системы при отсутствии ошибок и при

 не совпадения адреса получателя с адресом принимающего терминала. 

Список литературы:

1. Бакке А.В. Лекции по курсу ССПО. 2012-2013

2. Воробьев А.Г. КП "Система передачи речевого трафика и данных по сети Ad Hoc". Часть 2.

3. Воробьев А.Г. КП "Система передачи речевого трафика и данных по сети Ad Hoc". Часть 3.

4. Никишкин П.Б. КП "Система сбора данных с подвижных станций". Часть 4.