Радиосеть передачи данных.

Часть 4

(Саутина М.Ю., РГРТУ, гр.9110)

             В данном разделе КП предложено описание разработанной системы в среде MATLAB, демонстрирующей реализацию сценария, описанного в статье 2 (п. 2.3, 3. Режим передачи).  На рис.1 представлена часть сценария взаимодействия АР и Т, которая как раз и будет программно реализована.

 

Рис.1. Процедура опроса терминалов и ответ терминала с запросом канала.

            Терминалы, прошедшие регистрацию, будут последовательно опрашиваться АР, чтобы точка доступа знала каким терминалам выделить канал. Опрос терминалов осуществляется по каналу AGCH. Сообщение этого канала на канальном уровне состоит из следующих полей:

  •   TYPE – поле, идентифицирующее принадлежность сообщения определенному логическому каналу(3 бита);
  •  поле «IDTerm» - для адресной передачи сообщений(7 бит);
  • DATA – имеет в своем составе четыре нуля(4 бита);
  • СRC - необходимо для определения целостности пакета на приемной стороне.(12 бит);
  • FIIL - для приведения сообщения к стандартной длине(59 бит).

 Канальному кодированию, перемежению, модуляции, формированию OFDM-символов -  сообщение подвергается на физическом уровне.

В ответ на сообщение канала AGCH, терминал формирует сообщение, содержащее в себе один из вариантов:

% 1 - активен (1)(канал не требуется, пассивный режим)

% 2 - характер трафика пульсирующий(если да, то 1)

% 3 - характер трафика постоянный(если да, то 1)

Данное сообщение передается по каналу АСН и имеет следующие поля:

  • TYPE – поле, идентифицирующее принадлежность сообщения определенному логическому каналу(3 бита);
  • поле «IDTerm» - чтобы АР знала, от какого терминала сообщение(7 бит);
  • DATA – имеет в своем составе один из выше перечисленных вариантов(4 бита);
  • СRC - необходимо для определения целостности пакета на приемной стороне.(12 бит);
  • FIIL - для приведения сообщения к стандартной длине(59 бит).

На физическом уровне сообщение подвергается тем же процедуры, что и для сообщения канала AGCH.

      Текст программы состоит из двух частей: Т- приемная и передающая часть, АР – приемная и передающая часть  Рассмотрим алгоритм передающей части АР, представленный на рис.2. Справа изображены вариации обрабатываемых программой структурных единиц, как результат соответствующих процессов; слева – порядок происходящих процессов.

 

           Рис.2 Алгоритм передающей части АР

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

function set = initSettings()

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

% Идентификаторы сообщений

set.bcch = 0;

set.ach = 1;

set.tch = 2;

set.agch = 3;

set.rach = 4;

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

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

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

set.n=127;

set.k=85;

% Параметры CRC

% CRC-12 

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

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

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

set.lenght_info=73;

 Рассмотрим функцию, которая отражает передатчик АР.

 function [phy_frame] = transmitter_AP( TypeMSG ,ID_T, DATA, NUMBER_PROFILE)

% TYPE - Тип сообщения

% DATA - Поле DATA

% ID_Term - Идентификатор терминала

% NUMBER_PROFILE - профиль функционирования

% 1 - QPSK

% 2 - QAM-16

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

st=initSettings();

global Nc

global pilotIndexes

global ns;

   % определение кода типа сообщения (3-х битовое поле)

   % Предусмотрены 5 возможных типов сообщений

   % BCCH - широковещательное сообщение

   % АСН - соообщение ответ

   % ТСН - соообщение трафика

   % AGCH - соообщение опрос

   % RACH - cообщение заявка

tps = my_de2bi(TypeMSG,'left_msb',3);

[TYPE_R, ID_Tr, DATA_R, detect] = receiver_T (phy_frame_R, profile);

disp('----------------------------------');

disp('Сообщение, полученное T');

disp('----------------------------------');

% Отображение отсутствия/наличия битовых ошибок

if detect == 0

   disp('Битовые ошибки: не присутствую' );

    if TYPE_R==st.agch

    disp('Принятое сообщение');

    disp('TYPE'); disp(st.agch);

        if ID_Tr==ID_Term

        disp('получатель:'); disp(['терминал c ID']);disp(ID_Tr);

        disp('DATA');disp(DATA_R);

        disp('формирование сообщения канала асh')

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

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

