3.1. Разработка и описание блок-схемы алгоритма передачи сообщений L2 уровня по каналу связи в одном направлении.

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

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


                                          Рис.1 Передающая часть БС

На приемной стороне происходят обратные операции, рис.2.


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

Для подробного анализа действий, происходящих в процессе приема-передачи сообщения можно обратиться к комментариям программы п.3.2.

3.2 Разработка программной модели.

Программа:

%Размерность информационной части L2 пакета

inf_L3 = 50;

%Размер пакета L2 без учета CRC

length_msg_Lev2=64;

%Полный размер пакета L2

lenght_L2=96;

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

mPos = 4;

SNR = 10;

%Передаваемое сообщение. В качестве примера рассмотрим передачу сообщения

%по каналу SDCCH, сформированное случайным образом

message_KU = randint(1,500);

%Фрагментация L3 сообщения на блоки по 50 бит

pack_number = 1;  %счетчик количества передаваемых пакетов

for i = 1:inf_L3:length(message_KU)

    %фрагментирование L3-сообщения

    message(pack_number,1:inf_L3) = message_KU(i:i+inf_L3-1); 

    pack_number = pack_number+1;

end;

%Подготовка к расчету CRC

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

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

for i = 1:(pack_number-1)

Addr_ist=[0 0 0 0 0 0 0]; %Адрес БС

Addr_pol=[0 0 0 0 0 0 1]; %Адрес терминала-получателя сообщения 

L2(i,1:inf_L3) = [message(i,1:inf_L3)];

%Формирование пакетов L2 без CRC

msg_Lev2(i,:)=[Addr_ist Addr_pol L2(i,:)];

%Расчет CRC-кода

% подготовка массива для расчета CRC

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

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

   % поиск частного и остатка от деления

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

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

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

   % сборка части L2-сообщения: добавление к сообщению поля CRC и нулевых

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

   msg_Lev1(i,1:96) = [msg_Lev2(i,:) CRC];

   %Сформированные пакеты L2

   msg_Lev1_null(i,1:100) = [msg_Lev2(i,:) CRC 0 0 0 0];

end

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

for i = 1:(pack_number-1)

%Сверточное кодирование Витерби

trellis = poly2trellis(7,[171 133]);

[j, t]=istrellis(trellis);

%Формирование закодированных L2-пакетов

message_L1_FEC(i,1:2*100) = convenc(msg_Lev1_null(i, 1:100), trellis);

%Сверточное перемежение

%message_L1_FEC(i,:) = convintrlv(message_L1_FEC(i,:), 4, 3);

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

fl=[1 1]; %флаги

G=[0 0 0 0];%защитный интервал

equal=randint(1,10);%поле фильтра-эквалайзера

%Окончательная сборка пакета L1-уровня

message_L1_FULL(i,1:218) = [fl message_L1_FEC(i,1:200) equal fl G];

message_L1_FULL(i,:)= [message_L1_FULL(i,:)]';

%Модуляция QPSK

st = modem.pskmod(mPos);

st.InputType = 'bit';

st.PhaseOffset = pi/4;

