В данном разделе необходимо разработать модель системы в среде Matlab, которая иллюстрировала бы элемент сценария, разработанного в п.1.5.6. В качестве примера рассмотрим взаимодействие АР и Т на этапе опроса и ответа Т на него (рис. 28).


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

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


Поле Type – тип канала; адрес Т – идентификатор терминала; DATA – информация, содержащая одну из команд, которые могут передаваться по каналу; CRC – поле для проверки целостности сообщения; Fill – заполнение нулями.

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

Поле DATA сообщения AGCH содержит в себе 4 нуля – команда «нужен ли канал». В сообщении ACH может быть 3 варианта информации:

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

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

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

Программа модели составлена с помощью функций Transmitter AP, Receiver T, Transmitter T, Receiver AP, которые содержат в себе все то, о чем говорилось в теоретической части.

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

function set = initSettings()

 

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

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

set.bcch = 0;

set.ach = 1;

set.tch = 2;

set.agch = 3;

set.rach = 4;

% ....

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

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

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

set.n=127;

 

set.k=78;

% Параметры CRC

% CRC-12 

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

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

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

set.lenght_info=62;

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

set.SNR=15;

 

Функция, реализующая передатчик АР. Блок-схема данной функции изображена на рис. 29.


Рис. 29. Блок-схема Передатчика АР

Непосредственно сама программа:

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

 

          

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

FILL=zeros(1,48);

% сборка части 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, 78)

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

          elseif NUMBER_PROFILE==2

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

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

          % h - модем QPSK

          mPos=16;       

  end

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

pilotIndexes = [6 20 34 48 0];

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

Ngr = 0;

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

Nc=52;

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

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

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

s_length = Ndata * log2(mPos);

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

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

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

Serv = zeros(1,16);

 

alternation_bits = [alternation_bits Serv];

 

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

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

if mPos ==16

h = modem.qammod(mPos);

elseif mPos==2

    h = modem.pskmod(mPos);

end

h.inputtype = 'bit';

IQ_signal = modulate(h, alternation_bits');

 

figure;

plot(IQ_signal,'xr');

 

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

ofdmFrame = makeOfdmFrame(IQ_signal, ns);

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

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

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-символа производится с использованием 64 поднесущих, из которых 48 информационных и 4 для передачи пилот-сигналов:


Для формирования OFDM-символа используется функция makeOFDMFRame.m:

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

 

Рассмотрим приемник терминала. Блок-схема изображена на рис. 30.


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

Программная реализация:

function [TYPE_R, ID_Tr, DATA_R, detect] = receiver_T ( msgIQ, NUMBER_PROFILE)

 

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

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

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

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

 

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

st=initSettings();

 

global pilotIndexes

global Nc

global ns;

global len_cp;

global len_ofdmSymbol;

 

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

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

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

elseif NUMBER_PROFILE==2

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

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

          % h - модем QPSK

          mPos=16;       

  end

   if mPos==16

   h = modem.qamdemod(mPos);

   elseif mPos==2

       h = modem.pskdemod(mPos);

   end

      

   h.OutputType = 'bit';

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

  data_r_1 = demodulate(h,IQ_signalr);

 

  data_r = data_r_1(1:128);

  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

Функции ReceiverAP.m и TransmitterT.m практически идентичны рассмотренным выше. Функция ReceiverAP.m выполняет измерение мощности сигнала.

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

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

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

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

st=initSettings();

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

 

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

% bpsk - 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);

 

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('получатель:'); disp(['терминал c ID']);disp(ID_Tr);

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

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

        if ID_Tr==[0 0 0 0 0 0 0]

        disp('Широковещательное сообщение');

        end;

        %при передачи сообщений канала 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);

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

                elseif [0 0 1 0]==DATA_R_2 

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

                   disp(ID_Tr);

                elseif [0 0 0 1]==DATA_R_2  

                   disp('Т с ID готово к приему сообщений' );

                   disp(ID_Tr);

                elseif [1 0 0 0]==DATA_R_2  

                   disp('Т с ID активен');

                   disp(ID_Tr);

                end

            else

            disp('Битовые ошибки: есть' );

            end;

            

        else

        disp('получатель:'); disp(' другой терминал');

        end

    else

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

    disp('TYPE'); disp('сообщение не рассматриваемого типа');   

    end

else

   disp('Битовые ошибки: нет' );

end;

Результаты выполнения:

Сообщение, полученное T

----------------------------------

Битовые ошибки: нет

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

TYPE

     3

 

Адресное сообщение

получатель:

терминал c ID

     0     0     1     0     1     1     1

 

DATA

     0     0     0     0

 

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

Сообщение, полученное AP

----------------------------------

Мощность принятого сигнала

  5.5010e-005

 

Битовые ошибки: есть

сообщение от Т с ID

     0     0     1     0     1     1     1

 

TYPE

     1

 

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

     0     0     1     0     1     1     1

 

Рис. 31. СКС, сформированное АР.


Рис. 32. OFDM-символ, сформированный АР.


Рис. 32. Созвездие BPSK после наложения шума в канале связи (ОСШ=9 дБ)


Рис.33. Сформированный Т OFDM-символ.