2. Техническая часть.

2.1. Разработка функциональных схем передающего и приемного трактов физического уровня – на основе концепции SDR (Software Defined Radio). Назначение модулей схемы.

 

В разрабатываемой системе  передатчик включает в себя:

1. Модуль  управления. Отвечает за управление схемой

2. Помехоустойчивый кодер. Он  вносит избыточность в информационный поток.

3.  Модулятор.

4. Перемежитель.

5.OFDM. Формирует многочастотный сигнал.

6.Преамбула. Осуществляет формирование сигнала для синхронизации приемника.

 

Приёмник включает в себя:

 

1.СинхронизацияОтвечает за определения границ OFDM символов.

2.OFDM. Осуществляет обратное преобразование многочастотного сигнала.

3.Демодулятор.

4.Деперемежитель.

5.Помехоустойчивый декодер.

6. Модуль управления. Отвечает за  управление модулями приемника.

Рисунок 1. Функциональная схема передающего и приёмного трактов.

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

'Терминал №... есть данные, принимай.'


Рис 3.  Временная реализация пакета физического уровня

Рис4. После обратного преобразования OFDM.

Список используемой литературы:
1. А.В. Бакке. «Лекции по курсу ССПО».
2. Скляр Б. «Цифровая связь. Теоретические основы и практическое применение». - М.: Вильямс, 2003 
3. http://omoled.ru/publications/view/341
4.http://omoled.ru/publications/view/299
5. http://omoled.ru/publications/view/327
6. http://omoled.ru/publications/view/351