Баранов И.

 

Теперь нам предстоит разработать программную модель, которая будет имитировать работу радиосистемы управления освещением. Работу программы рассмотрим на примере передачи сообщения от терминала на ЦУ. Данное сообщение будет содержать флаг начала и окончания пакета, поле коррекции частоты, поле синхронизации и поле закодированной информаций, в которое входит информация о температуре излучающей панели, температуре  источника питания и мощности, потребляемой светильником. На рис.1. представлен пакет физического уровня.


Рис.1. Структура пакета физического уровня

После кодирования длина пакета увеличится до 290 бит.

                                                                   Исходные параметры

В файле initSettings.m указываются параметры, используемые в программе, а так же информация о техническом состоянии, которую необходимо передать на ЦУ.

% Информационные параметры, передаваемые в сообщении

set.power = 0060; % мощность, потребляемая светильником

set.tempr1 = 0030; % температура излучающей панели

set.tempr2 = 0040; % температура источника питания

 

% Другие параметры полей пакета канального уровня

set.number_of_lighter = 50; % уникальный номер светильника (УН)

set.type_of_mes = 3;        % индикатор информационного пакета

set.begin_of_mes = 5;       % флаг начала пакета

set.end_of_mes = 5;         % флаг конца пакета

 

% Позиционность модуляции - QPSK

set.mPos = 4;

 

% Параметры БЧХ кода

set.n = 255; % размер после кодирования

set.k = 63; % размер до кодирования

 

% Параметры CRC

set.poly=[1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0];

[set.x set.y]=size(set.poly); %размерность полинома

 

% переменная, равная длине передаваемого сообщения канального уровня без

% поля контрольной суммы

 set.length_msg_Lev2 = 47;

 Передатчик

В файле transmitter.m реализована программа передатчика.

function  transmitter()

 

% установка параметров модели

st=initSettings();

 

% Открытие файлов на запись и получение их идентификаторов

[fidw, message] = fopen(st.SignalFileName, 'wb');

[fidw2, message] = fopen(st.SignalFileName2, 'wb');

 

%% ================== Канальный  уровень ================================

 

% Подготовка к передаче сообщения

 

% Перевод параметров, передаваемых в сообщении в двоичную систему счисления

begin_of_mes = my_de2bi(st.begin_of_mes,'left_msb',4);           % флаг начала пакета

number_of_lighter = my_de2bi(st.number_of_lighter,'left_msb',6); % уникальный номер светильника (ID)

type_of_mes = my_de2bi(st.type_of_mes,'left_msb',9);             % индикатор информационного пакета

tempr1 = my_de2bi(st.tempr1,'left_msb',8);                       % температура излучающей панели

tempr2 = my_de2bi(st.tempr2,'left_msb',8);                       % температура источника питания

power = my_de2bi(st.power,'left_msb',8);                         % мощность потребления светильника

end_of_mes = my_de2bi(st.end_of_mes,'left_msb',4)                % флаг окончания пакета


Рис.2. Просмотр значения параметра «номер светильника», переведенного в двоичную систему счисления.


% сборка сообщения канального уровня

msg_Lev2 = [begin_of_mes number_of_lighter type_of_mes tempr1 tempr2 power end_of_mes];

     

% получение CRC кода

m=[msg_Lev2 zeros(1,st.y-1)]; % вставка нулей в поле CRC

% Поиск частного и остатка от деления информационной части

% на порождающий полином CRC кода

[q r] = deconv(m,st.poly);

r = mod(abs(r),2);

CRC = r(st.length_msg_Lev2 + 1:end);%расчет CRC

  

% сборка сообщения

msg_Lev1 = [begin_of_mes number_of_lighter type_of_mes tempr1 tempr2 power CRC end_of_mes];

trx = msg_Lev1;


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

%% ================== Физический уровень ================================

 Пакет данных, полученный на канальном уровне, необходимо подвергнуть кодированию с помощью блочного кода БЧХ с параметрами (255, 63), которые задаются в файле initSettings.m.

 %% ================== Физический уровень ================================

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

code_word = encode(trx,st.n,st.k,'bch/binary');

% Добавление к сообщению нулевого бита с целью

% приведения длины сообщения к величине, кратной степени 2

code_word = [code_word 0]';

 После этих операций длина сообщения увеличится до 256 битов.