msg_Lev2 = [tps ID_T DATA FILL];  

% получение 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];

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

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

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

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

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

code_word = [0 code];

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

alternation_bits = matintrlv(code_word, 16, 8);

% Выбор профиля функционирования

  if NUMBER_PROFILE==1

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

          % h - модем QPSK

          mPos=4;

          elseif NUMBER_PROFILE==2

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

          % h - модем QАМ-16

          % h - модем QPSK

          mPos=16;       

  end

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

pilotIndexes = [1 6 11 16 25 30 35 40 0];

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

Ngr = 0;

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

Nc=40;

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

Ndata = Nc - (length(pilotIndexes)-1);

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

s_length = Ndata * log2(mPos);

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

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

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

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

h = modem.qammod(mPos);

h.inputtype = 'bit';

IQ_signal = modulate(h, alternation_bits');

figure;

plot(IQ_signal,'xr');

В третьей статье говорилось, что передача одного OFDM-символа осуществляется с использованием 54 поднесущих: 32 поднесущие для передачи данных, 8 – для пилот сигнала, 6 и 7 – для использования защитных интервалов и 1 нулевая поднесущая для идентификации нулевой частоты OFDM сигнала. Структура поднесущих изображена на рис. 3.

 

GI – защитный интервал

PI – пилот-сигнал

Data – данные

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

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

ofdmFrame = makeOfdmFrame(IQ_signal, ns);

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

function ofdmFrame = makeOfdmFrame(dataMod, Nofdm)

global pilotIndexes;

global Nc;

global len_cp;

global len_ofdmSymbol;

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

%примера, код Баркера), как результат - 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);

    len_cp=length(cp);

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

    ofdmSymbol=[cp ofdmSymbol];

    len_ofdmSymbol=length(ofdmSymbol);

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

    ofdmFrame=[ofdmFrame ofdmSymbol];

    ofdmSymbol=[];

end

end

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

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

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

ShortTrainingSymbols = 2*[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);

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

Strs = short_symbols(2:11);

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

short_trs= [Strs Strs];

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

LongTrainingSymbols=[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(7:26));

long_trs = [long_symbol];

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

phy_frame = [short_trs long_trs ofdmFrame];

figure;

plot(abs(phy_frame));

end

Сообщение отправленное АР, должно быть принято и обработано Т. Начинается все с выделения из принятого сигнала  символа OFDM, который содержит передаваемые данные. На рис.4 представлен алгоритм приемной часть Т. Справа изображены вариации обрабатываемых программой структурных единиц, как результат соответствующих процессов; слева – порядок происходящих процессов.

После извлечения полей DATA, содержащего сообщение опроса и TYPE, поле, идентифицирующее принадлежность сообщения определенному логическому каналу.

  

Рис. 4. Алгоритм приемной части Т

Передатчик Т формирует сообщение канала АСН, в котором передается запрос на выделение канала для пульсирующего трафика.

Рассмотрим алгоритм передающей части Т, представленный на рис.5. Справа изображены вариации обрабатываемых программой структурных единиц, как результат соответствующих процессов; слева – порядок происходящих процессов.

 

Рис. 5. Алгоритм передающей части Т.

Рассмотрим функцию, которая отражает передатчик Т.

 function [phy_frame] = transmitter_T( TYPE ,ID_T, DATA, NUMBER_PROFILE )

% TYPE - Тип сообщения

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

% ID_Term - Идентификатор терминала

% NUMBER_PROFILE - профиль функционирования

% 1 - QPSK

% 2 - QAM-16

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

st=initSettings();

global Nc

global pilotIndexes

global ns;

% Прием сообщения AP

[Power_T, TYPE_R_2, ID_Tr, DATA_R_2, detect] = receiver_AP (phy_frame_R_2, profile);

disp('----------------------------------');

disp('Сообщение, полученное AP');

disp('----------------------------------');

disp('Мощность принятого сигнала');

     disp(Power_T);

     if detect == 0

     disp('Битовые ошибки: не присутствую' );

     disp('сообщение от Т с ID'); disp(ID_Tr);

     disp('TYPE'); disp(st.ach);

         if [0 1 0 0]==DATA_R_2

            disp('выделение подканала для передачи пульсирующего трафика для Т с ID' );

     disp(ID_Tr);

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

% FILL - биты заполнения

