3.2. Разработка программной модели по блок-схеме п.3.1
3.3. Исследование качества работы модели на предмет соответствия п.2.7, 2.8.
3. Экспериментальная часть. Разработка
и экспериментальное исследование программной модели канала передачи данных.
3.1. Разработка и описание блок-схемы алгоритма передачи сообщений L2
уровня по каналу связи в одном направлении.
Разработанный программный модуль
иллюстрирует процесс передачи базовой станцией одного пакета мультимедийного
трафика по каналу TCH 2,
и процесс приема и декодирования этого пакета на стороне терминала.
На канальном уровне сообщение
трафика дополняется полем размерностью 2 бита, содержащим информацию о номере
канала. Так как у терминала отсутствует возможность запросить повторную передачу
пакета мультимедийного трафика, поле CRC к пакету не добавляется.
На физическом уровне производятся
операции сверточного кодирования по Витерби, сверточного перемежения битов,
модуляции QPSK и формирования OFDM символов. Диаграмма, иллюстрирующая
работу передающей части БС представлена на рис. 3. 1.
Рис. 3. 1. Диаграмма передачи сообщения трафика БС.
Код функции настройки параметров модели:
function set = initSettings()
% параметры модели
% позиционность модуляции QPSK
set.mPos = 4;
%размер сообщения каналького уровня
set.lenght_traffic=96;
end
Код функции передатчика:
function [phy_frame] = Transmitter (message_traffic);
% Установка параметров модели
st=initSettings();
global Nc
global pilotIndexes
global ns;
disp('===============================================');
disp('сообщение, передаваемое Т');
disp('передаваемое сообщение:'); disp(message_traffic);
bit_number = 1;
symbol_number = 1;
DATA_2 = double(message_traffic);
DATA = dec2bin(DATA_2);
f = numel(DATA);
for i = 1:f
if bit_number == 8
bit_number = 1;
symbol_number = symbol_number + 1;
end;
DATA_1 (i) = str2num(DATA(symbol_number,bit_number));
bit_number = bit_number + 1;
end
%DATA_3 = bin2dec(DATA_1);
% ================== Канальный уровень ================================
% сборка части L2-сообщения
DATA_4 = DATA_1(1:126);
% DATA_1 = message_traffic;
channel_num = [0 1]; %для примера возьмем номер мультимедийного канала - 2
msg_Lev2 = [channel_num DATA_4];
% ================== Физический уровень ================================
%% Помехоустойчивое кодирование
%Сверточное кодирование
trellis = poly2trellis(7,[171 133]);
code = convenc(msg_Lev2,trellis);
%Длина сообщения на выходе сверточного кодера
msg_lenght = length (code);
%сверточное перемежение
code = convintrlv(code, 4, 3);
% номера пилотных поднесyщих в OFDM-символе
pilotIndexes = [10 20];
% количество неиспользуемых поднесущих и приходящихся на защитные интервалы
Ngr = 0;
% Размерность OFDM-символа
Nc = 36;
% количество поднесущих с данными
Ndata = Nc - (length(pilotIndexes));
% количество битов, передаваемых в одном OFDM-символе
s_length = Ndata * log2(st.mPos);
% Количество OFDM-символов
ns = floor(length(code)/s_length);
% Параметры модуляции
% h - модем QPSK с позиционностью mPos
h = modem.pskmod(st.mPos);
h.inputtype = 'bit';
IQ_signal = modulate(h, code');
% построение СКС
plot(IQ_signal,'xr');
ylim([-3.1 3.1]);
xlim([-3.1 3.1]);
title('Сигнально-кодовое созвездие, полученное в передатчике базовой станции');
%формирование OFDM-символов
ofdmFrame = makeOfdmFrame(IQ_signal, ns);
% Дополнение пакета синхросимволом - преамбулой.
% Преамбула состоит из 2-х идентичных частей,
% представляющих собой последовательности CAZAC.
seq_blk = cazac_seq(48,1);
sync = [seq_blk seq_blk];
%Пакет физического уровня (символ преамбулы и OFDM-символы)
phy_frame = [sync ofdmFrame];
figure;
plot(abs(phy_frame));
end
В передатчике осуществляется формирование OFDM символов. Код функции формирования OFDM символов:
function ofdmFrame = makeOfdmFrame(dataMod, Nofdm)
global pilotIndexes;
global Nc;
global len_cp;
global len_ofdmSymbol;
global len_ofdmFrame;
%символы пилотных поднесущих промодулированы псевдослучайным кодом (для
%примера, код Баркера), как результат - 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;
if indexOfPilot == 3
indexOfPilot = 1;
end;
else
ofdmSymbol(j) = dataMod(indexOfData);
indexOfData=indexOfData+1;
end
end
indexOfPilot=1;
ofdmSymbol = ifft(ofdmSymbol);
%формирование циклического префикса, как часть OFDM-символа,
%используется 1/4 часть символа
cp = ofdmSymbol(Nc-floor(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
len_ofdmFrame = length (ofdmFrame);
end
На приемной стороне
осуществляются процессы, обратные происходящим на передающей стороне. Соответственно
производится выделение полезной информации из OFDM символов,
демодуляция QPSK сигнала, деперемежение и декодирование по Витерби, после
чего на канальном уровне осуществляется выделение номера канала трафика и
информационной части сообщения. Диаграмма, иллюстрирующая процесс приема пакета
трафика по каналу TCH 2
приведена на рис. 3.2.
Рис. 3. 2. Диаграмма приема пакета мультимедийного трафика.
Код функции приемника:
function [addr, message] = Receiver ( phy_frame );
global pilotIndexes
global Nc
global ns;
global len_cp;
global len_ofdmSymbol;
global len_ofdmFrame;
%% Установка параметров модели
st=initSettings();
% ================== Физический уровень ================================
% Выделение преамбулы, и поля данных
ofdmFrame_Rec = phy_frame(97:length(phy_frame));
ofdmFrame_Rec = ofdmFrame_Rec(1:end);
figure;
hold on;
%for i=1:4
%ofdmFrame_R((i-1)*Nc:(i-1)*Nc+Nc)=ofdmFrame_Rec(1+(i-1)*len_ofdmSymbol:len_ofdmSymbol*i);
%end;
%Выделение промодулированных данных из принятого
% OFDM сигнала
% Удаление циклического префикса из OFDM символов
n=1;
%ofdmFrame_R = ofdmFrame_Rec(1+(i-1)*len_ofdmSymbol:len_ofdmSymbol*i);
%ofdmSymbol(i:i+Nc-1) = ofdmFrame_R(n+len_cp:n+len_ofdmSymbol-1);
for b=1:Nc:ns*Nc-Nc+1
ofdmSymbol(b:b+Nc-1) = ofdmFrame_Rec(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;
if indexOfPilot == 3
indexOfPilot = 1;
end;
else
Q_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;
plot(IQ_signalr,'x');
title('Сигнально-кодовое созвездие, полученное в приемнике терминала');
% % Параметры демодуляции
h = modem.pskdemod(st.mPos);
h.OutputType = 'bit';
% собственно демодуляция
data_r = demodulate(h,IQ_signalr);
deintrlved_bits = reshape(data_r,numel(data_r),1);
deintrlved_bits = deintrlved_bits';
% Сверточное деперемежение
deintrlved_bits = convdeintrlv(deintrlved_bits, 4, 3);
%Устранение задержки, полученной при сверточном деперемежении
d = 4*(4-1)*3;
received_L1=deintrlved_bits(d+1:end);
% Помехоустойчивое декодирование
% Декодирование по Витерби
trellis = poly2trellis(7,[171 133]);
decode_word = vitdec(received_L1,trellis,34,'cont','hard');
received_mes_L1 = decode_word';
received_mes_L1 = received_mes_L1(34:length(received_mes_L1));
% ================== Канальный уровень ================================
% выделение номера канала
addr = received_mes_L1(1:2);
% выделение полезной информации
message_1 = received_mes_L1(3:length(received_mes_L1));
message = dec2bin(message_1);
symbol_number=1;
for i=1:7:(length(message)-7)
for bit_number=0:6
signal_ascii_bin(symbol_number,bit_number+1)=message(i+bit_number);
end;
symbol_number=symbol_number+1;
end;
signal_ascii=bin2dec(signal_ascii_bin);
message_final=char(signal_ascii);
%end;
%вывод результатов
disp('принято сообщение:'); disp(message_final');
disp('номер канала:'); disp(addr);
disp('===============================================');
end
Функции приемника и передатчика вызываются из главной части программного стенда. Код главной части программного стенда Main.m:
clear;%очистка рабочей области
clc; %очистка командного окна
% Установка параметров модели
st=initSettings();
%message_traffic = randint(1,96);
message_traffic = ('radiostation 2 chan');
%% Передатчик БС
phy_frame_1 = Transmitter (message_traffic);
%% Наложение шума на сигнал
% В роли ОСШ выступает случайная величина
SNR=randi(16);
phy_frame_R_1=awgn(phy_frame_1,SNR,'measured');
%% Приемник Т
[address, message] = Receiver (phy_frame_R_1);
3.2. Исследование качества работы модели на предмет соответствия п.2.7,
2.8.
В качестве примера сообщения
мультимедийного трафика используем сообщение «radiostation 2 chan». При передаче этого
сообщения в передатчике БС будет сформировано сигнально-кодовое созвездие,
представленное на рис. 3.3.
Рис. 3. 3. СКС передатчика базовой станции.
В результате
формирования OFDM символов посредством добавления циклического префикса,
равного ¼ передаваемого символа, получим следующий вид OFDM символов во
временной области (рис. 3.4):
Рис. 3. 4. OFDM
символы.
В результате
приема сообщения терминалом получим сигнально-кодовое созвездие, представленное
на рис. 3.5.
Рис. 3. 5. СКС приемника терминала.
Итоговый
результат выполнения программного модуля (рис. 3.6):
Рис. 3. 6. Результат работы программного модуля.
Как видно по
результатам выполнения, алгоритм работы программного модуля реализован верно, и
причина неправильного приема информационной части связана со сложными шумовыми
условиями в канале (ОСШ = 3дБ), при этом номер канала мультимедийного трафика
был принят верно.
Список используемых источников:
1) Бакке А.В. - лекции по курсу «Системы и сети связи с подвижными объектами».
3) Wikipedia. Статья "Сверточный код".
4) Wikipedia. Статья "Алгоритм сверточного кодирования Витерби".
5) Wikipedia. Статья "Многолучевое распространение".
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.
4) Интерактивная радиосеть мультимедийного вещания. Часть 1. Исправленная.
6) Интерактивная радиосеть мультимедийного вещания. Часть 3. Проработка задач физического уровня.