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

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

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

    В разрабатываемом программном модуле продемонстрируем передачу сообщения по каналу трафика. Покажем процесс формирование сообщения на канальном и физическом уровнях, передачу его по каналу с аддитивным белым гауссовким шумом и процесс восстановления информации из сообщения. 

    Основные модули, требующиеся для адекватной работы системы, показаны на рисунке ниже. 


  Рисунок  1.Передающая часть устройства.

  

    Блок управления в передающей части определяет профиль функционирования системы. В зависимости от качества канала свзяи заложены два профиля функционирования с разными скоростями кодирования, обеспечивающие большую или меньшую помехоустойчивость.  Канальный кодер это сверточный кодер, который производит добавление избыточных бит для эффективного исправления ошибок на приемной стороне. Перемежитель позволяет избавится от пакетных ошибок. Модулятор это QPSK модулятор, производящий квадратурную модуляцию.  После квадратурной модуляции происходит OFDM модуляция, в результате которой формируются OFDM символы. Канал связи это канала с аддитивным белым гауссовским шумом, отношение сигнал шум в котором позволит нам определить качество работы системы.

    Приемная часть имеет в своем составе те же самые модули, расположенные в обратном порядке, т.е. сначала будет выполнятся разбор OFDM  символа, затем демодуляция, деперемежение и канальное декодирование. Блок управления в приемной части служит для определения скорости канального кодирования, в зависимости от профиля функционирования системы.

    3. Экспериментальная часть

    3.1. Разработка модели системы в среде Matlab, демонстрирующей пример передачи сообщений между объектами верхнего уровня.

    Для того, чтобы продемонстрировать работу системы в среде MATLAB, произведем сборку и передачу пакета канала трафика. Структуры пакетов на канальном и физическом  уровнях приведены на рисунках ниже.  

Рисунок 2. Структура пакета с данными на канальном уровне

 

   Рисунок 3. Структура пакета физического уровня.
    OFDM символ будет состоять из 64 поднесущих. Из них часть будет отводиться на пилот-сигналы, а часть на передачу данных. Поднесущие, занимаемыми пилот-сигналами будут иметь номера 1, 15, 29, 40, 51, 64. Всего 6 поднесущих, оставшиеся 58 отводятся на передачу данных.

    Далее приведу текст программы, реализующей передающую часть системы. 

clear all;

close all;

 

global pilotIndexes;

global Nc;

%%

%%% Передающая часть %%%

% Полином CRC кода

poly=[1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0];

% Формирование пакета канального уровня

FL   = [1 0];% 2 бита. Поле начала пакета

ID    = [1 1 0 1]; % 4 бита. Номер терминала, которому предназаначается сообщение. Адрес, по своей сути

MAST  = [1 1 1]; % 3 бита. Поле управления.

NUMBER  =[0 0 0]; % 3 бита. Номер пакета