FILL=zeros(1,59);

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

msg_Lev2 = [TYPE ID_T DATA FILL];  

% получение 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];

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

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

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

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

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

code_word = [0 code];

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

alternation_bits = matintrlv(code_word, 16, 8);

% Выбор профиля функционирования

  if NUMBER_PROFILE==1

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

          % h - модем QPSK

          mPos=4;

          elseif NUMBER_PROFILE==2

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

          % h - модем QАМ-16

          % h - модем QPSK

          mPos=16;       

  end

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

pilotIndexes = [1 6 11 16 25 30 35 40 0];

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

Ngr = 0;

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

Nc=40;

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

Ndata = Nc - (length(pilotIndexes)-1);

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

s_length = Ndata * log2(mPos);

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

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

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

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

h = modem.qammod(mPos);

h.inputtype = 'bit';

IQ_signal = modulate(h, alternation_bits');

figure(1);

plot(IQ_signal,'xr');

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

ofdmFrame = makeOfdmFrame(IQ_signal, ns);

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

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

ShortTrainingSymbols = [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);

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

Strs = short_symbols(2:11);

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

short_trs= [Strs Strs];

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

LongTrainingSymbols=[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(7:26));

long_trs = [long_symbol];

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

phy_frame = [short_trs long_trs ofdmFrame];

figure(2);

plot(abs(phy_frame));

end

Сообщение отправленное Т, должно быть принято и обработано АР. Рассмотрим алгоритм приемной части АР, представленный на рис.6. Справа изображены вариации обрабатываемых программой структурных единиц, как результат соответствующих процессов; слева – порядок происходящих процессов.

 

Рис. 6. Алгоритм приемной части АР. 

После извлечения полей DATA_R, содержащего в себе код запроса, TYPE_R - поле, идентифицирующее принадлежность сообщения определенному логическому каналу и IDTerm, идентификатор терминала, чтобы AP знала от кого сообщение.

function [Power, TYPE_R, ID_Tr, DATA_R, detect] = receiver_AP ( msgIQ, NUMBER_PROFILE)% TYPE - Тип сообщения

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

% ID_Term - Идентификатор терминала

% detect - отражает отсутствие/наличие ошибок

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

st=initSettings();

global pilotIndexes

global Nc

global ns;

global len_cp;

global len_ofdmSymbol;

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

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

% Оценим мощность сигнала

A=mean((msgIQ)); % средняя амплитуда сигнала

Power=abs(A).^2; %средняя мощность сигнала

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

ofdmFrame_R =  phy_frame_R(1:end);

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

% OFDM сигнала

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

 n=1;

for i=1:Nc:ns*Nc-Nc+1

    ofdmSymbol(i:i+Nc-1) = ofdmFrame_R(n+len_cp:n+len_ofdmSymbol-1);

    n=n+len_ofdmSymbol;

end

%БПФ,перевод сигнала в частотную область

for i=1:Nc:ns*Nc-Nc+1

     ofdmSymbol_ifft = ofdmSymbol(i:i+Nc-1);

     ofdmSymbol(i:i+Nc-1) = fft(ofdmSymbol_ifft);

end

% Удаление пилот сигналов

indexOfPilot=1;

k=0;

  for i=1:Nc:ns*Nc-Nc+1

    IQ_signal = ofdmSymbol(i:i+Nc-1);

    for j = 1:Nc

        if j == (pilotIndexes(indexOfPilot));

            indexOfPilot = indexOfPilot+1;                  

        else

        IQ_signal_2 =  IQ_signal(j);

            k=k+1;

        IQ_signal_3(k) = IQ_signal_2;

        end

    end

          indexOfPilot=1;

end

IQ_signalr = IQ_signal_3;

figure;

plot(IQ_signalr,'x');

% Параметры демодуляции 
  if NUMBER_PROFILE==1

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

          % h - модем QPSK

          mPos=4;

elseif NUMBER_PROFILE==2

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

          % h - модем QАМ-16

          % h - модем QPSK

          mPos=16;       

  end

h = modem.qamdemod(mPos);

h.OutputType = 'bit';

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

data_r = demodulate(h,IQ_signalr);

deintrlved_bits = reshape(data_r,128,1);

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

deintrlved_bits = matdeintrlv(deintrlved_bits,16,8);

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

received_L1=deintrlved_bits(2:end);

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

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

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;

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

received_mes_L2 = received_mes_L1(1:st.lenght_info);

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

TYPE_R=my_bi2de(received_mes_L2(1:3), 'left_msb');

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

ID_Tr=received_mes_L2(4:10);

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

DATA_R=received_mes_L2(11:14);

end

Программа, которая реализует сценарий рис.1 выглядит следующим образом:

clear;%очистка рабочей области

clc; %очистка командного окна

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

st=initSettings();

%% Формирование сообщения AP

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

% qpsk - 1

% qam-16 - 2

profile=1;

%Поле DATA = [1 2 3 4] содержит код команды управления

% 1 - активен (1)

% 2 - характер трафика пульсирующий(если да, то 1 )

% 3 - характер трафика постоянный(если да, то 1 )

% 4 - готов/не готов к приему сообщений(если да, то 1)

DATA=[0 0 0 0];

% Идентификатор терминала

ID_Term=[0 0 1 0 1 1 1];

% Типы каналов

% BCCH = 0

% ACH = 1

% TCH = 2

% AGCH = 3

% RACH = 4

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

% для передачи сообщения по радиоканалу

 phy_frame = transmitter_AP(st.agch, ID_Term, DATA, profile);

%% Наложение шума на блок символов

phy_frame_R=awgn(phy_frame,st.SNR,'measured');

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

 [TYPE_R, ID_Tr, DATA_R, detect] = receiver_T (phy_frame_R, profile);

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

%те же функции, что и передатчик АР

%Поле DATA = [1 2 3 4] содержит код команды управления

% 1 - активен (1)

% 2 - характер трафика пульсирующий(если да, то 1

% 3 - характер трафика постоянный(если да, то 1 )

% 4 - готов/не готов к приему сообщений(если да, то 1 )

DATA_2=[0 1 0 0];

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

% для передачи сообщения по радиоканалу

phy_frame_2=transmitter_AP(st.ach, ID_Term, DATA_2, profile);

phy_frame_R_2=awgn(phy_frame_2,st.SNR,'measured');   

% Прием сообщения AP

[Power_T, TYPE_R_2, ID_Tr, DATA_R_2, detect] = receiver_AP (phy_frame_R_2, profile);

end;

 Продемонстрируем результаты работы модели. После запуска программы в командном окне  среды MATLAB, появится сообщение, которое передает АР, по каналу AGCH, терминалу (рис.7). Так же пронаблюдаем сигнально-кодовое созвездие, сформированное АР (рис.8) и OFDM-символы во временной области, соответствующие передачи сообщения канала AGCH.

 

Рис.7. Информация, содержащаяся в сообщении, которое предаёт АР

 

Рис.8. Сигнально-кодовое созвездие, сформированное АР

 
  

Рис.9. OFDM-символы во временной области, соответствующие передачи сообщения канала AGCH.

             Далее, сформированное сообщение будет проходить через канал с АБГШ и поступает на приемник Т. Сигнально-кодовое созвездие после демодуляции OFDM-символов изображено на рис.10. В результате демодуляции полученных  IQ символов и функций, выполняемых приемником Т, терминалом получено сообщение (рис.7) 

 

Рис.10. Сигнально-кодовое созвездие после демодуляции OFDM-символов (ОСШ = 8дБ)

            После извлечения информации из сообщения, переданного АР, Т формирует сообщение «ответ» (рис. 11) На рис. 12. показаны OFDM-символы во временной области сообщения канала АСН.

  

Рис. 11. Сообщение передаваемое Т по каналу АСН.

  

Рис.12. OFDM-символы во временной области сообщения канала АСН.

      Далее, сформированное сообщение будет проходить через канал с АБГШ и поступает на приемник АР. Сигнально-кодовое созвездие после демодуляции OFDM-символов изображено на рис.13. В результате демодуляции полученных  IQ символов и функций, выполняемых приемником Т, терминалом получено сообщение (рис.11)

 

Рис.13. Сигнально-кодовое созвездие после демодуляции OFDM-символов (ОСШ = 8дБ).

В ходе моделирования были выполнены все поставленные задачи.

 

 

Список используемой литературы:

1. Мария Саутина «Радиосеть передачи данных. Часть 2» http://omoled.ru/publications/view/463

2. Мария Саутина «Радиосеть передачи данных. Часть 3» http://omoled.ru/publications/view/446