Радиосистема дистанционного видеоконтроля.

Часть 4. Техническая часть.

(Лукашин И.В., РГРТУ, гр.9110)

 

 

             В данной части проекта предложено описание разработанной в среде Matlab модели системы,  демонстрирующей  пример  передачи  сообщения между точкой доступа (ТД) и терминалом (Т) по каналу ССH/video. Назначение и структура сообщений этого канала была рассмотрена в [1]. Разработанная программа реализует формирование сообщения от ТД к Т. Передача этого сообщения осуществляется по каналу с АБГШ, прием сообщения Т, анализ принятой информации на предмет достоверности, если сообщение принято с ошибками то формируется запрос на повторную передачу.

            Текст программы формально разделен на две части – «передающая» и «приёмная». На Рис. 1 представлена блок-схема передающей части. Слева изображен порядок происходящих процессов, справа – вариации обрабатываемых программой структурных единиц (пакетов и полей) как результат соответствующих процессов.

 

Рис. 1. Блок-схема передающей части.

 

 

Для начала рассмотрим функцию, устанавливающую параметры модели

 

set = initSettings()

% параметры модели

% позиционность модуляции - QAM

set.mPos = 4;

%Параметры помехоустойчивого кодека 

%Для примера используется код БЧХ :

%Длина кодового слова

set.n=255;

%Размер кодируемого блока

set.k=187;

% Параметры CRC

%CRC-8

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

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

%размер сообщения каналького уровня без учета CRC

set.lenght_info=179;

% ОСШ в канале связи

set.SNR=20;

 

Входными параметрами является тип сообщения  (необходимо для реализации процедуры ARQ) и информационное поле DATA .

 

%Поле DATA содержит код команды управления

DATA=3052;

% Поле TYPE необходимо для реализации процедуры ARQ

% это поле необходимо Т для того чтобы знать

% это новое сообщение или повторно передаваемое

TYPE='new_message';

 

Рассмотрим функцию, реализующую передающую часть.

 

phy_frame = transmitter( TYPE , DATA )

 

% TYPE - поле которое необходимо Т для того чтобы знать

% это новое сообщение или повторно передаваемое.

% DATA - Поле DATA содержит код запрашиваемой услуги

 

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

st=initSettings();

global fil_zero

global Nc

global pilotIndexes

 

if TYPE == 'new_message'

          tps=0;

elseif TYPE =='repeat_message'

          tps=1;

end;

 

DATA= my_de2bi(DATA,'left_msb',178);

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

% сборка части L2-сообщения

msg_Lev2 = [tps DATA];  

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

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

[q r] = deconv(m,st.poly); % поиск частного и остатка от деления

%информационной части на порождающий полином CRC кода

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

%расчет CRC

CRC = r(length(msg_Lev2) + 1:end);

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

msg_Lev1 = [msg_Lev2 CRC];

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

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

% Кодирование сообщения кодом БЧХ (255, 187)

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

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

