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

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

 Основой концепцией SDR является реализация модулей программным путем с использованием цифровых сигнальных процессоров, программируемых логических схем и др.

В разрабатываемой системе (рис. 22) передатчик включает в себя следующие блоки:

– Модуль управления. Осуществляет управление схемой и формирует сообщение канального уровня.

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

– Перемежитель. Осуществляет перестановку бит для борьбы с пакетными ошибками.

– Модулятор. Осуществляет модуляцию битового потока.

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

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

Приемник включает в себя следующие блоки (рис. 22):

– Синхронизация. Модуль необходимый для определения границ OFDM символов.

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

– Демодулятор. Преобразует модулированный сигнал в последовательность бит.

– Деперемежитель. Осуществляет операцию обратную перемежителю передатчика.

– Помехоустойчивый декодер. Осуществляет исправление ошибок.

– Модуль управления. Осуществляет анализ принятого пакета и управление модулями приемника.


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

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

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

Разрабатываемая модель функционирует согласно схемам передающего и приемного трактов, показанных выше (рис. 22).

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


Рисунок 23. Структура передаваемого пакета.

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

В модуле управления осуществляется:

– Выбор профиля на основании результатов работы блока проведения измерений.

%%% Передатчик %%%

% Выбор профиля осуществляется на основе результатов работы блока

% проведения измерений

mod_type = 0; % 0 -> BPSK , 1-> QAM-16

– Формируется  поле DATA, включающее: поле адреса, тип пакета, номер пакета и поле данных(рис. 23).

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

% Заполнение поля 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('просыпайся, тебе есть сообщение!')']; % 256 бит

– Заполняются поля: FL, DATA,CRC, ZER.

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

FL   = [1 0 1 0 1];% 5 бит

DATA = [ADR PTYPE NOMBER USRDATA] % 274 бита

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]; % 7 бит

% Заполение поля CRC

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

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

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

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

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

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

MSGL2 = [FL DATA CRC ZER]; % 302 бита

Блок помехоустойчивого кодирования.

% Помехоустойчивое кодирование

t = poly2trellis(7, [171 133]);

codMSGL2ni = convenc(MSGL2,t);

Операция перемежения.

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

codMSGL2 = randintrlv(codMSGL2ni, 534);

Выбор профиля.

% Выбор позиционности модуляции

if mod_type == 0 % BPSK

    mPos = 2;

else % QAM-16

    mPos = 16;

end;

Инициализация OFDM.

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

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

pilotIndexes = [1 14 26 39 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);

% формирование символа, перносящего служебную информацию

% Информация о применяемом профиле модулированна BPSK

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

   h = modem.pskmod(mPos); % BPSK профиль

   h.inputtype = 'bit';

   h.SymbolOrder = 'gray';

   h.PhaseOffset = pi/2;

   seqBarker = [0 0 0 1 1 1];

SERVMSG = zeros(1,Nc);

SERVMSG(pilotIndexes) = seqBarker;

SERVMSG(2) = mod_type; % Информация о виде модуляции

IQ_SERV = modulate(h, SERVMSG');

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

serv = ifft(IQ_SERV);

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

data = codMSGL2;

Инициализация модулятора.

 % выбор вида модуляции

   if mPos == 16

          h = modem.qammod(mPos); % QAM-16 профиль

   else           

       h = modem.pskmod(mPos); % BPSK профиль

   end;

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

   h.inputtype = 'bit';

   h.SymbolOrder = 'gray';

   h.PhaseOffset = 0;

   % дополнение блока битов сообщения нулями до той величины, которую

   % способны транспортировать рассчитанное выше количество OFDM-символов

   data = [data fil_zero]';

Модуляция сигнала.

   % собственно квадратурная модуляция

   IQ_signal = modulate(h, data);

   %формирование OFDM-символов и добавление символа, переносящего служебную

   %информацию

Формирование 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));

%%% Канал передачи данных %%%

 

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

Добавление белого гауссовского шума.

phy_framer =awgn(phy_frame,25);

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

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

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

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

long_trs = phy_framer(1:320);

servr = phy_framer(321:384);

OfdmFramer =  phy_framer(385:end);

Демодуляция служебного символа.

% Обработка служебного сообщения с целью определения вида модуляции (BPSK, QAM-16)

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

Принятие решения об использовании необходимого профиля.

if mod_typer == 1

    h = modem.qamdemod(16); % QAM-16 профиль

else           

    h = modem.pskdemod(2); % BPSK профиль

end;

Инициализация демодулятора.

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 = [];

Обратное OFDM преобразование.

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;

plot(IQ_signalr,'x');

Демодуляция сигнала.

datar = demodulate(h,IQ_signalr);

codMSGL2r = datar(1:end - length(fil_zero));


Рисунок 25. Созвездие BPSK сигнала после обратного преобразования OFDM.

Выполнение деперемежения.

codMSGL2nir =  randdeintrlv(codMSGL2r,534);

Выполнение помехоустойчивого декодирования.

MSGL2r = vitdec(codMSGL2nir,t,7,'cont','hard');

Выделение полей:  FL, DATA, CRC.

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;

Выделение полей: ADR, PTYPE, NUMBER, USRDATA.

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

bintostr(USRDATAr)

В результате выполнения разработанной модели были получены следующие результаты при ОСШ равном 25 дБ:

ans = Без ошибок!

ans = просыпайся, тебе есть сообщение!

 

 Ссылки на предыдущие статьи:

1. КП "Локальная радиосеть" Часть 1.

2. КП "Локальная радиосеть" Часть 2.

3. КП "Локальная радиосеть" Часть 3.