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

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

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

На физическом уровне производятся операции сверточного кодирования по Витерби, сверточного перемежения битов, модуляции QPSK и формирования OFDM символов. Диаграмма, иллюстрирующая работу передающей части БС представлена на рис. 3. 1.


Рис. 3. 1. Диаграмма передачи сообщения трафика БС. 

На приемной стороне осуществляются процессы, обратные происходящим на передающей стороне. Соответственно производится выделение полезной информации из OFDM символов, демодуляция QPSK сигнала, деперемежение и декодирование по Витерби. Диаграмма, иллюстрирующая процесс приема пакета трафика по каналу TCH приведена на рис. 3.2.


Рис. 3. 2. Диаграмма приема пакета мультимедийного трафика.

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

    Функции приемника и передатчика вызываются из основного скрипта Main.m. Текст скрипта Main.m:

clear all;

clc;


%Размерность пакета

global mes_len;

mes_len = 960;

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

global mPos;

mPos = 4;

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

global pilotIndexes;

pilotIndexes = [10 20 30 40];

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

global Nc;

Nc = 52;

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

Ndata = Nc - (length(pilotIndexes));

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

global s_length;

s_length = Ndata * log2(mPos);

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

global ns;

%Длина циклического префикса

global len_cp;

%Количество пакетов L2 уровня

global pack_number;

%Отношение сигнал/шум

SNR = 30;


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

%сформированное случайным образом.

message_traffic = randint(1,9600);


%фрагментация на L3 уровне

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

for i = 1:mes_len:length(message_traffic)

    message_L3(pack_number,1:mes_len) = message_traffic(i:i+mes_len-1);

    pack_number = pack_number+1;

end;

%L3 уровень. Добавление необходимых полей. В данном случае дополнительные

%поля не требуются пакету мультимедийного трафика, функция возвращает тот

%же массив, что подается на вход. Введение данной функции позволит

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

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

%сообщению L3 уровня

message_L3_add = add_L3(message_L3);


%Функция передатчика базовой станции

frame_L1 = Transmitter(message_L3_add, pack_number);


%Имитация передачи сообщения по каналу с АБГШ

frame_L1_Noise = awgn(frame_L1, SNR);


%Функция приемника терминала

message_traffic_Rx = Receiver(frame_L1_Noise);


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

[number, ratio] = biterr(message_traffic, message_traffic_Rx);


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

disp(length(message_traffic));

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

disp(number);

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

disp(ratio);


Текст функции передатчика Transmitter:

function frame_L1 = Transmitter(message_L3_add, pack_number)

    global ns;

    global mes_len;

    global mPos;

    global pilotIndexes;

    global Nc;

    global s_length;

frame_L1 = [];

for i = 1:(pack_number-1)