IQ_signal(:,i) = modulate(st, [message_L1_FULL(i,:)]');

end

    plot(IQ_signal,'xb'); %Построение СКС сигнала на выходе передатчика

    ylim([-2 2]);

    xlim([-2 2]);

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

%%Передача сигнала по каналу связи с АБГШ

IQ_signal_noise = awgn(IQ_signal, SNR); %Зашумленный сигнал

%Построение СКС в приемнике терминала

plot(IQ_signal_noise,'x');

title('Скс, полученное в приемнике терминала');

%%Прием сигнала

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

for i = 1:(pack_number-1)

  st = modem.pskdemod(mPos);

  st.outputtype = 'bit';

  st.PhaseOffset = pi/4;

  %Прием L1-пакетов

  message_L1_FULL_Rx(i,:) = demodulate(st, IQ_signal_noise(:,i));

end

for i=1:(pack_number-1)

    %Разборка L1-пакетов

    fl1_Rx = message_L1_FULL_Rx(i,1:2); %флаг начала

    fl2_Rx = message_L1_FULL_Rx(i,213:214);%флаг конца

    equal_Rx = message_L1_FULL_Rx(i,203:212);%поле фильтра-эквалайзера

    G_Rx = message_L1_FULL_Rx(i,215:218);%Поле защитного интервала

    %Закодированные пакеты

    message_L1_FEC_Rx(i,1:200) =  message_L1_FULL_Rx(i,3:202);

    %Cверточное деперемежение битов

    %message_L1_FULL_Rx = convdeintrlv(message_L1_FULL_Rx, 4, 3);

end

%Сверточное декодирование

for i = (1:pack_number-1)

    %Сверточное декодирование Витерби

    trellis = poly2trellis(7,[171 133]);

    null=4;

    msg_Lev1_Rx_null(i,1:96+null) = vitdec(message_L1_FEC_Rx(i, 1:2*96+2*null), trellis, null, 'cont', 'hard');

end

%Устраним внесенную декодером Витерби задержку на null битов

for i = (1:pack_number-1)

    msg_Lev1_Rx(i,1:96) = msg_Lev1_Rx_null(i,(null+1):end);

end

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

i=0;

error=0;

%Поиск ошибок с помощью CRC

for i=1:(pack_number-1)  

    [q r]=deconv(msg_Lev1_Rx(i,:),poly);

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

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

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

     else

         %Кол-во найденных ошибок

         error = error + 1;

     end;

end

%Разборка L2-пакета

for i=1:(pack_number-1)

    Addr_ist_Rx = msg_Lev1_Rx(i,1:7);%Адрес источника

    Addr_pol_Rx = msg_Lev1_Rx(i,8:14);%Адрес терминала-получателя

%Информационная часть L3 в составе L2-пакета

    message_Rx(i,1:50) = msg_Lev1_Rx(i,15:64);

end

%Формирование L3-сообщения из пакетов L3

%Из пакетов L3 формируется переданное сообщение канала управления

for i = 1:(pack_number-1)

    message_KU_Rx((i*50-50+1):i*50) = message_Rx(i,1:50);

end;

%Вычисление вероятности битовой ошибки

[number, ratio] = biterr(message_KU, message_KU_Rx);

disp('Количество переданных битов:');

disp(length(message_KU));

disp('Количество принятых ошибочно битов:');

disp(number);

disp('Вероятность ошибки');

disp(ratio);

3.3 Исследование качества работы модели на предмет соответствия п.2.7 и 2.8.

В передатчике БС будет сформировано сигнально-кодовое созвездие, которое имеет следующий вид, рис 3.

                            Рис. 3 СКС полученное в передатчике БС

На приемной стороне при заданном SNR получим следующее СКС, рис. 4.

                         Рис. 4 СКС полученное в приемнике терминала при ОСШ=10 дБ

Результат выполнения модуля, рис. 5.


         Рис. 5 Результат выполнения программы при ОСШ=10 дБ

Результаты, представленные выше были получены при использовании отношении сигнал-шум равным 10 дБ. Как видно из рис. 5 при данном ОСШ не возникает ошибок при приеме сообщения.

При использовании заявленного в п.2.8.6 расчетного ОСШ = 6.5 дБ (при использовании сверточного кодирования) все же возникают немногочисленные ошибки. И вероятность ошибки не совпадает с заявленной 10-5.

Аналогичные иллюстрации при использовании SNR = 6.5 дБ.


                Рис. 6 СКС полученное в приемнике терминала при ОСШ = 6,5 дБ


            Рис. 7 Результат выполнения программы при ОСШ = 6,5 дБ

Даже исходя из того, что условия п.2.8.6 не выполняются, главной задачей разработанной программы является демонстрация алгоритмов обработки сообщений. При несколько завышенном SNR мы смогли убедится в том, что программа работает верно и с высокой точностью отражает процессы, происходящие при передаче и приеме информационного сообщения.

Список используемых источников:

1. Бакке А.В. - лекции по курсу «Системы и сети связи с подвижными объектами»

2. http://omoled.ru/publications/view/1186

3. http://omoled.ru/publications/view/1207

4. http://omoled.ru/publications/view/1209

5. http://omoled.ru/publications/view/1201