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

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

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

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

    Рассмотрим основные модули программы (рис. 1).



Рисунок 1. Функциональная схема основных модулей

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

    Далее смоделирован канал связи, который подвержен воздействию AWGN. В данном блоке производится оценка качества работы системы путем изменения ОСШ.

    Наконец, принимающая часть осуществляет синхронизацию, определение границ OFDM символов. Затем, соответственно, демодуляцию и деперемежение. А в управляющем модуле проводится анализ принятого пакета. 


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

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

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


Рисунок 2. Структура передаваемого пакета (в данном случае для QPSK)

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


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

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

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

  • Формирование поля DATA (рис. 2).

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

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

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

TYPE  = [1 1 1 ]; % 3 бита

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

MAINDATA =[strtobin('Приготовиться к приему сообщения терминалу №...')']; % 256 бит

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

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

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

DATA = [ADD TYPE NUMBER MAINDATA] % 270 бит

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

TB =  [0 0 0 0 0 0 0]; % 7 бит

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

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

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

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

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

MSGL2 = [FL DATA CRC TB]; % 300 бит

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

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

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

codMSGL2ni = convenc(MSGL2,t);

  • Перемежение.

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

codMSGL2 = randintrlv(codMSGL2ni, 534);

  • Выбор модуляции

if mod_type == 0 % QPSK

    mPos = 4; % позиционность модуляции

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); % QPSK профиль

   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); % QPSK профиль

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

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

% Канал связи


Рисунок 3. Временные реализации пакетов физического уровня QPSK (слева) и QAM-16 (справа)

  • Добавления AWGN

phy_framer =awgn(phy_frame,21);

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

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

 

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

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

long_trs = phy_framer(1:320);

servr = phy_framer(321:384);

OfdmFramer =  phy_framer(385:end); 

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

% Обработка служебного сообщения с целью определения вида модуляции (QPSK, 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); % QPSK профиль

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


Рисунок 3. СКС QPSK при ОСШ=25дБ (слева) и QAM-16 при ОСШ=22дБ (слева)

    При построении сигнально-кодовых созвездий (рис.3) были выбраны минимальные значения ОСШ, при которых не возникают ошибки.

  • Деперемежение

    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;

    • Выделение полей ADD, TYPE, NUMBER, MAINDATA

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

    TYPEr  = DATAr(length(ADD)+(1:length(TYPE)));

    NUMBERr = DATAr(length(ADD)+length(TYPE)+(1:length(NUMBER)));

    MAINDATAr= DATAr(length(ADD)+length(TYPE)+length(NUMBER)+(1:length(MAINDATA)));

    'Приготовиться к приему сообщения терминалу №...'

        Разумеется, терминал получает сообщение не в текстовом виде, а в виде сигнала. В программе это реализовано для наглядности процесса работы.

    ИТОГИ

      В результате выполнения программы были получены следующие результаты.

     Модуляция QPSK, ОСШ = 25 дБ:

    ans = 

    Без ошибок!

     ans = 

    Приготовиться к приему сообщения терминалу №...

    Модуляция QAM-16, ОСШ = 22 дБ:

    ans = 

    Без ошибок!

     ans = 

    Приготовиться к приему сообщения терминалу №...

    Список литературы:

    1. Концепции SDR.

    2. Исходный код модели

    Предыдущие статьи КП:

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

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

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