%кратному 2 или 4 (следует из определения позиционности QPSK и QAM-16 модуляции

code_word = [0 code];

%Блочное перемежение

alternation_bits = matintrlv(code_word, 32, 8);

 

          Передача одного OFDM символа будет осуществляться с использованием 32 поднесущих: 22 поднесущие дл передачи данных, 4 – для пилот сигнала, 5 – для использования защитных интервалов и 1 нулевая поднесущая для идентификации нулевой частоты OFDM сигнала. Структура поднесущих изображена на Рис. 2.

 

 Рис. 2. Структура поднесущих (OFDM символов).

 

% номера пилотных поднесущих в OFDM-символе

pilotIndexes = [1 2 8 9 16 23 24 30 31 32];

% количество неиспользуемых поднесущих и приходящихся на защитные интервалы

Ngr = 0;   

% Размерность OFDM-символа

Nc=32;

% количество поднесущих с данными

Ndata = Nc - (length(pilotIndexes));

% количество битов, передаваемых в одном OFDM-символе

s_length = Ndata * log2(st.mPos);

% Количество OFDM-символов

ns = floor(length(alternation_bits)/s_length)+1;

% размер передаваемого сообщения, после выхода с перемежителя

msg_length = length(alternation_bits);

% fil_zero - незначащие биты, это разница между тем

% количеством битов, что обеспечивает расчетное количество OFDM-символов, и

% количеством блоком в передаваемом сообщении

fil_zero = zeros(1, ns*s_length - msg_length);

% дополнение блока битов сообщения незначащими битами,

% это обеспечивает расчетное количество OFDM-символов

data = [alternation_bits fil_zero];

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

% h - модем QAM с позиционностью mPos

h = modem.qammod(st.mPos);

h.inputtype = 'bit';

IQ_signal = modulate(h, data');

figure(1);

plot(IQ_signal,'xr');

ylim([-3.1 3.1]);

xlim([-3.1 3.1]);

title('Сигнально-кодовое созвездие, полученное в передатчике')

 

На рис. 3 продемонстрирована сигнально-кодовая созвездие на выходе модулятора  QPSK модулятора

 

  Рисунок 3. СКС модулированного QPSK сигнала на выходе модулятора

         

%формирование OFDM-символов

ofdmFrame = makeOfdmFrame(IQ_signal, ns);

          

В начало каждого сформированного символа OFDM необходимо добавить циклический префикс. Размер циклического префикса составит ¼ часть  длины символа. Таким образом один OFDM символ будет передаваться с использованием 22 поднесущих.

 

function ofdmFrame = makeOfdmFrame(dataMod, Nofdm)

 

global pilotIndexes;

global Nc;

 

%символы пилотных поднесущих промодулированы псевдослучайным кодом (для

%примера, код Баркера), как результат - BPSK

seqBarker = [-1 -1 -1 1 1 1 -1 1 1 -1 1]*4/3;

ofdmSymbol = [];

ofdmFrame = [];

indexOfPilot = 1;

indexOfData = 1;

for i=1:Nofdm

    for j=1:Nc % собираются IQ-символы будущего OFDM-символа

        if (j==pilotIndexes(indexOfPilot))

            ofdmSymbol(j)=seqBarker(indexOfPilot);

            indexOfPilot=indexOfPilot+1;

        else

            ofdmSymbol(j) = dataMod(indexOfData);

            indexOfData=indexOfData+1;

        end

    end

    indexOfPilot=1;

    ofdmSymbol = ifft(ofdmSymbol);

    %формирование циклического префикса, как часть OFDM-символа,

    %используется 1/4 часть символа

    cp = ofdmSymbol(Nc-Nc/4+1:Nc);

    % добавление ЦП в начало OFDM-символа (64 IQ-символа)

    ofdmSymbol=[cp ofdmSymbol];

    % Сборка информационных OFDM-символов пакета физического уровня

    ofdmFrame=[ofdmFrame ofdmSymbol];

    ofdmSymbol=[];

end

end

 

Далее, происходит формирование преамбулы.

 

%Формирование символов преамбулы

%Короткие символы - для подстройки частоты (синхронизация по частоте)

ShortTrainingSymbols = 5*[0 0 1+j 0 0 0 -1-j 0 0 0 1+j 0 0 0 -1-j 0 0 0 -1-j 0 0 0 1+j 0 0 0 0 0 0 -1-j 0 0 0 -1-j 0 0 0 ...

      1+j 0 0 0 1+j 0 0 0 1+j 0 0 0 1+j 0 0];

  short_symbols = ifft(ShortTrainingSymbols);

% выделение первых 16 отсчетов

Strs = short_symbols(1:16);

% Формирование 10 кототких символов преамбулы на основе выбранного набора

short_trs= [Strs Strs Strs Strs Strs Strs Strs Strs Strs Strs];

%длинный символ преамбулы

LongTrainingSymbols=3*[0 0 0 0 0 0 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 ...

 1 -1 -1 1 1 -1 1 -1 1 -1 -1 -1 -1 -1 1 1 -1 -1 1 -1 1 -1 1 1 1 1 0 0 0 0 0 0];

long_symbol = ifft(LongTrainingSymbols);

long_trs = [long_symbol(64-2*16+1:64) long_symbol long_symbol];

% Пакет физического уровня (символы преамбулы и OFDM-символы)

phy_frame = [short_trs long_trs ofdmFrame];

figure(2);

plot(abs(phy_frame));

end

 

Сформированный OFDM кадр показан на Рис. 4.

 

Рис.4. Сформированный OFDM кадр.

 

            Моделирование передачи сигнала по каналу связи, осуществим с помощью функции phy_frame_R=awgn(phy_frame,st.SNR,'measured').

            Переданное ТД сообщение канала управления ССH/video должно быть принято и обработано Т. Вначале происходит выделение из принятого  сигнала символов OFDM, содержащих непосредственно передаваемые данные. На Рис. 5 представлена блок-схема приёмной части. Как и в случае с блок-схемой передающей части, слева изображен порядок происходящих процессов, справа – вариации обрабатываемых программой структурных единиц (сообщений и полей) как результат соответствующих процессов 

  

Рис. 5. Блок-схема приемной части.

 

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

 

[ TYPE_R, DATA_R  ] = receiver ( phy_frame_R ).

 

function [ TYPE_R, DATA_R  ] = receiver ( msgIQ )

 

%Поле DATA_R содержит код принятой команды управления

%Поле TYPE_R необходимо для реализации процедуры ARQ

% это поле необходимо Т для того чтобы знать

% это новое сообщение или повторно передаваемое

 

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

st=initSettings();

global fil_zero;

global pilotIndexes;

global Nc;

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

% Выделение преамбулы, и поля данных 

phy_frame_R = msgIQ(321:length(msgIQ));

ofdmFrame_R =  phy_frame_R(1:end);

%Выделение промодулированных данных из принятого OFDM сигнала

%удаление циклического префикса из OFDM символов

OSr = [];

OSpr = [];

IQ_signalr = [];

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

%pilotIndexes = [1 2 8 9 16 23 24 30 31 32];

nopilotIndexes = [3:7 10:15 17:22 25:29];

 for i = 0 : (length(ofdmFrame_R)/40)-1

       % убираем циклический префикс  

    % 8 - length(cp)

    % 40 - length(ofdmSymbol)

    % смотри функцию makeOfdmFrame   

    IQ_sig = ofdmFrame_R((8:40)+ i*40);

    OSr = [OSr; IQ_sig];  

    % переход d частотную область

    IQ_sign = fft(IQ_sig);

    OSpr = [OSpr; IQ_sign];

    % убираем пилот сигналы и  Формируем поток данных

    IQ_signalr = [IQ_signalr IQ_sign(nopilotIndexes)];

end;

 

figure(3);

plot(IQ_signalr,'x');

title('Сигнально-кодовое созвездие, полученное в приемнике');

 

На Рис.6 продемонстрирована сигнально-кодовая созвездие на входе демодулятора  QPSK модулятора. 

 

 

Рис. 6. СКС модулированного QPSK сигнала на входе демодулятора при ОСШ=20дБ

 

После выделения промодулированных данных из принятого OFDM сигнала происходит процедура демодуляции, деперемежения,  декодирование.

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

   h = modem.qamdemod(st.mPos);

   h.OutputType = 'bit';

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

  s = demodulate(h,IQ_signalr);

  data_r = s(1:end - length(fil_zero));

 

  deintrlved_bits = reshape(data_r,256,1);

  % Блочное деперемежение

  deintrlved_bits = matdeintrlv(deintrlved_bits,32,8);

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

  received_L1=deintrlved_bits(2:end);

 

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

%Декодирование сообщения кодом БЧХ (255,187)

decode_word=decode(received_L1,st.n,st.k,'bch/binary');

received_mes_L1 = decode_word';

%%

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

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

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

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

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

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

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

   else

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

   end;

  

if detect == 0

          % Собственно принятое сообщение

          received_mes_L2 = received_mes_L1(1:st.lenght_info);

          % выделение поля TYPE_R

          tps_R=received_mes_L2(1);

          if tps_R == 0

          TYPE_R='new_message';

          elseif tps_R == 1

          TYPE_R='repeat_message';

          end;

          % выделение поля DATA_R

          DATA_R=received_mes_L2(2:st.lenght_info);

          DATA_R=my_bi2de(DATA_R, 'left_msb');

          disp('============================');

          disp('Тип принятого сообщения');

          disp(TYPE_R);

          disp('Команда');

          disp(DATA_R);

          disp('============================');

elseif detect == 1 

          TYPE_R=[];

          DATA_R=[];

          disp('============================');

          disp('Требуется повторная передача');  

          disp('============================');

end  

end

После работы механизма CRC по проверке принятого сообщения на ошибки, в случае отсутствия таковых, программа выводит сообщение типа:

 

============================

Тип принятого сообщения

new_message

Команда

        3052

 

============================.

 

Если механизм CRC выявил ошибки в принятых данных, то программа выводит сообщение типа:

============================

Требуется повторная передача

============================.

 

            В результате моделирования было установлено, что безошибочная доставка сообщения при выборе QPSK модуляции возможна при ОСШ не менее 8  дБ, а при QAM-16 – не менее 9 дБ. Полученные результаты несколько отличаются от  теоретических результатов, полученных в [1]. Для определения более точных результатов необходимо повторить цикл передачи приема порядка 100 000 раз.

 

 

 

 

 

 

 

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

1) Лукашин И.В. Радиосистема дистанционного видеоконтроля (Часть 2)

http://omoled.ru/publications/view/434

2) Лукашин И.В. Радиосистема дистанционного видеоконтроля (Часть 3)

http://omoled.ru/publications/view/447

3) С.А.Милованов - Система сбора данных с подвижных станций (Часть 4)

http://omoled.ru/publications/view/348

4) К. Ламтев Система сбора данных с подвижных станций. Часть 4

http://omoled.ru/publications/view/347 

5) А. Ночная. КП на тему "Локальная радиосеть" п. 2 - п.3 (часть №4)

http://omoled.ru/publications/view/340

 P. S. Огромная благодарность К. Ламтеву и А. Ночной за предоставленные коды программы.