КП «Система сбора данных с подвижных объектов»
ЧАСТЬ IV
П.Б. Никишкин
Разработка функциональных схем передающего и приемного трактов физического уровня – на основе концепции SDR (Software Defined Radio). Пояснение назначения модулей схемы.
Технология SDR традиционно используется в специальных областях телекоммуникаций. Технология SDR использует комбинацию методов, затрагивающих аппаратную и программную части. Аппаратная часть включает многодиапазонные антенны и радиочастотные преобразователи; широкополосные ЦАП и АЦП; а обработка сигналов ПЧ, демодулированных сигналов и результирующего цифрового потока происходит с помощью программируемых процессоров общего назначения. Традиционный аналоговый приемник, где АЦП преобразует сигнал с выхода аналоговых квадратурных каналов, имеет следующие недостатки: необходимость точной настройки; чувствительность к температуре и разбросу параметров компонентов; нелинейные искажения; сложность построения перестраиваемых фильтров и фильтров с подавлением более 60 дБ. Но благодаря развитию современной полупроводниковой элементной базы, в первую очередь – АЦП и ЦАП, теперь можно преобразовывать сигнал непосредственно с выхода промежуточной частоты. Достоинства SDR-приемника: не требует настройки; низкая чувствительность к температуре и разбросу параметров компонентов; простота реализации перестраиваемых фильтров с подавлением более 80 дБ [1].
В
разрабатываемой системе передающее устройство включает в себя следующие блоки:
- устройство управления – осуществляет управление устройством и формируем сообщение канального уровня.
- помехоустойчивый кодер – предназначается для того, чтобы вносить избыточность в информационный поток.
- перемежитель – для борьбы с пакетными ошибками осуществляет перестановку бит.
- модулятор – модуляция битового потока.
Рисунок 1. Передающая часть.
На приемной
части выполняются обратные операции:
- Демодуляция – модулированный сигнал преобразуется в битовый поток.
- Деперемежение – обратная операция перемежения.
- Помехоустойчивый декодер – осуществляет исправление ошибок.
- Устройство управления – анализ принятого пакета [4].
Рисунок 2. Приемная часть.
Разработаем в пакете MATLAB модель системы. Разработанная программа передает сообщения по каналу с AWGN, принимает сообщения, и анализирует информацию на достоверность.
Рассмотрим на
примере, как формируется сообщение канала BCCH на
передающей и приемной стороне (рис.3 и рис.4).
Рисунок
3. Структура передающей части.
Рисунок 4. Структура приемной части.
Разрабатываемая система работает по следующему сценарию.
Рисунок 5. Сценарий работы реализуемой модели.
Разрабатываемая модель системы имеет следующий вид:
% /////////////////////////
ТОЧКА ДОСТУПА /////////////////////////////////
% /////////////////////////////////////////////////////////////////////////
% //////////// ПЕРЕДАЧА ШИРОКОВЕЩАТЕЛЬНОГО СООБЩЕНИЯ. НАЧАЛО \\\\\\\\\\\\\\
SNR = 10;
Type_channel = 1; % поле
типа канала;
Number_cicle_tr = 1; % номер
цикла передачи;
Profil_func = 1; % профиль настройки ФУ: 1 для QPSK; 0 для 16-QAM;
%%% Инизиализация
параметров %%%
IG = 0;
P_adress = 56;
P_TD = 185;
FCCH = 0;
SCH = 0;
Zero_bits = 0;
Proof_of_Delivery = 1;
inquiry_add_serv = [0 0 0 0 0];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[IQ_signal, msg_Lev1, inquiry_add_serv] = tramsmitter( IG, P_adress, ...
Type_channel, P_TD,
Number_cicle_tr, Profil_func, FCCH, SCH, ...
Zero_bits, Proof_of_Delivery, inquiry_add_serv );
%
/////////////////////////////////////////////////////////////////////////
% //////////////////////////// НАЛОЖЕНИЕ AWGN /////////////////////////////
IQ_signal = awgn(IQ_signal, SNR);
figure(2); plot(IQ_signal,'.');title('СКС после канала связи');
% /////////// ПЕРЕДАЧА
ШИРОКОВЕЩАТЕЛЬНОГО СООБЩЕНИЯ. ОКОНЧАНИЕ \\\\\\\\\\\\
% /////////////////////////////////////////////////////////////////////////
%
////////////////////////////// ТЕРМИНАЛ /////////////////////////////////
% /////////////////////////////////////////////////////////////////////////
% /////////// ПРИЕМ ТЕРМИНАЛОМ ШИРОКОВЕЩАТЕЛЬНОГО СООБЩЕНИЯ \\\\\\\\\\\\\\\
[ r_msg_L2, r_IG, r_P_adress,
r_Type_channel, r_P_TD, r_Number_cicle_tr,...
r_Profil_func,
r_Proof_of_Delivery, r_inquiry_add_serv, r_data,...
r_FCCH, r_SCH, r_CRC, r ] = receiver( Profil_func, IQ_signal );
% определение
"своя" точка доступа или "чужая"
if my_bi2de(r_P_TD,'left_msb') >= 155
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['В зоне обслуживания данной точки
доступа разрешена передача']);
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
end
% Осуществление
радиоизмерений
Radio_determine = norm(IQ_signal)^2;
if Radio_determine > 100
Profil_func = 0;
else
Profil_func = 1;
end
% Подсчет количества
ошибок:
error = biterr(msg_Lev1, r_msg_L2);
%
-------------------------------------------------------------------------
% ---------------------------- ВЫВОД РЕЗУЛЬТАТОВ
--------------------------
% -------------------------------------------------------------------------
if r == zeros(1,length(r_msg_L2));
%{
if r_IG == 1
disp(['Тип передаваемого сообщения -
широковещательное']);
else
disp(['Тип передаваемого сообщения -
адресное']);
end
disp(['Поле адреса -
',int2str(r_P_adress)]);
disp(['Тип канала - №
',int2str(my_bi2de(r_Type_channel,'left_msb'))]);
disp(['Идентификатор точки доступа - № ',int2str(my_bi2de(r_P_TD,'left_msb'))]);
disp(['Номер цикла передачи - ',int2str(my_bi2de(r_Number_cicle_tr,'left_msb'))]);
disp(['Профиль функционирования -
№ ',int2str(my_bi2de(r_Profil_func,'left_msb'))]);
%}
else
disp(['%%%%% данные полученные терминалом
%%%%%']);
disp(['Информационная часть принята
ошибочно! Количество ошибок: ',int2str(error)]);
end
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
% /////////////////////////
ТОЧКА ДОСТУПА /////////////////////////////////
% /////////////////////////////////////////////////////////////////////////
% /// ПЕРЕДАЧА АДРЕСНОГО СООБЩЕНИЯ НА ТЕРМИНАЛ С ЗАПРОСОМ ДОП. УСЛУГИ \\\
Type_channel = 3; % поле
типа канала;
Proof_of_Delivery = 0;
[IQ_signal, msg_Lev1, inquiry_add_serv] = tramsmitter( IG, P_adress, ...
Type_channel, P_TD,
Number_cicle_tr, Profil_func, FCCH, SCH, ...
Zero_bits, Proof_of_Delivery, inquiry_add_serv );
%
/////////////////////////////////////////////////////////////////////////
% //////////////////////////// НАЛОЖЕНИЕ AWGN /////////////////////////////
IQ_signal = awgn(IQ_signal, SNR);
figure(2); plot(IQ_signal,'.');title('СКС после канала связи');
% /////////////////////////////////////////////////////////////////////////
% //////////////////////////////
ТЕРМИНАЛ /////////////////////////////////
% /////////////////////////////////////////////////////////////////////////
% ////// ПРИЕМ ТЕРМИНАЛОМ АДРЕСНОГО СООБЩЕНИЯ ОТ ТОЧКИ ДОСТУПА \\\\\\\\\\\\
[ r_msg_L2, r_IG, r_P_adress, r_Type_channel, r_P_TD, r_Number_cicle_tr,...
r_Profil_func,
r_Proof_of_Delivery, r_inquiry_add_serv, r_data,...
r_FCCH, r_SCH, r_CRC, r ] = receiver( Profil_func, IQ_signal );
% Осуществление радиоизмерений
Radio_determine = norm(IQ_signal)^2;
if Radio_determine > 100
Profil_func = 0;
else
Profil_func = 1;
end
% Подсчет количества ошибок:
error = biterr(msg_Lev1, r_msg_L2);
%
-------------------------------------------------------------------------
% ---------------------------- ВЫВОД РЕЗУЛЬТАТОВ
--------------------------
% -------------------------------------------------------------------------
if r == zeros(1,length(r_msg_L2));
%{
if r_IG == 1
disp(['Тип передаваемого сообщения -
широковещательное']);
else
disp(['Тип передаваемого сообщения -
адресное']);
end
disp(['Поле адреса -
',int2str(r_P_adress)]);
disp(['Тип канала - №
',int2str(my_bi2de(r_Type_channel,'left_msb'))]);
disp(['Идентификатор точки доступа - № ',int2str(my_bi2de(r_P_TD,'left_msb'))]);
disp(['Номер цикла передачи - ',int2str(my_bi2de(r_Number_cicle_tr,'left_msb'))]);
disp(['Профиль функционирования -
№ ',int2str(my_bi2de(r_Profil_func,'left_msb'))]);
%}
else
disp(['%%%%% данные полученные терминалом
%%%%%']);
disp(['Информационная часть принята
ошибочно! Количество ошибок: ',int2str(error)]);
end
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
% ////////////////////////////// ТЕРМИНАЛ /////////////////////////////////
% /////////////////////////////////////////////////////////////////////////
% //// ОТПРАВКА НА ТОЧКУ ДОСТУПА ПОДГОТОВЛЕННОГО ТЕКУЩЕГО СООБЩЕНИЯ \\\\\\\
Type_channel = 2; % поле типа канала;
[IQ_signal, msg_Lev1, inquiry_add_serv] = tramsmitter( IG, P_adress, ...
Type_channel, P_TD,
Number_cicle_tr, Profil_func, FCCH, SCH, ...
Zero_bits, Proof_of_Delivery, r_inquiry_add_serv );
% /////////////////////////////////////////////////////////////////////////
% //////////////////////////// НАЛОЖЕНИЕ AWGN /////////////////////////////
IQ_signal = awgn(IQ_signal, SNR);
figure(2); plot(IQ_signal,'.');title('СКС после канала связи');
% /////////////////////////////////////////////////////////////////////////
% /////////////////////////
ТОЧКА ДОСТУПА /////////////////////////////////
% /////////////////////////////////////////////////////////////////////////
% ////// ПРИЕМ ТОЧКОЙ ДОСТУПА ТЕКУЩЕЙ ИНФОРМАЦИИ ОТ ТЕРМИНАЛА \\\\\\\\\\\\\
[ r_msg_L2, r_IG, r_P_adress, r_Type_channel, r_P_TD, r_Number_cicle_tr,...
r_Profil_func,
r_Proof_of_Delivery, r_inquiry_add_serv, r_data, ...
r_FCCH, r_SCH, r_CRC, r ] = receiver( Profil_func, IQ_signal );
% Осуществление радиоизмерений
Radio_determine = norm(IQ_signal)^2;
if Radio_determine > 100
Profil_func = 0;
else
Profil_func = 1;
end
% Подсчет количества ошибок:
error = biterr(msg_Lev1, r_msg_L2);
% -------------------------------------------------------------------------
% ---------------------------- ВЫВОД РЕЗУЛЬТАТОВ
--------------------------
% -------------------------------------------------------------------------
if r == zeros(1,length(r_msg_L2));
%{
if r_IG == 1
disp(['Тип передаваемого сообщения -
широковещательное']);
else
disp(['Тип передаваемого сообщения -
адресное']);
end
disp(['Поле адреса -
',int2str(r_P_adress)]);
disp(['Тип канала - №
',int2str(my_bi2de(r_Type_channel,'left_msb'))]);
disp(['Идентификатор точки доступа - № ',int2str(my_bi2de(r_P_TD,'left_msb'))]);
disp(['Номер цикла передачи - ',int2str(my_bi2de(r_Number_cicle_tr,'left_msb'))]);
disp(['Профиль функционирования -
№ ',int2str(my_bi2de(r_Profil_func,'left_msb'))]);
%}
else
disp(['%%%%% данные полученные точкой
доступа %%%%%']);
disp(['Информационная часть принята
ошибочно! Количество ошибок: ',int2str(error)]);
end
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
% /////////////////////////
ТОЧКА ДОСТУПА /////////////////////////////////
% /////////////////////////////////////////////////////////////////////////
% /////////// ОТПРАВЛЕНИЕ НА ТЕРМИНАЛ ПАКЕТА ПОДТВЕРЖДЕНИЯ \\\\\\\\\\\\\\\\
Type_channel = 3; % поле
типа канала;
Proof_of_Delivery = 1;
[IQ_signal, msg_Lev1, inquiry_add_serv] = tramsmitter( IG, P_adress, ...
Type_channel, P_TD,
Number_cicle_tr, Profil_func, FCCH, SCH, ...
Zero_bits, Proof_of_Delivery, r_inquiry_add_serv );
%
/////////////////////////////////////////////////////////////////////////
% //////////////////////////// НАЛОЖЕНИЕ AWGN /////////////////////////////
IQ_signal = awgn(IQ_signal, SNR);
figure(2); plot(IQ_signal,'.');title('СКС после канала связи');
% /////////////////////////////////////////////////////////////////////////
%
////////////////////////////// ТЕРМИНАЛ /////////////////////////////////
% /////////////////////////////////////////////////////////////////////////
% ////// ПРИЕМ ТЕРМИНАЛОМ
СООБЩЕНИЯ ПОДТВЕРЖДЕНИЯ ОТ ТОЧКИ ДОСТУПА \\\\\\\\
[ r_msg_L2, r_IG, r_P_adress, r_Type_channel, r_P_TD, r_Number_cicle_tr,...
r_Profil_func,
r_Proof_of_Delivery, r_inquiry_add_serv, r_data,...
r_FCCH, r_SCH, r_CRC, r ] =
receiver( Profil_func, IQ_signal );
% Осуществление радиоизмерений
Radio_determine = norm(IQ_signal)^2;
if Radio_determine > 100
Profil_func = 0;
else
Profil_func = 1;
end
% Подсчет количества ошибок:
error = biterr(msg_Lev1, r_msg_L2);
%
-------------------------------------------------------------------------
%
---------------------------- ВЫВОД РЕЗУЛЬТАТОВ --------------------------
%
-------------------------------------------------------------------------
if r == zeros(1,length(r_msg_L2));
%{
if r_IG == 1
disp(['Тип передаваемого сообщения -
широковещательное']);
else
disp(['Тип передаваемого сообщения -
адресное']);
end
disp(['Поле адреса -
',int2str(r_P_adress)]);
disp(['Тип канала - № ',int2str(my_bi2de(r_Type_channel,'left_msb'))]);
disp(['Идентификатор точки доступа - № ',int2str(my_bi2de(r_P_TD,'left_msb'))]);
disp(['Номер цикла передачи - ',int2str(my_bi2de(r_Number_cicle_tr,'left_msb'))]);
disp(['Профиль функционирования -
№ ',int2str(my_bi2de(r_Profil_func,'left_msb'))]);
%}
else
disp(['%%%%% данные полученные терминалом
%%%%%']);
disp(['Информационная часть принята
ошибочно! Количество ошибок: ',int2str(error)]);
end
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['Терминал
передал сообщение успешно, переход в режим "СОН"']);
Для оценки
влияния шума на передаваемый сигнал, были построены сигнально-кодовые созвездия
(СКС). На рисунке 6 – СКС модулированного QPSK сигнала на выходе модулятора. На
рисунке 7 – СКС того же сигнала под влиянием АБГШ при отношении сигнал/шум 10
дБ.
Передающее устройство имеет следующий вид:
function [ IQ_signal, msg_Lev1,
inquiry_add_serv ] = tramsmitter( IG, P_adress, ... Type_channel, P_TD, Number_cicle_tr,
Profil_func, FCCH, SCH, Zero_bits, Proof_of_Delivery, add_serv )
length_L2 = 88; % длина
пакета L2 - уровня;
Type_channel = my_de2bi(Type_channel,'left_msb',2); % перевод
if Type_channel == [0,1]
IG = 1; % поле типа сообщений;
P_adress = [1 1 1 1 1 1 1 1]; % поле адреса;
%P_TD = 179; % номер
(идентификатор) точки доступа;
FCCH = [0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0]; % подстройка частоты
SCH = [0 1 1 0 1 1 1 0 1 0 0 0 0
0 1 0]; % и времени;
Zero_bits = [0 0 0 0 0 0 0 0 0 0
0 0 0 0 0]; % нулевые биты;
P_TD = my_de2bi(P_TD,'left_msb',8); % из
десяточной системы счисление
len = length(de2bi(length_L2)); % в
двоичную систему счисления с указанием
Number_cicle_tr = my_de2bi(Number_cicle_tr,'left_msb',7); % разрядности числа;
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['%%%%% данные
передаваемые точкой доступа %%%%%']);
disp(['Тип канала - № ',
int2str(Type_channel)]);
disp(['Идентификатор
точки доступа - № ', int2str(P_TD)]);
disp(['Номер цикла передачи - ', int2str(Number_cicle_tr)]);
disp(['Профиль функционирования - ',
int2str(Profil_func)]);
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
data = []; % поле
данных;
Proof_of_Delivery = [];
inquiry_add_serv = [];
end
if Type_channel == [1,0]
IG = 0;
P_adress = my_de2bi(P_adress,'left_msb',8);
P_TD = my_de2bi(P_TD,'left_msb',8);
Number_cicle_tr = [];
FCCH = [];
SCH = [];
%%% Начало сборки поля
данных %%%
data = [];
speed = 125;
speed = my_de2bi(speed,'left_msb',8);
[pulse, temp, engine, tire_pressure, fuel] =
additional_service(add_serv);
data = [speed, pulse, temp, engine, tire_pressure, fuel];
%%%%%%% Окончание сборки
%%%%%%%%
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['%%%%% данные
передаваемые терминалом %%%%%']);
disp(['Тип канала - № ',
int2str(Type_channel)]);
disp(['Идентификатор точки доступа - № ', int2str(my_bi2de(P_TD,'left_msb'))]);
disp(['Идентификатор терминала - № ', int2str(my_bi2de(P_adress,'left_msb'))]);
disp(['Скорость движения участника(терминала) [км/ч] - ',
int2str(my_bi2de(speed,'left_msb'))]);
disp(['Пульс водителя [уд/сек] - ',
int2str(my_bi2de(pulse,'left_msb'))]);
disp(['Темпиратура тела водителя [C] - ', int2str(my_bi2de(temp,'left_msb'))]);
disp(['Темпиратура двигателя автомобиля [C] - ', int2str(my_bi2de(engine,'left_msb'))]);
disp(['Давление в шинах [атм] - ',
int2str(my_bi2de(tire_pressure,'left_msb'))]);
disp(['Количество топлива [%] - ', int2str(my_bi2de(fuel,'left_msb'))]);
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
Proof_of_Delivery = [];
inquiry_add_serv = [];
end
if Type_channel == [1,1]
IG = 0;
P_adress = my_de2bi(P_adress,'left_msb',8);
P_TD = my_de2bi(P_TD,'left_msb',8);
Number_cicle_tr = [];
FCCH = [];
SCH = [];
if Proof_of_Delivery == 0
inquiry_add_serv = my_de2bi(fix(rand*32),'left_msb',5);
else
inquiry_add_serv = [0 0 0 0 0];
end
Zero_bits = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0];
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['%%%%% данные
передаваемые точкой доступа %%%%%']);
disp(['Тип канала - № ',
int2str(Type_channel)]);
disp(['Идентификатор точки доступа - № ', int2str(my_bi2de(P_TD,'left_msb'))]);
disp(['Идентификатор терминала - № ', int2str(my_bi2de(P_adress,'left_msb'))]);
if Proof_of_Delivery == 1 disp(['Сообщение от терминала № ',int2str(my_bi2de(P_adress,'left_msb')),' передано']); else
if inquiry_add_serv(1) == 1
disp(['Используется
дополнительная услуга: информация о пульсе водителя']);
end
if inquiry_add_serv(2) == 1
disp(['Используется
дополнительная услуга: информация о темпиратуре тела водителя']);
end
if inquiry_add_serv(3) == 1
disp(['Используется
дополнительная услуга: информация о темпиратуре двигателя автомобиля']);
end
if inquiry_add_serv(4) == 1
disp(['Используется
дополнительная услуга: информация о давлении в шинах']);
end
if inquiry_add_serv(5) == 1
disp(['Используется
дополнительная услуга: информация о количестве топлива в баке автомобиля']);
end
end
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
data = [];
end
% Сборка пакета канального
уровня:
msg_L2 = [IG P_adress Type_channel P_TD Number_cicle_tr Profil_func ...
Proof_of_Delivery
inquiry_add_serv data FCCH SCH];
% Полином CRC кода:
poly=[1 1 0 0 0 0 0 0 0 1 1 1 1];
[x y] = size(poly);
m=[msg_L2 zeros(1,y-1)]; % вставка
нулей в поле CRC;
[q r] = deconv(m,poly); % поиск
частного и остатка от деления;
r = mod(abs(r),2);
CRC = r(length(msg_L2) + 1:end); % расчет CRC;
msg_Lev1 = [msg_L2 CRC]; % Сборка
пакета канального уровня;
trx = [msg_Lev1 Zero_bits]; %
добавление нулевых бит;
% Профиль настройки
физического уровня:
if Profil_func == 1
n = 127;
k = 92;
mPos = 4;
else
n = 127;
k = 99;
mPos = 16;
end
% Помехоустойчивое
кодирование:
code_word = encode(trx,n,k,'bch/binary');
code_word = [code_word 0]';
% Блочное перемежение:
inter_code_word = matintrlv(code_word,4,32);
% Сборка пакета физического
уровня:
fl = [1 1 1 0 0 0 1 1];
equalize = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];
tch = [fl equalize inter_code_word' fl];
% Подготовка и отправка
сообщения:
% --- Параметры модуляции
---
h = modem.pskmod(mPos);
h.inputtype = 'bit';
h.SymbolOrder = 'gray';
h.PhaseOffset = pi/4;
% --- Модуляция ---
IQ_signal = modulate(h, tch');
figure(1); plot(IQ_signal,'.');title('СКС модулированного сигнала');
end
Приемная часть выглядит следующим образом:
function [ r_msg_L2, r_IG,
r_P_adress, r_Type_channel, r_P_TD, ...
r_Number_cicle_tr,
r_Profil_func, r_Proof_of_Delivery, r_inquiry_add_serv, r_data, r_FCCH, r_SCH,
r_CRC, r ] = ...
receiver( Profil_func, IQ_signal )
% Профиль настройки
физического уровня:
if Profil_func == 1
n = 127;
k = 92;
mPos = 4;
else
n = 127;
k = 99;
mPos = 16;
end
% Подготовка и демодуляция сообщения:
% --- Параметры демодуляции
---
h = modem.pskdemod(mPos);
h.outputtype = 'bit';
h.SymbolOrder = 'gray';
h.PhaseOffset = pi/4;
% --- Демодуляция ---
demod_IQ_signal = demodulate(h,IQ_signal);
% выделение пакета L2 - уровня;
r_inter_code_word = demod_IQ_signal(25:152,1);
% Блочное деперемежение:
deinter_code_word = matdeintrlv(r_inter_code_word, 4, 32);
% Помехоустойчивое декодирование:
decode_word = decode(deinter_code_word(1:127),n,k,'bch/binary');
%
/////////////////////////////////////////////////////////////////////////
% ///////////////////////
Принятые результаты /////////////////////////////
%
/////////////////////////////////////////////////////////////////////////
% Тип отправленного
сообщения:
r_IG = [decode_word(1)]';
% Поле адреса:
r_P_adress = [decode_word(2:9)]';
% Тип канала:
r_Type_channel = [decode_word(10:11)]';
% /// Создание сообщения
канала BCCH \\\
if r_Type_channel == [0,1]
% Идентификатор точки
доступа:
r_P_TD = [decode_word(12:19)]';
% Номер цикла передачи:
r_Number_cicle_tr = [decode_word(20:26)]';
% Профиль функционрования:
r_Profil_func = [decode_word(27)]';
% Подстроечная
последовательность:
r_FCCH = [decode_word(28:43)]';
r_SCH = [decode_word(44:59)]';
% Проверка целостности
сообщения
r_CRC = [decode_word(60:71)]';
r_data = [];
r_Proof_of_Delivery = [];
r_inquiry_add_serv = [];
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['%%%%% данные полученные терминалом %%%%%']);
if r_IG == 1
disp(['Тип передаваемого сообщения -
широковещательное']);
else
disp(['Тип передаваемого сообщения -
адресное']);
end
disp(['Поле адреса - ',int2str(r_P_adress)]);
disp(['Тип канала - № ',int2str(my_bi2de(r_Type_channel,'left_msb'))]);
disp(['Идентификатор точки доступа - № ',int2str(my_bi2de(r_P_TD,'left_msb'))]);
disp(['Номер цикла передачи - ',int2str(my_bi2de(r_Number_cicle_tr,'left_msb'))]);
disp(['Профиль функционирования - № ',int2str(my_bi2de(r_Profil_func,'left_msb'))]);
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
end
% /// Создание сообщения
канала RACH \\\
if r_Type_channel == [1,0]
% Идентификатор точки
доступа:
r_P_TD = [decode_word(12:19)]';
% Профиль функционрования:
r_Profil_func = [decode_word(20)]';
%%% Распаковка передаваемых
текущих данных терминалом %%%
% Информация о скорости
движения терминала(участника сети)
r_speed = [decode_word(21:28)]';
% Информация о пульсе
водителя
r_pulse = [decode_word(29:44)]';
% Информация о температуре
водителя
r_temp = [decode_word(45:52)]';
% Информация о температуре
двигателя
r_engine = [decode_word(53:60)]';
% Информация о давлении в
шинах
r_tire_pressure = [decode_word(61:68)]';
% Информация о количестве
топлива в баке
r_fuel = [decode_word(69:76)]';
r_data = [r_speed, r_pulse, r_temp, r_engine, r_tire_pressure, r_fuel];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
r_Number_cicle_tr = [];
r_FCCH = [];
r_SCH = [];
r_Proof_of_Delivery = [];
r_inquiry_add_serv = [];
% Проверка целостности
сообщения
r_CRC = [decode_word(77:88)]';
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['%%%%% данные
полученные точкой доступа %%%%%']);
if r_IG == 1
disp(['Тип передаваемого сообщения -
широковещательное']);
else
disp(['Тип передаваемого сообщения -
адресное']);
end
disp(['Тип канала - № ',
int2str(r_Type_channel)]);
disp(['Идентификатор точки доступа - № ', int2str(my_bi2de(r_P_TD,'left_msb'))]);
disp(['Идентификатор терминала - № ', int2str(my_bi2de(r_P_adress,'left_msb'))]);
disp(['Скорость движения участника(терминала) [км/ч] - ',
int2str(my_bi2de(r_speed,'left_msb'))]);
disp(['Пульс водителя [уд/сек] - ',
int2str(my_bi2de(r_pulse,'left_msb'))]);
disp(['Темпиратура тела водителя [C] - ', int2str(my_bi2de(r_temp,'left_msb'))]);
disp(['Темпиратура двигателя автомобиля [C] - ', int2str(my_bi2de(r_engine,'left_msb'))]);
disp(['Давление в шинах [атм] - ',
int2str(my_bi2de(r_tire_pressure,'left_msb'))]);
disp(['Количество топлива [%] - ', int2str(my_bi2de(r_fuel,'left_msb'))]);
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
end
% /// Создание сообщения
канала DCCH \\\
if r_Type_channel == [1,1]
% Идентификатор точки
доступа:
r_P_TD = [decode_word(12:19)]';
% Профиль функционрования:
r_Profil_func = [decode_word(20)]';
% Подтверждение данных
r_Proof_of_Delivery = [decode_word(21)]';
%
if r_Proof_of_Delivery == 0
r_inquiry_add_serv = [decode_word(22:26)]';
else
r_inquiry_add_serv = [decode_word(22:26)]';
end
% Проверка целостности
сообщения
r_CRC = [decode_word(27:38)]';
r_Number_cicle_tr = [];
r_FCCH = [];
r_SCH = [];
r_data = [];
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
disp(['%%%%% данные
полученные терминалом %%%%%']);
if r_IG == 1
disp(['Тип передаваемого сообщения -
широковещательное']);
else
disp(['Тип передаваемого сообщения -
адресное']);
end
disp(['Поле адреса - ',int2str(r_P_adress)]);
disp(['Тип канала - № ',int2str(my_bi2de(r_Type_channel,'left_msb'))]);
disp(['Идентификатор точки доступа - № ',int2str(my_bi2de(r_P_TD,'left_msb'))]);
disp(['Номер цикла передачи - ',int2str(my_bi2de(r_Number_cicle_tr,'left_msb'))]);
disp(['Профиль функционирования - № ',int2str(my_bi2de(r_Profil_func,'left_msb'))]);
if r_Proof_of_Delivery == 1 disp(['Сообщение от терминала № ',int2str(my_bi2de(r_P_adress,'left_msb')),' принято успешно']); else
if r_inquiry_add_serv(1) == 1
disp(['Используется
дополнительная услуга: информация о пульсе водителя']);
end
if r_inquiry_add_serv(2) == 1
disp(['Используется
дополнительная услуга: информация о темпиратуре тела водителя']);
end
if r_inquiry_add_serv(3) == 1
disp(['Используется
дополнительная услуга: информация о темпиратуре двигателя автомобиля']);
end
if r_inquiry_add_serv(4) == 1
disp(['Используется
дополнительная услуга: информация о давлении в шинах']);
end
if r_inquiry_add_serv(5) == 1
disp(['Используется
дополнительная услуга: информация о количестве топлива в баке автомобиля']);
end
end
disp(['%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%']);
end
% Создание пакета L2 - уровня
r_msg_L2 = [r_IG r_P_adress r_Type_channel r_P_TD ...
r_Number_cicle_tr
r_Profil_func r_Proof_of_Delivery r_inquiry_add_serv r_data r_FCCH r_SCH
r_CRC];
% Подготовка и проверке
CRC:
poly=[1 1 0 0 0 0 0 0 0 1 1 1 1];
[q r] = deconv(r_msg_L2,poly);
r = mod(abs(r),2);
end
В программе используется функция additional_service, основное назначение которой состоит в имитации запросов дополнительных услуг от ЦСИ.
В результате запуска данной модели разрабатываемой системы на экран выводится информация:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% данные
передаваемые точкой доступа %%%%%
Тип канала - №
0 1
Идентификатор
точки доступа - № 1 0 1
1 1 0
0 1
Номер цикла
передачи - 0 0 0
0 0 0 1
Профиль функционирования - 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% данные
полученные терминалом %%%%%
Тип передаваемого
сообщения - широковещательное
Поле адреса -
1 1
1 1 1
1 1 1
Тип канала - № 1
Идентификатор
точки доступа - № 185
Номер цикла
передачи - 1
Профиль
функционирования - № 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
В зоне
обслуживания данной точки доступа разрешена передача
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% данные
передаваемые точкой доступа %%%%%
Тип канала - №
1 1
Идентификатор
точки доступа - № 185
Идентификатор
терминала - № 56
Используется
дополнительная услуга: информация о пульсе водителя
Используется
дополнительная услуга: информация о темпиратуре тела водителя
Используется
дополнительная услуга: информация о количестве топлива в баке автомобиля
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% данные
полученные терминалом %%%%%
Тип передаваемого
сообщения - адресное
Поле адреса -
0 0
1 1 1
0 0 0
Тип канала - № 3
Идентификатор
точки доступа - № 185
Номер цикла
передачи -
Профиль
функционирования - № 1
Используется
дополнительная услуга: информация о пульсе водителя
Используется
дополнительная услуга: информация о темпиратуре тела водителя
Используется
дополнительная услуга: информация о количестве топлива в баке автомобиля
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% данные
передаваемые терминалом %%%%%
Тип канала - №
1 0
Идентификатор точки
доступа - № 185
Идентификатор
терминала - № 56
Скорость движения
участника(терминала) [км/ч] - 125
Пульс водителя
[уд/сек] - 47
Темпиратура тела
водителя [C] - 49
Темпиратура
двигателя автомобиля [C] - 0
Давление в шинах
[атм] - 0
Количество топлива [%] - 61
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% данные
полученные точкой доступа %%%%%
Тип передаваемого
сообщения - адресное
Тип канала - №
1 0
Идентификатор
точки доступа - № 185
Идентификатор
терминала - № 56
Скорость движения
участника(терминала) [км/ч] - 125
Пульс водителя
[уд/сек] - 47
Темпиратура тела
водителя [C] - 49
Темпиратура двигателя
автомобиля [C] - 0
Давление в шинах
[атм] - 0
Количество
топлива [%] - 61
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% данные
передаваемые точкой доступа %%%%%
Тип канала - №
1 1
Идентификатор
точки доступа - № 185
Идентификатор
терминала - № 56
Сообщение от
терминала № 56 передано
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%% данные
полученные терминалом %%%%%
Тип передаваемого
сообщения - адресное
Поле адреса -
0 0
1 1 1
0 0 0
Тип канала - № 3
Идентификатор
точки доступа - № 185
Номер цикла
передачи -
Профиль
функционирования - № 1
Сообщение от
терминала № 56 принято успешно
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Терминал передал
сообщение успешно, переход в режим "СОН"
Список используемой
литературы:
1. Технология SDR. Электронный ресурс // URL:
http://nano-e.ucoz.ru/publ/domashnie_zadanija_po_setjam/tekhnologija_sdr/10-1-0-129
2. С.А.
Милованов – Система сбора данных с подвижных станций (часть 4). Электронный
ресурс // URL:http://omoled.ru/publications/view/348
3. Система
сбора данных с подвижных станций. Часть 4. Электронный ресурс // URL:http://omoled.ru/publications/view/347
4. КП на тему
«Локальная радиосеть» п. 2 – п.3 (часть № 4). Электронный ресурс // URL:http://omoled.ru/publications/view/340