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