%     %На канальном уровне добавим служебное поле для сброса сверточного кодера

     message_L2(i,1:mes_len+4) = [message_L3_add(i,1:mes_len) 0 0 0 0];

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

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

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

    [j, t]=istrellis(trellis);

    message_L1_FEC(i,1:2*mes_len) = convenc(message_L2(i, 1:mes_len), trellis);


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

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


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

    ns = floor(length(message_L1_FEC(i,1:2*mes_len))/s_length);

    

    %Модуляция QPSK

    param = modem.pskmod(mPos);

    param.InputType = 'bit';

    param.PhaseOffset = pi/4;

    IQ_signal(1:mes_len, i) = modulate(param, message_L1_FEC(i, 1:2*mes_len)');


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

    ofdmFrame = makeOfdmFrame(IQ_signal(1:mes_len, i), ns);

    

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

    % Преамбула состоит из 2-х идентичных частей, 

    % представляющих собой последовательности CAZAC.

    seq_blk = cazac_seq(48,1);

    sync = [seq_blk seq_blk];


    %Дополнение каждого пакета преамбулой.

    %Формирование пакета физического уровня.

    frame_L1 = [sync ofdmFrame frame_L1];

end;


    %Построение СКС

    plot(IQ_signal,'xb');

    ylim([-3.1 3.1]);

    xlim([-3.1 3.1]);

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

    

    %Построение OFDM символов во временной области

    figure;

    plot(abs(ofdmFrame));

end

В процессе передачи происходит формирование OFDM символов. Текст функции формирования OFDM символов:

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

for i=1:Nofdm

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

        if (j==pilotIndexes(indexOfPilot))

            ofdmSymbol(j)=seqBarker(indexOfPilot);

            indexOfPilot=indexOfPilot+1;

            if indexOfPilot == (length(pilotIndexes)+1)

                indexOfPilot = 1;

            end;

        else

            ofdmSymbol(j) = dataMod(indexOfData+1);

            indexOfData=indexOfData+1;

%             if indexOfData == length(dataMod)

%                 indexOfData = 1;

%             end;

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

    %длина OFDM-символа

    len_ofdmSymbol=length(ofdmSymbol);

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

    ofdmFrame=[ofdmFrame ofdmSymbol];

    ofdmSymbol=[];

end;

end

Текст функции приемника терминала Receiver:

function [message_traffic_Rx] = Receiver(frame_L1_Noise)

    global ns;

    global mes_len;

    global mPos;

    global pilotIndexes;

    global Nc;

    global s_length;

    global len_cp;

    global pack_number;

    global len_ofdmSymbol;

    

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

p = 1;

g = 1;

len_OFDM_frame = len_ofdmSymbol*ns;

frame_L1_Rx_FFT = [];

for a = 0:1396:(length(frame_L1_Noise)-1396)

    %Обнаружение и устранение преамбулы

    frame_L1_Noise_noPreamb(p:p+len_OFDM_frame-1) = frame_L1_Noise((a+97):(a+96+len_OFDM_frame));

    frame_OFDM = frame_L1_Noise_noPreamb(p:p+len_OFDM_frame-1);

    p = p+len_OFDM_frame;

    k = 1;

    for i = 1:ns

   

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

        frame_OFDM_Rx(k:(k+Nc-1)) = frame_OFDM(i*(Nc+len_cp)-Nc+1:i*(Nc+len_cp));

        k=k+Nc;

   

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

        frame_OFDM_Rx_FFT(i*Nc-Nc+1:i*Nc) = fft(frame_OFDM_Rx(i*Nc-Nc+1:i*Nc));

        len_frame_OFDM_Rx_FFT = length(frame_OFDM_Rx_FFT);

    end;

    frame_L1_Rx_FFT = [frame_L1_Rx_FFT frame_OFDM_Rx_FFT];


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

indexOfPilot = 1;

k = 1;

    %frame_OFDM_Rx_FFT_ = frame_OFDM_Rx_FFT

    for i = 1:ns

        temp = frame_OFDM_Rx_FFT(i*Nc-Nc+1:(i*Nc));

        for j = 1:Nc

            if (j == pilotIndexes(indexOfPilot))

                indexOfPilot = indexOfPilot+1;

                if indexOfPilot == (length(pilotIndexes)+1)

                    indexOfPilot = 1;

                end;

            else

                IQ_signal_1(k,1) = temp(j);

                k = k+1;

            end;

        end;

    end;

    %IQ_signal_1 = IQ_signal_1';

    IQ_signal(1:mes_len,g) = IQ_signal_1;

    g = g+1;

    k = 1;

end;


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

plot(IQ_signal(1:end, 1:end),'x');

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


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

for i = 1:(pack_number-1)

    param = modem.pskdemod(mPos);

    param.outputtype = 'bit';

    param.PhaseOffset = pi/4;

    message_L1_FEC_Rx(i, 1:2*mes_len) = demodulate(param, IQ_signal(1:mes_len, i));

end;


for u = 1:(pack_number-1)

    temp1 = message_L1_FEC_Rx(u, 1:2*mes_len);

    message_L1_FEC_Rx_trans(pack_number-u, 1:2*mes_len) = temp1;

end;


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

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


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

for i = (1:pack_number-1) 

     message_L1_FEC_Rx(i, 1:2*mes_len+8) = [message_L1_FEC_Rx(i, 1:2*mes_len) 0 0 0 0 0 0 0 0];

end;


for i = (1:pack_number-1) 

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

    tblen = 4;

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

    message_L1_Rx(i,1:mes_len+tblen) = vitdec(message_L1_FEC_Rx(i, 1:2*mes_len+2*tblen), trellis, tblen, 'cont', 'hard');


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

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

     message_L2_Rx(i,1:mes_len) = message_L1_Rx(i,(tblen+1):end);

     %message_L2_Rx(i,1:mes_len) = message_L1_Rx(i,1:mes_len);

end;


for u = 1:(pack_number-1)

    temp1 = message_L2_Rx(u, 1:mes_len);

    message_L2_Rx_trans(pack_number-u, 1:mes_len) = temp1;

end;


%Сообщение канального уровня без изменений передается на уровень L3

%Так как отсутствуют поля, предназначенные для L2 уровня

message_L3_add = message_L2_Rx_trans;


%L3 уровень. Операция извлечения дополнительных полей L3.В данном случае дополнительные

%поля не требуются пакету мультимедийного трафика, функция возвращает тот

%же массив, что подается на вход. Введение данной функции позволит

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

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

%сообщению L3 уровня

message_L3_Rx = de_add_L3(message_L3_add);


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

for i = 1:(pack_number-1)

    message_traffic_Rx((i*mes_len-mes_len+1):i*mes_len) = message_L3_Rx(i,1:mes_len);

end;

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

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


Рис. 3. 3. СКС передатчика базовой станции.

         В результате формирования OFDM символов посредством добавления циклического префикса, равного ¼ передаваемого символа, получим следующий вид OFDM символов во временной области (рис. 3.4):


Рис. 3. 4. OFDM символы.

         В результате приема сообщения терминалом получим сигнально-кодовое созвездие, представленное на рис. 3.5.


Рис. 3. 5. СКС приемника терминала.

        

Итоговый результат выполнения программного модуля (рис. 3.6):


Рис. 3. 6. Результат работы программного модуля.

         Как видно по результатам выполнения, алгоритм работы программного модуля реализован верно и функционирует в соответствии с описанными в пп. 2.2.1-2.2.2 принципами. В данном случае отношение сигнал/шум было выбрано равным 30дБ, поскольку задачей программного модуля является иллюстрация процессов, происходящих при передаче базовой станцией и приеме терминалом сообщения мультимедийного трафика и демонстрация правильности функционирования алгоритмов обработки сообщений базовой станции и терминала. При выбранном отношении сигнал/шум и длине передаваемого сообщения ошибка может возникнуть только в алгоритмах обработки. Как видно из результатов выполнения программного модуля, алгоритмы обработки сообщений реализованы верно и с достаточной точностью отражают процессы, происходящие при передаче и приеме сообщения мультимедийного трафика.

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

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

2) Wikipedia. Статья "OFDM".

