2.3 Моделирование системы передачи

Листинг

Главная программа
%%Моделирование физического уровня
clear; clc;
%====================================================================%
%%ПАРАМЕТРЫ МОДЕЛИ
v_mod=2; %вид модуляции ( 2-QAM)
mPos=16; %позиционность модуляции
SNR=20; %Отношение Сигнал/Шум
Ngr = 0; %количество неиспользуемых поднесущих и приходящихся на защитные интервалы 
% номера пилотных поднесущих в OFDM-символе
pilotIndexes = [1 2 3 4 5 6 7 8 9 10 27 44 61 78 95 112 129 146 147 148 149 150 151 152 153 154 155 156 157];
%Размерность OFDM-символа
Nc=157 ;
%В качестве примера задан большой блок битов, для передачи которого
%потребуется несколько OFDM-символов 
msg_leng = 166;% длина передаваемого сообщения, битов
n=100; %Количество передаваемых кадров
%====================================================================%
graf1=[];
graf2=[];
mes_sum=[];
rx_sum=[];
for i=1:n
 mes = randint(1,msg_leng); %формируется блок битов, моделирующий сообщение с канального уровня
 mes_sum=[mes_sum;mes']; %накопление передаваемого сообщения
 
 %функция передатчика
 [Tx,tx_mod]=Transmitter(mes,msg_leng,v_mod,mPos,SNR);
 graf1=[graf1;tx_mod]; %накопление сигнала передатчика для построения СКС
 
 %функция приемника
 [Rx,rx_mod]=Receiver(Tx,v_mod,mPos,msg_leng);
 rx_sum=[rx_sum;Rx'];
 graf2=[graf2;rx_mod']; %накопление сигнала приемника для построения СКС
 
end

%Построение СКС передаваемого сообщения
    figure(1); plot(graf1,'.');
    title('СКС сигнала, сформированного в передатчике')
    ylim([-5.5 5.5]);
    xlim([-5.5 5.5]);
%Построение СКС принимаемого сообщения
    figure(2); plot(graf2,'.');
    title('СКС сигнала, сформированного в приемнике')
    ylim([-5.5 5.5]);
    xlim([-5.5 5.5]);
   
%Расчет количества ошибок с помощью функц. biterr и вывод результатов 
err=biterr(mes_sum,rx_sum,'overall');
disp('Количество передаваемых кадров :');
disp(n);
disp('Количество передаваемых пакетов :');
disp(n*msg_leng);
disp('Количество обнаруженных ошибок :');
disp(err);
disp('Вероятность ошибки :');
pb=err/(msg_leng*n); %Расчет вероятности ошибки
disp(pb);
Функция передатчика
 %%Передатчик
function [chan_fr,IQ_signal]=Transmitter(mes,msg_leng1,v_mod1,mPos1,SNR1)
%clear;
%clc;
global pilotIndexes;
global Nc;
%Входные данные функции:
data_l2=mes;
msg_l=msg_leng1;
v_mod=v_mod1;
mPos=mPos1;
SNR=SNR1;
% В примере ниже рассматривается построение пакета OFDM-символов, способных
% передавать  msg_length битов.  
%=======================================================================%
%%ПАРАМЕТРЫ ПЕРЕДАТЧИКА
Ngr = 0; %количество неиспользуемых поднесущих и приходящихся на защитные интервалы  
% номера пилотных поднесущих в OFDM-символе
pilotIndexes = [1 2 3 4 5 6 7 8 9 10 27 44 61 78 95 112 129 146 147 148 149 150 151 152 153 154 155 156 157];
%Размерность OFDM-символа
Nc=157;
%=======================================================================%
%Сверточное кодирование
trellis = poly2trellis(7,[171 133]);
data = convenc(data_l2,trellis);
%Длина сообщения на выходе сверточного кодера
msg_lenght=msg_l*2;
% количество поднесущих с данными
Ndata = Nc-length(pilotIndexes); % поднесущие для передачи данных
% количество битов, передаваемых в одном OFDM-символе
s_length = Ndata * log2(mPos); %  биты с учетом QPSK
ns = floor(msg_lenght/s_length)+1; % сколько потребуется OFDM-символов
% сколько потребуется добавить незначащих битов - как разница между тем
% количеством битов, что обеспечивает расчетное количество OFDM-символов, и
% количеством блоком в передаваемом сообщении
fil_zero = zeros(1, ns*s_length - msg_lenght);

% Параметры квадратурной модуляции

    v_mod=2 %QAM
   h = modem.qammod(mPos);
   h.inputtype = 'bit';
   h.SymbolOrder = 'gray';
   h.PhaseOffset = 0;
 
 %Дополнение блока битов сообщения нулями до той величины, которую
 %способны транспортировать рассчитанное выше количество OFDM-символов.
 %В практическом случае параметры физ. уровня надо рассчитать таким образом,
 %чтобы подобых "хвостов" не было.
 data = [data fil_zero]';
   
 %Квадратурная модуляция
 IQ_signal = modulate(h, data);
 
 %формирование OFDM-символов
 ofdmFrame = makeOfdmFrame(IQ_signal, ns);
 
 %формирование символов преамбулы
 %Идея построения заимствована из 802.11а (модуль tx_gen_preamble
 %соответствующей лабораторной работы)
 %Короткие символы - для подстройки частоты (синхронизация по частоте)
 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(32-2*16+1:32) long_symbol long_symbol];

 
 %Пакет физического уровня (символы преамбулы и OFDM-символы)
phy_frame = [short_trs long_trs ofdmFrame];
% figure(2);
% plot(abs(phy_frame)), title('Сформированный OFDM кадр');
%Имитация канала связи.
%chan_fr=phy_frame;
chan_fr=awgn(phy_frame,SNR,'measured');
end
Функция формирования OFDM-символов
function ofdmFrame = makeOfdmFrame(dataMod, Numfdm)

global pilotIndexes;
global Nc;

%символы пилотных поднесущих промодулированы псевдослучайным кодом (для
%примера, код Баркера), как результат - BPSK
seqBarker = [-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]*4/3;
ofdmSymbol = [];
ofdmFrame = [];
indexOfPilot = 1;
indexOfData = 1;
for i=1:Numfdm
    for j=1:Nc % собираются IQ-символы будущего OFDM-символа
        if (j==pilotIndexes(indexOfPilot))
            ofdmSymbol(j)=seqBarker(indexOfPilot);
            indexOfPilot=indexOfPilot+1;
        else
            ofdmSymbol(j) = dataMod(indexOfData);
            indexOfData=indexOfData+1;
        end
    end
    indexOfPilot=1;
    ofdmSymbol = ifft(ofdmSymbol);
    %формирование циклического префикса, как часть OFDM-символа, используется 1/8
    %Может также принимать значения 1/4, 1/16, 1/32
    cp = ofdmSymbol(Nc-Nc/8+1:Nc);
    % добавление ЦП в начало OFDM-символа (32 IQ-символа)
    ofdmSymbol=[cp ofdmSymbol];
    % Сборка информационных OFDM-символов пакета физического уровня
    ofdmFrame=[ofdmFrame ofdmSymbol];
    ofdmSymbol=[];
end
end
Функция приемника
 %%Приемник
function [L2_msg_out,IQ_signal_rcv]=Receiver(in_msg,v_mod1,mPos1,msg_l)
%Входные данные функции:
mPos=mPos1;
v_mod=v_mod1;
msg_lenght=msg_l;
ofdmFrame_rcv =  in_msg(336:end); %выделение OFDM символов из общего потока
%Подготовка необходимых массивов
OSr = [];
OSpr = [];
IQ_signal_rcv = [];
% вектор, необходимый для устранения пилот сигналов
nopilotIndexes = [11:26 28:43 45:60 62:77 79:94 96:111 113:128 130:145];
% Выделение промодулированных данных из принятого OFDM сигнала
% Удаление циклического префикса из OFDM символов
 for i = 0 : (length(ofdmFrame_rcv)/161)-1
    % Убираем циклический префикс 
    IQ_sig = ofdmFrame_rcv((5:161)+ i*161);
    OSr = [OSr; IQ_sig]; 
    % Переход в частотную область
    IQ_sign = fft(IQ_sig);
    OSpr = [OSpr; IQ_sign];
    % Убираем пилот сигналы и Формируем поток данных
    IQ_signal_rcv = [IQ_signal_rcv IQ_sign(nopilotIndexes)];
end;

   v_mod=2  %QAM-16
   h1 = modem.qamdemod(mPos);
   h1.OutputType = 'bit';
   h1.SymbolOrder = 'gray';
   h1.PhaseOffset = 0;
 
% Демодуляция
L2_msg = demodulate(h1,IQ_signal_rcv');
%Убираем добавочные нули
ind_null=msg_lenght*2;
L2_msg=L2_msg(1:ind_null);
L2_msg_out=L2_msg';

% Декодирование по Витерби
trellis = poly2trellis(7,[171 133]);
L2_msg_out=vitdec(L2_msg_out,trellis,34,'cont','hard');
end
2.4 Исследование качества приема сообщений
Продемонстрируем сигнально-кодовые созвездия сигнала в передатчике на выходе модулятора, а так же в приемнике на входе демодулятора при SNR=20 дБ.
Рис.1. СКС сигнала в передатчике на выходе модулятора QAM-16.
Рис. 2. СКС сигнала в приемнике на входе демодулятора QAM-16. 
 
Рис. 3. Результат работы программы

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

1. Бакке А. В. "Лекции по курсу: Системы и сети связи с подвижными объектами"

2. http://omoled.ru/publications/view/1039

3. http://omoled.ru/publications/view/1014

4. http://omoled.ru/publications/view/1070