2.1. Разработка функциональных схем передающего и приемного трактов физического уровня – на основе концепции SDR (Software Defined Radio). Назначение модулей схемы.
В разрабатываемой системе передатчик включает в себя:
1. Модуль управления. Отвечает за управление схемой
2. Помехоустойчивый кодер. Он вносит избыточность в информационный поток.
3. Модулятор.
4. Перемежитель.
5.OFDM. Формирует многочастотный сигнал.
6.Преамбула. Осуществляет формирование сигнала для синхронизации приемника.
Приёмник включает в себя:
1.СинхронизацияОтвечает за определения границ OFDM символов.
2.OFDM. Осуществляет обратное преобразование многочастотного сигнала.
4.Деперемежитель.
5.Помехоустойчивый декодер.
6. Модуль управления. Отвечает за управление модулями приемника.

3. Экспериментальная часть.
3.1. Разработка модели в среде Matlab, демонстрирующей пример передачи сообщений между объектами верхнего уровня
Рис2. Структура передаваемого пакета.
Формирование поле DATA:
ADR = [1 1 0 1 1 0]; % 6 бит
PTYPE = [1 1 1 1 1 1]; % 6 бит
NOMBER =[0 0 0 0 0 0]; % 6 бит
USRDATA =[strtobin('Терминал №... есть данные, принимай.')'];
% Формирование окончательного пакета
FL = [1 0 1 0 1];% 5 бит
DATA = [ADR PTYPE NOMBER USRDATA] % 564 бита
CRC = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; % 16 бит
ZER = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; % 16 бит
% Заполение поля CRC
[q,r] = deconv([DATA CRC],poly);
r = mod(abs(r),2);
CRC = r(end-length(CRC)+1:end);
% Формирование пакета физического уровня
MSGL2 = [FL DATA CRC ZER]; % 600 бит
% Помехоустойчивое кодирование
t = poly2trellis(7, [171 133]);
codMSGL2ni = convenc(MSGL2,t);
% Перемежение
codMSGL2 = randintrlv(codMSGL2ni, 534);
mPos = 16;
Ngr = 0; % количество нподнесущих которые не используются
% номера пилотных поднесущих в OFDM-символе
pilotIndexes = [1 14 26 39 51 64 72 84 96];
%Размерность OFDM-символа
Nc=96;
msg_length = length(codMSGL2);% длина передаваемого сообщения, битов
% количество поднесущих с данными
Ndata = Nc - length(pilotIndexes); % 96 поднесущих
% количество битов, передаваемых в одном OFDM-символе
s_length = Ndata * log2(mPos); %
ns = floor(msg_length/s_length)+1; % сколько потребуется OFDM-символов
fil_zero = zeros(1, ns*s_length - msg_length);
IQ_SERV = modulate(h, SERVMSG');
% Формирование OFDM символа
serv = ifft(IQ_SERV);
% Cообщение канального уровня
data = codMSGL2;
h = modem.qammod(mPos); % QAM-16 профиль
% Параметры модуляции
h.inputtype = 'bit';
h.SymbolOrder = 'gray';
h.PhaseOffset = 0;
% дополнение блока битов сообщения нулями до той величины, которую
% способны транспортировать рассчитанное выше количество OFDM-символов
data = [data fil_zero]';
% собственно квадратурная модуляция
IQ_signal = modulate(h, data);
%формирование OFDM-символов и добавление символа, переносящего служебную
%информацию
[mof,OS,OSf,OSp] = makeOfdmFrame(IQ_signal, ns);
ofdmFrame =[serv' mof];
%формирование символов преамбулы
%Короткие символы - для подстройки частоты (синхронизация по частоте)
ShortTrainingSymbols = sqrt(13/6)*[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=[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];
% plot(abs(phy_frame));
%%% Канал передачи данных %%%
figure(1);
plot(abs(phy_frame));
phy_framer =awgn(phy_frame,25);
%%% Приемник %%%
% Выделение преамбулы, служебной информации и поля данных + FEC
long_trs = phy_framer(1:320);
servr = phy_framer(321:384);
OfdmFramer = phy_framer(385:end);
I
% Выполняем выделение OFDM символов из общего потока
IQ_signalr = [];
% вектор, необходимый для устранения пилот сигналов
nopilotIndexes = [2:13 15:25 27:38 40:50 52:63];
OSr = [];
OSpr = [];
for i = 0 : (length(OfdmFramer)/68)-1
% убираем префикс
IQ_sig = OfdmFramer((5:68)+ i*68);
OSr = [OSr; IQ_sig];
% переход к частотной области
IQ_sign = fft(IQ_sig);
OSpr = [OSpr; IQ_sign];
% убираем пилот сигналы и Формируем поток данных
IQ_signalr = [IQ_signalr IQ_sign(nopilotIndexes)];
end;
figure(3);
plot(IQ_signalr,'x');
datar = demodulate(h,IQ_signalr);
codMSGL2r = datar(1:end - length(fil_zero));
codMSGL2nir = randdeintrlv(codMSGL2r,600);
MSGL2r = vitdec(codMSGL2nir,t,7,'cont','hard');
MSGL2r = MSGL2r(8:end);
FLr = MSGL2r(1:length(FL));
DATAr = MSGL2r(length(FL)+(1:length(DATA)));
CRCr = MSGL2r(length(FL)+length(DATA)+(1:length(CRC)));
% ПРоверка пакета на наличие ошибок
[q r]=deconv([DATAr CRCr], poly);
% Проверка остатка
r=mod(abs(r),2);
if r == zeros(1,length([DATAr CRCr]))
detect=0;% ошибок нет
'Без ошибок!'
else
detect=1;% обнаружены ошибки
'Есть ошибки!'
end;
ADRr = DATAr(1:length(ADR));
PTYPEr = DATAr(length(ADR)+(1:length(PTYPE)));
NOMBERr = DATAr(length(ADR)+length(PTYPE)+(1:length(NOMBER)));
USRDATAr= DATAr(length(ADR)+length(PTYPE)+length(NOMBER)+(1:length(USRDATA)));
'Терминал №... есть данные, принимай.'


Рис4. После обратного преобразования OFDM.
1. А.В. Бакке. «Лекции по курсу ССПО».