Радиосистема дистанционного видеоконтроля.
Часть 4. Техническая часть.
(Лукашин И.В., РГРТУ, гр.9110)
В данной части проекта предложено описание разработанной в среде Matlab модели системы, демонстрирующей пример передачи сообщения между точкой доступа (ТД) и терминалом (Т) по каналу ССH/video. Назначение и структура сообщений этого канала была рассмотрена в [1]. Разработанная программа реализует формирование сообщения от ТД к Т. Передача этого сообщения осуществляется по каналу с АБГШ, прием сообщения Т, анализ принятой информации на предмет достоверности, если сообщение принято с ошибками то формируется запрос на повторную передачу.
Текст программы формально разделен на две части – «передающая» и «приёмная». На Рис. 1 представлена блок-схема передающей части. Слева изображен порядок происходящих процессов, справа – вариации обрабатываемых программой структурных единиц (пакетов и полей) как результат соответствующих процессов.
Рис. 1. Блок-схема передающей части.
Для начала рассмотрим функцию, устанавливающую параметры модели
set = initSettings()
% параметры модели
% позиционность модуляции - QAM
set.mPos = 4;
%Параметры помехоустойчивого кодека
%Для примера используется код БЧХ :
%Длина кодового слова
set.n=255;
%Размер кодируемого блока
set.k=187;
% Параметры CRC
%CRC-8
set.poly=[1 1 1 0 1 0 1 0 1];
[set.x set.y]=size(set.poly); %размерность полинома
%размер сообщения каналького уровня без учета CRC
set.lenght_info=179;
% ОСШ в канале связи
set.SNR=20;
Входными параметрами является тип сообщения (необходимо для реализации процедуры ARQ) и информационное поле DATA .
%Поле DATA содержит код команды управления
DATA=3052;
% Поле TYPE необходимо для реализации процедуры ARQ
% это поле необходимо Т для того чтобы знать
% это новое сообщение или повторно передаваемое
TYPE='new_message';
Рассмотрим функцию, реализующую передающую часть.
phy_frame = transmitter( TYPE , DATA )
% TYPE - поле которое необходимо Т для того чтобы знать
% это новое сообщение или повторно передаваемое.
% DATA - Поле DATA содержит код запрашиваемой услуги
% Установка параметров модели
st=initSettings();
global fil_zero
global Nc
global pilotIndexes
if TYPE == 'new_message'
tps=0;
elseif TYPE =='repeat_message'
tps=1;
end;
DATA= my_de2bi(DATA,'left_msb',178);
% ================== Канальный уровень ================================
% сборка части L2-сообщения
msg_Lev2 = [tps DATA];
% получение 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];
% ================== Физический уровень ================================
%% Помехоустойчивое кодирование
% Кодирование сообщения кодом БЧХ (255, 187)
code = encode(msg_Lev1,st.n,st.k,'bch/binary');
%добавление дополнительныхо бита для приведения размера сообщения к числу
%кратному 2 или 4 (следует из определения позиционности QPSK и QAM-16 модуляции
code_word = [0 code];
%Блочное перемежение
alternation_bits = matintrlv(code_word, 32, 8);
Передача одного OFDM символа будет осуществляться с использованием 32 поднесущих: 22 поднесущие дл передачи данных, 4 – для пилот сигнала, 5 – для использования защитных интервалов и 1 нулевая поднесущая для идентификации нулевой частоты OFDM сигнала. Структура поднесущих изображена на Рис. 2.
Рис. 2. Структура поднесущих (OFDM символов).
% номера пилотных поднесущих в OFDM-символе
pilotIndexes = [1 2 8 9 16 23 24 30 31 32];
% количество неиспользуемых поднесущих и приходящихся на защитные интервалы
Ngr = 0;
% Размерность OFDM-символа
Nc=32;
% количество поднесущих с данными
Ndata = Nc - (length(pilotIndexes));
% количество битов, передаваемых в одном OFDM-символе
s_length = Ndata * log2(st.mPos);
% Количество OFDM-символов
ns = floor(length(alternation_bits)/s_length)+1;
% размер передаваемого сообщения, после выхода с перемежителя
msg_length = length(alternation_bits);
% fil_zero - незначащие биты, это разница между тем
% количеством битов, что обеспечивает расчетное количество OFDM-символов, и
% количеством блоком в передаваемом сообщении
fil_zero = zeros(1, ns*s_length - msg_length);
% дополнение блока битов сообщения незначащими битами,
% это обеспечивает расчетное количество OFDM-символов
data = [alternation_bits fil_zero];
% Параметры модуляции
% h - модем QAM с позиционностью mPos
h = modem.qammod(st.mPos);
h.inputtype = 'bit';
IQ_signal = modulate(h, data');
figure(1);
plot(IQ_signal,'xr');
ylim([-3.1 3.1]);
xlim([-3.1 3.1]);
title('Сигнально-кодовое созвездие, полученное в передатчике')
На рис. 3 продемонстрирована сигнально-кодовая созвездие на выходе модулятора QPSK модулятора
Рисунок 3. СКС модулированного QPSK сигнала на выходе модулятора
%формирование OFDM-символов
ofdmFrame = makeOfdmFrame(IQ_signal, ns);
В начало каждого сформированного символа OFDM необходимо добавить циклический префикс. Размер циклического префикса составит ¼ часть длины символа. Таким образом один OFDM символ будет передаваться с использованием 22 поднесущих.
function ofdmFrame = makeOfdmFrame(dataMod, Nofdm)
global pilotIndexes;
global Nc;
%символы пилотных поднесущих промодулированы псевдослучайным кодом (для
%примера, код Баркера), как результат - 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);
% добавление ЦП в начало OFDM-символа (64 IQ-символа)
ofdmSymbol=[cp ofdmSymbol];
% Сборка информационных OFDM-символов пакета физического уровня
ofdmFrame=[ofdmFrame ofdmSymbol];
ofdmSymbol=[];
end
end
Далее, происходит формирование преамбулы.
%Формирование символов преамбулы
%Короткие символы - для подстройки частоты (синхронизация по частоте)
ShortTrainingSymbols = 5*[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);
% выделение первых 16 отсчетов
Strs = short_symbols(1:16);
% Формирование 10 кототких символов преамбулы на основе выбранного набора
short_trs= [Strs Strs Strs Strs Strs Strs Strs Strs Strs Strs];
%длинный символ преамбулы
LongTrainingSymbols=3*[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);
long_trs = [long_symbol(64-2*16+1:64) long_symbol long_symbol];
% Пакет физического уровня (символы преамбулы и OFDM-символы)
phy_frame = [short_trs long_trs ofdmFrame];
figure(2);
plot(abs(phy_frame));
end
Сформированный OFDM кадр показан на Рис. 4.
Рис.4. Сформированный OFDM кадр.
Моделирование передачи сигнала по каналу связи, осуществим с помощью функции phy_frame_R=awgn(phy_frame,st.SNR,'measured').
Переданное ТД сообщение канала управления ССH/video должно быть принято и обработано Т. Вначале происходит выделение из принятого сигнала символов OFDM, содержащих непосредственно передаваемые данные. На Рис. 5 представлена блок-схема приёмной части. Как и в случае с блок-схемой передающей части, слева изображен порядок происходящих процессов, справа – вариации обрабатываемых программой структурных единиц (сообщений и полей) как результат соответствующих процессов
Рис. 5. Блок-схема приемной части.
Рассмотрим функцию, реализующую приемную часть. Входным параметром является сигнал с выхода канала связи
[ TYPE_R, DATA_R ] = receiver ( phy_frame_R ).
function [ TYPE_R, DATA_R ] = receiver ( msgIQ )
%Поле DATA_R содержит код принятой команды управления
%Поле TYPE_R необходимо для реализации процедуры ARQ
% это поле необходимо Т для того чтобы знать
% это новое сообщение или повторно передаваемое
%% Установка параметров модели
st=initSettings();
global fil_zero;
global pilotIndexes;
global Nc;
% ================== Физический уровень ================================
% Выделение преамбулы, и поля данных
phy_frame_R = msgIQ(321:length(msgIQ));
ofdmFrame_R = phy_frame_R(1:end);
%Выделение промодулированных данных из принятого OFDM сигнала
%удаление циклического префикса из OFDM символов
OSr = [];
OSpr = [];
IQ_signalr = [];
% вектор, необходимый для устранения пилот сигналов
%pilotIndexes = [1 2 8 9 16 23 24 30 31 32];
nopilotIndexes = [3:7 10:15 17:22 25:29];
for i = 0 : (length(ofdmFrame_R)/40)-1
% убираем циклический префикс
% 8 - length(cp)
% 40 - length(ofdmSymbol)
% смотри функцию makeOfdmFrame
IQ_sig = ofdmFrame_R((8:40)+ i*40);
OSr = [OSr; IQ_sig];
% переход d частотную область
IQ_sign = fft(IQ_sig);
OSpr = [OSpr; IQ_sign];
% убираем пилот сигналы и Формируем поток данных
IQ_signalr = [IQ_signalr IQ_sign(nopilotIndexes)];
end;
figure(3);
plot(IQ_signalr,'x');
title('Сигнально-кодовое созвездие, полученное в приемнике');
На Рис.6 продемонстрирована сигнально-кодовая созвездие на входе демодулятора QPSK модулятора.
Рис. 6. СКС модулированного QPSK сигнала на входе демодулятора при ОСШ=20дБ
После выделения промодулированных данных из принятого OFDM сигнала происходит процедура демодуляции, деперемежения, декодирование.
% % Параметры демодуляции
h = modem.qamdemod(st.mPos);
h.OutputType = 'bit';
% собственно демодуляция
s = demodulate(h,IQ_signalr);
data_r = s(1:end - length(fil_zero));
deintrlved_bits = reshape(data_r,256,1);
% Блочное деперемежение
deintrlved_bits = matdeintrlv(deintrlved_bits,32,8);
%Устранение лишнего нулевого бита
received_L1=deintrlved_bits(2:end);
% Помехоустойчивое декодирование
%Декодирование сообщения кодом БЧХ (255,187)
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;
if detect == 0
% Собственно принятое сообщение
received_mes_L2 = received_mes_L1(1:st.lenght_info);
% выделение поля TYPE_R
tps_R=received_mes_L2(1);
if tps_R == 0
TYPE_R='new_message';
elseif tps_R == 1
TYPE_R='repeat_message';
end;
% выделение поля DATA_R
DATA_R=received_mes_L2(2:st.lenght_info);
DATA_R=my_bi2de(DATA_R, 'left_msb');
disp('============================');
disp('Тип принятого сообщения');
disp(TYPE_R);
disp('Команда');
disp(DATA_R);
disp('============================');
elseif detect == 1
TYPE_R=[];
DATA_R=[];
disp('============================');
disp('Требуется повторная передача');
disp('============================');
end
end
После работы механизма CRC по проверке принятого сообщения на ошибки, в случае отсутствия таковых, программа выводит сообщение типа:
============================
Тип принятого сообщения
new_message
Команда
3052
============================.
Если механизм CRC выявил ошибки в принятых данных, то программа выводит сообщение типа:
============================
Требуется повторная передача
============================.
В результате моделирования было установлено, что безошибочная доставка сообщения при выборе QPSK модуляции возможна при ОСШ не менее 8 дБ, а при QAM-16 – не менее 9 дБ. Полученные результаты несколько отличаются от теоретических результатов, полученных в [1]. Для определения более точных результатов необходимо повторить цикл передачи приема порядка 100 000 раз.
Список литературы.
1) Лукашин И.В. Радиосистема дистанционного видеоконтроля (Часть 2)
http://omoled.ru/publications/view/434
2) Лукашин И.В. Радиосистема дистанционного видеоконтроля (Часть 3)
http://omoled.ru/publications/view/447
3) С.А.Милованов - Система сбора данных с подвижных станций (Часть 4)
http://omoled.ru/publications/view/348
4) К. Ламтев Система сбора данных с подвижных станций. Часть 4
http://omoled.ru/publications/view/347
5) А. Ночная. КП на тему "Локальная радиосеть" п. 2 - п.3 (часть №4)
http://omoled.ru/publications/view/340
P. S. Огромная благодарность К. Ламтеву и А. Ночной за предоставленные коды программы.