3) Wikipedia. Статья "Сверточный код".

4) Wikipedia. Статья "Алгоритм сверточного кодирования Витерби".

5) Wikipedia. Статья "Многолучевое распространение".

6) Статья "OFDM модуляция".

7) http://www.techeducator.ru/dexius-1216-1.html

8) КР "Высокоскоростной радиомост". Часть 2. Физический уровень.

9) Методические указания к лабораторной работе №4: "Исследование методов обработки сигналов в приемнике стандарта GSM"

10) Методические указания к лабораторной работе №1: "Исследование принципов организации канала передачи данных"

11) Радиосистема дистанционного видеоконтроля (Часть 4).

Ссылки на предыдущие публикации и соответствующий раздел форума:

1) http://radiolay.ru/viewtopic.php?f=83&t=457

2) Интерактивная радиосеть мультимедийного вещания. Часть 1.

3) Интерактивная радиосеть мультимедийного вещания. Часть 2. Проектирование радиосети. Канальный уровень.

4) Интерактивная радиосеть мультимедийного вещания. Часть 1. Исправленная.

5) Интерактивная радиосеть мультимедийного вещания. Часть 2. Проектирование радиосети. Канальный уровень. Исправленная.

6) Интерактивная радиосеть мультимедийного вещания. Часть 3. Проработка задач физического уровня.

7) Интерактивная радиосеть мультимедийного вещания. Часть 2. Проектирование радиосети. Канальный уровень. Исправленная еще раз.

8) Интерактивная радиосеть мультимедийного вещания. Часть 3. Проработка задач физического уровня. Исправленная.