MAINDATA =[strtobin('Здравствуйте,уважаемые коллеги')']; % 256 бит

CRC  = [0 0 0 0 0 0]; % 6 бит

% Формирование пакета физического уровня

FCCH = [0 1 0 1 1 0 0 1 1 0 1 1 0 0] % 14 бит. Поле синхронизации

DATA = [FL ID MAST NUMBER MAINDATA CRC]%Поле данных, содержащее все поля пакета канального уровня. 272 бита. В дальнейшем будет закодировано помехоустойчивым кодом

NULI =  [0 0 0 0 0 0 0 0 0]; % 9 бит. Поле запоняется нулями, чтобы подготовить к работе сверточный кодер и обозначить границу пакета.

% Заполнение поля CRC, контрольной суммы

[q,r] = deconv([DATA CRC],poly);

r     = mod(abs(r),2);

CRC   = r(end-length(CRC)+1:end);

% Формирование пакета физического уровня

MSGL2 = [FCCH DATA CRC NULI];

 

% Помехоустойчивое кодирование с использованием сверточного кодера.

%Так как в системе предусмотрена смена профиля кодирования, заложим эту

%возможность в программу.

%Будут использоваться коды с различными скоростями, со скоростью 1/2 и 3/4.

cod_type = 0; % 0 -> 1/2 , 1-> 3/4

 

if cod_type == 0 % Означает, что включен профиль со скоростью 1/2

 

    t = poly2trellis(7, [141 71]); % задаем параметры кодера

 

else % Означает, что включен профиль со скоростью 3/4

 

    t = poly2trellis(7, [171 133]); %задаем параметры кодера

 

end;

 

codMSGL2ni = convenc(MSGL2,t);

 

% Перемежение

codMSGL2 = randintrlv(codMSGL2ni, 534);

    mPos = 4;%QPSK модуляция

   

Ngr  = 0; % количество неиспользуемых поднесущих и приходящихся на защитные интервалы 

% номера пилотных поднесущих в OFDM-символе

pilotIndexes = [1 15 29 40 51 64];

%Размерность OFDM-символа

Nc=64;

 

%Чтобы продемонстрировать передачу более наглядно, зададим большой блок бит, который займет несколько OFDM символов.

msg_length = length(codMSGL2);% длина передаваемого сообщения, битов

 

% количество поднесущих с данными

Ndata = Nc - length(pilotIndexes); % 58 поднесущих

% количество битов, передаваемых в одном OFDM-символе

s_length = Ndata * log2(mPos);

 

ns = floor(msg_length/s_length)+1; % Количество требуемых OFDM символом для передачи блока данных

 

% Необходимое количество незначащих бит,для компенасации разницы между расчетным количеством OFDM символов и количеством блоков в передаеваемом сообщении

fil_zero = zeros(1, ns*s_length - msg_length);

 

% Информация о том, какой профиль кодирования используется

   h = modem.pskmod(2); % Модулируется BPSK

   h.inputtype = 'bit';

   h.SymbolOrder = 'gray';

   h.PhaseOffset = 0;

   seqBarker = [0 0 0 1 1 1];

SERVMSG = zeros(1,Nc);

SERVMSG(pilotIndexes) = seqBarker;

IQ_SERV = modulate(h, SERVMSG');

% Формирование OFDM символа

serv = ifft(IQ_SERV);

% Cообщение канального уровня

data = codMSGL2;

 % Обозначение вида модуляции

        

 h = modem.pskmod(mPos); % QPSK

 

   % Параметры модуляции

   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);%Добавление шума. Число 25 означает отношение сигнал шум в системе.

%%

 

Приемная часть системы:

%%% -----Приемник----- %%%

% Выделение преамбулы, служебной информации и поля данных + FEC

long_trs = phy_framer(1:320);

servr = phy_framer(321:384);

OfdmFramer =  phy_framer(385:end);

 

% Обработка служебного сообщения с целью определения вида модуляции

IQ_SERVr = fft(servr');

h = modem.pskdemod(2);

h.SymbolOrder = 'gray';

h.PhaseOffset = 0;

h.OutputType = 'bit';

 

SERVMSGr= demodulate(h,IQ_SERVr);

mod_typer = SERVMSGr(2);

      

h = modem.pskdemod(4); % QPSK

 

h.SymbolOrder = 'gray';

h.PhaseOffset = 0;

h.OutputType = 'bit';

% Выполняем выделение 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,534);

 

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;

ADDr    = DATAr(1:length(ID));

TYPEr  = DATAr(length(ID)+(1:length(MAST)));

NUMBERr = DATAr(length(ID)+length(MAST)+(1:length(NUMBER)));

MAINDATAr= DATAr(length(ID)+length(MAST)+length(NUMBER)+(1:length(MAINDATA)));

'Здравствуйте,уважаемые коллеги'

 

    По итогам работы программы, были получены следующие результаты. Минимальное отношение сигнал шум, при которой система работает без ошибок, составляет 22 дБ для скорости кодирования ½ и 23 дБ для скорости кодирования ¾ . При меньших отношениях сигнал шум появляются ошибки.  Ниже приведены рисунки, полученные в ходе работы программы.

 

 Рисунок 4. OFDM символ

Рисунок 5. Сигнально-кодовое созвездие QPSK при отношении сигнал шум 23 дБ.


Выполнил: ст.гр.8110 Махотин А. А.


Список используемой литературы:
1. А.В. Бакке. «Лекции по курсу ССПО», Рязань, РГРТУ 2012

2. Скляр Б. «Цифровая связь. Теоретические основы и практическое применение». - М.: Вильямс, 2003 г.
 
http://omoled.ru/publications/view/326
http://omoled.ru/publications/view/343
http://omoled.ru/publications/view/362