В последней части КП необходимо разработать программу, предназначенную для передачи и приема одного из сообщений в системе управления освещением. Для этого рассмотрим сообщение, предаваемое от светильника к ЦБС. Ниже на рисунке приведена структура сообщения на канальном уровне.


рис.1 Структура сообщения на канальном уровне.


  После кодирования кодом БЧХ его длина увеличивается до 127 битов. Однако нам нужно прибавить еще один бит для того чтобы размер сообщения стал равным степени двойки.

Параметры.

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

%% Инициализация основных параметров модели

 

% Выбор файлов для сохранения действительной и мнимой частей сигнала

set.SignalFileName = 'signal.bin';

set.SignalFileName2 = 'signal2.bin';

 

% Кодировка передаваемых символов: 2 бита на символ

set.sym_size = 2;

 

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

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

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

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

 

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

set.begin_of_mes = 0; % индикатор начала пакета

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

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

 

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

set.mPos = 2;

 

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

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

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

 

% Определение матрицы оптимальных параметров

params = bchpoly(set.n);

 

% Определение параметров кодирования

set.errocorr = params(3,3);

 

% Параметры CRC

%poly=[1 1 0 0 0 0 0 0 0 1 1 1 1]; % CRC-12  используется в

%телекоммуникационных системах

%CRC-32 IEEE 802.3, а также в MPEG-2.

%poly=[1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 1 0 1 1 1];

%CRC-16-CCIT, используется в CDMA, Bluetooth и т.п.

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 = 55;

Передатчик.

 

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

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

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',9); % индикатор начала пакета

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

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

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

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

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

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


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

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

msg = [begin_of_mes number_of_lighter type_of_mes pow t1 t2];

     

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

m=[msg 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

  

 Присоединяем поле CRC к нашему пакету, полученному ранее.

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

msg = [msg CRC];


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

 

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

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

 

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

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

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

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

msg = [msg 0]';

 

В результате этих операций размер пакета увеличится до 128 битов.


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

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

 

Модуляция

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

 

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

h.inputtype = 'bit';

h.SymbolOrder = 'gray';

h.PhaseOffset = pi/3;

 

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

msg = modulate(h, msg);

    

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

msg = awgn(msg,50);

 

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

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

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

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

    

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

figure(10);

plot(msg,'.');


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

 

Приемник.

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')';

         

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

msg = complex(signal_real, signal_image);

 

Затем сообщение демодулируется и декодируется.

демодуляция

msg = demodulate(h,msg);

 

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

msg = msg(1:127);

   

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

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

 

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


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

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

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

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

 

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

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

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

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

else

     error = error + 1;

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

end;

 

Избавление от значения поля контрольной суммы.

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

msg = msg(1:st.length_msg_Lev2);

 

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

number_of_lighter = my_bi2de(msg(10:18),'left_msb');

pow = my_bi2de(msg(29:37),'left_msb');

t1 = my_bi2de(msg(38:46),'left_msb');


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

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

R_message = [number_of_lighter pow t1 t2];

 

В завершении рааботы мы получим данные о техническом состоянии светильника:

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

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

3)      Температура излучающей поверхности

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



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

  • http://omoled.ru/publications/view/314 - первая часть КП
  • http://omoled.ru/publications/view/329 - вторая часть КП
  • http://omoled.ru/publications/view/352 - третья часть КП
  • http://radiolay.ru/download/file.php?id=355