Рис.4. Длина сообщения после кодирования БЧХ кодом

Затем происходит модуляция сообщения, после чего оно передается в канал, в котором шумы не действуют на поступившее сообщение.

% Модуляция

h = modem.pskmod(st.mPos); % h - модем PSK с позиционностью mPos

% Параметры модуляции

h.inputtype = 'bit';

h.SymbolOrder = 'gray';

h.PhaseOffset = pi/3;

% собственно модуляция

IQ_signal = modulate(h, code_word);

% Наложение шума на сигнал

noise_sgn = awgn(IQ_signal,10);

% Запись действительной и мнимой частей сигнала

% в соответствующие двоичные файлы

fwrite(fidw,real(noise_sgn),'double');

fwrite(fidw2,imag(noise_sgn),'double');

% отображение сигнально-кодового созвездия

figure(10);

plot(noise_sgn,'.');


Рис.5. Сигнально-кодовое созвездие

% закрытие файлов

fclose (fidw);

fclose (fidw2);

 Приемник

function  [R_message error] = Receiver()

%% ================== Физический уровень ================================

 

% установка параметров модели

st = initSettings();

 

% инициализация переменной, в которой будут сохраняться

% принимаемаемая информация

R_message = '';

 

% Параметры демодуляции

h = modem.pskdemod(st.mPos);

h.SymbolOrder = 'gray';

h.PhaseOffset = pi/3;

h.OutputType = 'bit';

 

% Открытие файлов на чтение и получение их идентификаторов

[fid, message] = fopen(st.SignalFileName, 'rb');

[fid2, message] = fopen(st.SignalFileName2, 'rb');

 

% Чтение действительной и мнимой частей сигнала

signal_real = fread(fid,'double')';

signal_image = fread(fid2,'double')';

         

% Представление сигнала в комплексной форме  

noise_sgn = complex(signal_real, signal_image);

  

% демодуляция

code_word = demodulate(h,noise_sgn);

 

%Устранение лишнего нулевого бита

code_word = code_word(1:255);

   

%Декодирование

received_mes_L1 = decode(code_word,st.n,st.k,'bch/binary',st.errocorr);

     В результате этих операций мы получаем сообщение канального уровня на приемной стороне. Размер данного сообщения и содержание совпадают с параметрами сообщения, которое было передано. Это следует из рис.3. и рис.6.



Рис.6. Принятое сообщение канального уровня после демодуляции и декодирования

%% ================== Канальный  уровень ================================

received_mes_L1k = received_mes_L1(1:43);

received_mes_L1s = received_mes_L1(60:63);

received_mes_L1h = received_mes_L1(44:59);

received_mes_L1d = [received_mes_L1k received_mes_L1s received_mes_L1h];

     После демодуляции и декодирования, сообщение необходимо проверить на наличие ошибок. Для этого вычисляется контрольная сумма.

% Подготовка к проверке CRC

 

[q r]=deconv(received_mes_L1d,st.poly);

 

% Проверка остатка

r = mod(abs(r),2);

if r == zeros(1,length(received_mes_L1d))

     detect=0;% ошибок нет

else

     error = error + 1;

     detect=1;% обнаружены ошибки

end;

 

После вычисления контрольной суммы, поле CRC отбрасывается

% Принятое сообщение

received_mes_L2 = received_mes_L1d;

 

Далее из принятого сообщения извлекается информация о техническом состоянии терминалов и переводится в привычную для восприятия человека десятичную систему счисления.

% Преобразование принятых параметров в десятичную систему счисления

number_of_lighter = my_bi2de(received_mes_L2(5:10),'left_msb');

tempr1 = my_bi2de(received_mes_L2(20:27),'left_msb');

tempr2= my_bi2de(received_mes_L2(28:35),'left_msb');

power= my_bi2de(received_mes_L2(36:43),'left_msb');



Рис.7. Значение температуры излучающей панели

 

% Вывод информации на экран

R_message = [number_of_lighter tempr1 tempr2 power];

На экран выводятся данные о техническом состоянии светильника:

1)      1) Номер светильника

2)      2)  Температура излучающей панели

3)      3) Температура поверхности источника питания

4)      4)  Мощность, потребляемая светильником

        ans =  50    30    40    60 

% Закрытие файлов

fclose (fid);

fclose (fid2);

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


6)