Тема: ”Исследование моделей стационарных MIMO каналов связи”

Часть 2

 

 

Выполнил: ст.гр.218

 Холмогорцев И.А.

 

 

Практическое исследование моделей MIMO каналов в Mathlab. Получение всех характеристик MIMO каналов на практике в Mathlab.

 

1)Прохождение QPSK – модулированных данных через 4x2 MIMO канал

Пример, приведенный ниже, показывает то, как построить 4x2 MIMO канал, используя системный объект “MIMO Channel”. Модулированные и пространственно кодированные  данные передаются через MIMO канал.

А) Создание объекта QPSK модулятора и генерация потока случайных чисел. Вызов функции “step” для модуляции данных.

Листинг 1

hMod = comm.QPSKModulator;

data = randi([0 3],1000,1);

modData = step(hMod,data);

 

Б) Создание ортогонального частотно-временного блочного кодера для кодирования модулированных данных в четыре пространственно разделенных потока. Вызов функции “step” для кодирования данных.

Листинг 2

hEnc = comm.OSTBCEncoder('NumTransmitAntennas',4,'SymbolRate',1/2);
txSig = step(hEnc,modData);

 

В) Создание объекта MIMO канала, используя пары параметров и их значений для задания характеристик канала. Канал состоит из двух путей  с максимальной величиной Доплеровского сдвига 5 Гц. Установка параметра “SpatialCorrelation” — “false” говорит о том, что будет собственноручно указано количество приемных – передающих антенн. Количество передающих – 4 , приемных в свою очередь – 2.

Листинг 3

hChan = comm.MIMOChannel(...
    'SampleRate',1000, ...
    'PathDelays',[0 2e-3], ...
    'AveragePathGains',[0 -5], ...
    'MaximumDopplerShift',5, ...
    'SpatialCorrelation',false, ...
    'NumTransmitAntennas',4, ...
    'NumReceiveAntennas',2);

 

Г) Пропустим модулированные и кодированные данные через канал функцией “step”.

Листинг 4

rxSig = step(hChan,txSig);

 

Д) Создадим вектор t, который будем использовать для  построения графика мощности  принятого сигнала.

Листинг 5

ts = 1/hChan.SampleRate;
t = (0:ts:(size(txSig,1)-1)*ts)';
 

Е) Подсчитаем и построим график зависимости мощности сигнала, принимаемого 1 антенной от времени (Результат работы на рисунке 1).

Листинг 6

pwrdB = 20*log10(abs(rxSig(:,1)));
plot(t,pwrdB)
xlabel('Time (sec)')
ylabel('Power (dBW)')

 

 

Рисунок 1 — График изменения мощности сигнала, принимаемого первой антенной от времени

 

2) Изучение характеристик 2x2 MIMO канала  с Рэлеевской моделью замираний и пространственной корреляцией

Сначала пропустим PSK – модулированный сигнал через 2x2 MIMO канал с Рэлеевской моделью замираний и затем изучим пространственные корреляционные характеристики реализации канала.

А) Создание объекта случайно сгенерированных и модулированных данных.

Листинг 7

mod = comm.PSKModulator;
modData = step(mod, randi([0 mod.ModulationOrder-1],1e5,1));
 
 

Б) Разделение модулированных данных на два пространственных потока.

Листинг 8

channelInput = reshape(modData,[2 5e4]).';

 

В) Создание 2x2 объекта MIMO канала с двумя дискретными путями. Каждый путь имеет различные корреляционные матрицы передачи и приема, определяемые параметрами “TransmitCorrelationMatrix” и “ReceiveCorrelationMatrix ”.

Листинг 9

mimoChan = comm.MIMOChannel(...
  'SampleRate',                1000,...
  'PathDelays',                [0 1e-3],...
  'AveragePathGains',          [3 5],...
  'NormalizePathGains',        false,...
  'MaximumDopplerShift',       5,...
  'TransmitCorrelationMatrix', cat(3, eye(2), [1 0.1;0.1 1]),...
  'ReceiveCorrelationMatrix',  cat(3, [1 0.2;0.2 1], eye(2)),...
  'RandomStream',              'mt19937ar with seed',...
  'Seed',                      33,...
  'PathGainsOutputPort',       true);

 

В) Пропускание модулированных данных через MIMO канал с использованием функции “step”.

Листинг 10

[~,pathGains] = step(mimoChan,channelInput);

 

Г) Корреляционная матрица передатчика для первого дискретного пути  и первой приемной антенны будет иметь вид единичной матрицы. Убедимся в этом, используя функцию “corrcoef”.

Листинг 11

disp('Tx spatial correlation, first path, first Rx:');
disp(corrcoef(squeeze(pathGains(:,1,:,1))));

 

Получим вывод следующего результата в консоль:

Tx spatial correlation, first path, first Rx:
   1.0000 + 0.0000i   0.0357 - 0.0253i
   0.0357 + 0.0253i   1.0000 + 0.0000i

 

Д) Корреляционная матрица передатчика для второго дискретного пути  и второй приемной антенны будет иметь вид [1 0.1;0.1 1] . Убедимся в этом, используя функцию “corrcoef

Листинг 12

disp('Tx spatial correlation, second path, second Rx:');
disp(corrcoef(squeeze(pathGains(:,2,:,2))));

 

Получим вывод следующего результата в консоль:

Tx spatial correlation, second path, second Rx:
   1.0000 + 0.0000i   0.0863 + 0.0009i
   0.0863 - 0.0009i   1.0000 + 0.0000i

 

Е) Корреляционная матрица передатчика для первого дискретного пути  и второй передающей антенны будет иметь вид [1 0.2;0.2 1] . Убедимся в этом, используя функцию “corrcoef”.

Листинг 13

disp('Rx spatial correlation, first path, second Tx:');
disp(corrcoef(squeeze(pathGains(:,1,2,:))));

 

Получим вывод следующего результата в консоль:

Rx spatial correlation, first path, second Tx:
   1.0000 + 0.0000i   0.2236 + 0.0550i
   0.2236 - 0.0550i   1.0000 + 0.0000i

 

Ж) Корреляционная матрица передатчика для второго дискретного пути  и первой передающей антенны будет иметь вид единичной матрицы. Убедимся в этом, используя функцию “corrcoef”.

Листинг 14

disp('Rx spatial correlation, second path, first Tx:');
disp(corrcoef(squeeze(pathGains(:,2,1,:))));

 

Получим вывод следующего результата в консоль:

Rx spatial correlation, second path, first Tx:
   1.0000 + 0.0000i  -0.0088 - 0.0489i
  -0.0088 + 0.0489i   1.0000 + 0.0000i

 

З) А теперь включим выбор приемной и передающей антенны в нашей модели. Размер входного кадра сокращается до 100.

Листинг 15

release(mimoChan);
mimoChan.AntennaSelection = 'Tx and Rx';
modData = step(mod,randi([0 mod.ModulationOrder-1],1e2,1));

 

И) Выбор первой передающей и второй приемной антенны

Листинг 16

[channelOutput,pathGains] = step(mimoChan,modData,[1 0],[0 1]);

 

К) Убедимся в том, что Matlab для невыбранных пар антенн приема – передачи выдает значения (числа) NaN формата.

Листинг 17

disp('Return 1 if the path gains for the second transmit antenna are NaN:');
disp(isequal(isnan(squeeze(pathGains(:,:,2,:))), ones(1e2, 2, 2)));
disp('Return 1 if the path gains for the first receive antenna are NaN:');
disp(isequal(isnan(squeeze(pathGains(:,:,:,1))), ones(1e2, 2, 2)));

 

Получим вывод следующего результата в консоль:

Return 1 if the path gains for the second transmit antenna are NaN:
     1
 
Return 1 if the path gains for the first receive antenna are NaN:
     1

 

3) Просмотр Импульсной и Частотной характеристики MIMO канала

В данном примере иллюстрируется, как создается частотно - селективный MIMO канал и проводится просмотр его импульсной и частотной характеристик.

А) Сначала производится установка параметров в переменных, которые потом будут использоваться в MIMO – канале. Параметры соответствуют параметрам EVA (Extended Vehicular).

Листинг 18

fs = 10e6;                                                  % Hz
pathDelays = [0 30 150 310 370 710 1090 1730 2510]*1e-9;    % sec
avgPathGains = [0 -1.5 -1.4 -3.6 -0.6 -9.1 -7 -12 -16.9];   % dB
fD = 70;                                                    % Hz

 

Б) Создание MIMO – канала с характеристиками, указанными выше и устанавливаем параметр “Visualization” на “Impulse and frequency responses”. По умолчанию будет отображаться антенная пара: первая передающая – первая приемная.

Листинг 19

h = comm.MIMOChannel('SampleRate',fs, ...
    'PathDelays',pathDelays, ...
    'AveragePathGains',avgPathGains, ...
    'MaximumDopplerShift',fD, ...
    'Visualization','Impulse and frequency responses');

 

В) Генерирование случайных двоичных данных и прохождение их через MIMO – канал с помощью функции ”step”.

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

 

Рисунок 2 — Импульсная характеристика канала

На частотной характеристике видна частотно – селективная природа канала EVA (Рисунок 3).

 

Рисунок 3 — Частотная характеристика канала

Г) Установим параметр “AntennaPairsToDisplay” в положение [2 1] для просмотра характеристик канала для другой пары антенн: второй передающей и  первой приемной. Однако не перестраиваем ничего внутри нашего MIMO канала. Результаты работы фрагмента программы видим на рисунках 4 и 5 ниже.

Листинг 20

release(h)
h.AntennaPairsToDisplay = [2 1];
y = step(h,x);

 

 

Рисунок 4 — Импульсная характеристика канала

 

 

Рисунок 5 — Частотная характеристика канала

 

4) Просмотр Доплеровского спектра

Создание и вывод на экран Доплеровского спектра MIMO канала с двумя путями.

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

Листинг 21

dp{1} = doppler('Bell');
dp{2} = doppler('Flat');
 

Б) Создание MIMO 2x2 канала по умолчанию с максимальной Доплеровской частотой 100 Гц. Параметры “Visualization” и “PathsForDopplerDisplay” устанавливаются соответственно “Doppler spectrum” и “1”. Будет просмотрен Доплеровский спектр первого пути (на рисунке 6).

Листинг 22

h = comm.MIMOChannel('SampleRate',1000, ...
    'PathDelays',[0 0.002],'AveragePathGains',[0 -3], ...
    'MaximumDopplerShift',100, ...
    'DopplerSpectrum',dp, ...
    'Visualization','Doppler spectrum', ...
    'PathsForDopplerDisplay',1);

 

В) С помощью функции “step” будет сгенерирован спектр первого пути. Так как Доплеровский спектр обновляется только тогда, когда буфер переполняется, то функция “step”вызывается несколько раз (у нас 50) для повышения точности оценки.

Можем заметить, что спектр на рисунке 6 имеет форму колокола  и его минимальные и максимальные границы частот находятся на уровне 100Гц — “MaximumDoplerShift”.

Листинг 23

for k = 1:50

    x = randi([0 1],10000,2);

    y = step(h,x);

end

 

 

Рисунок 6 — Доплеровский спектр (колокол)

 

Г) Установим параметр “PathsForDopplerDisplay” равным “2”. Ничего не меняем в объекте канала MIMO. Снова вызываем функцию “step” несколько раз для построения Доплеровского спектра второго пути. Отметим, что спектр является плоским (Рисунок 7).

Листинг 24

release(h)

h.PathsForDopplerDisplay = 2;

for k = 1:50

    x = randi([0 1],10000,2);

    y = step(h,x);

end

 

 

 

 

Рисунок 7 — Доплеровский спектр (плоский)

 

5) Проектирование модели MIMO канала по технике “Sum-of-Sinusoids” (Суммы синусоид)

Данный пример показывает, как создать MIMO канал с параметром “FadingTechnique” — “Sum-of-Sinusoids” и передавать через него данные. Пример показывает как сохраняется состояние канала в тех случаях , в которых данные передаются прерывисто.

А) Определение  общего времени моделирования и трех временных окон, в которые будут передаваться  данные.

В нашем случае канал моделируется в течение 1 секунды с частотой 1000 Гц.

Последовательность из 1000 отсчетов передается с момента времени 0.

100 отсчетные последовательности передаются в моменты времени 0.1 0.4 и 0.7 секунды.

Листинг 25

t0 = 0:0.001:0.999;   % Transmission 0

t1 = 0.1:0.001:0.199; % Transmission 1

t2 = 0.4:0.001:0.499; % Transmission 2

t3 = 0.7:0.001:0.799; % Transmission 3

 

Б) Генерация случайных двоичных данных, соответствующих заранее определенным интервалам времени.

Листинг 26

d0 = randi([0 1],1000,2);  % 1000 samples
d1 = randi([0 1],100,2);   % 100 samples
d2 = randi([0 1],100,2);   % 100 samples
d3 = randi([0 1],100,2);   % 100 samples

 

В) Создание модели канала MIMO 2x2 с амплитудными замираниями по технике “суммы синусоид”. В силу того, что параметр “InitialTime” точно не задан, то время симуляции начнется с 0. Включим параметр “PathGainsOutputPort”.

Листинг 27

g = comm.MIMOChannel('SampleRate',1000, ...
    'MaximumDopplerShift',5, ...
    'RandomStream','mt19937ar with seed', ...
    'Seed',17, ...
    'FadingTechnique','Sum of sinusoids', ...
    'PathGainsOutputPort',true);

 

Г) Создадим дубликат объекта канала MIMO. Изменить значение параметра “ InitalTimeSource “ на “Input port”.

Листинг 28

h = clone(g);
h.InitialTimeSource = 'Input port';

 

Д) Пропустим случайные бинарные данные через объект канала “g”. Данные передаются по всем 1000 временным отсчетам. Для этого примера необходим только комплексный коэффициент усиления.

Листинг 29

[~,pg0] = step(g,d0);
 
 

Е) Пропустим  случайные бинарные данные через второй объект канала “h”, где начальные условия временного отсчета передаются как входные аргументы функции “step”.

Листинг 30

[~,pg1] = step(h,d1,0.1);
[~,pg2] = step(h,d2,0.4);
[~,pg3] = step(h,d3,0.7);
 
 
Ж) Можно сравнить количество отсчетов, обработанных обоими каналами. В результате можем видеть, что были обработаны 1000 отсчетов в 1 случае и 300 во втором.
 
Листинг 31
 

G = info(g);

H = info(h);

[G.NumSamplesProcessed H.NumSamplesProcessed]

 

Получим вывод следующего результата в консоль:

ans =
 
        1000         300

 

З) Преобразование мощности в дБ по пути от первой передающей антенны к первой приемной.

 

Листинг 32

 

pathGain0 = 20*log10(abs(pg0(:,1,1,1)));
pathGain1 = 20*log10(abs(pg1(:,1,1,1)));
pathGain2 = 20*log10(abs(pg2(:,1,1,1)));
pathGain3 = 20*log10(abs(pg3(:,1,1,1)));
 
И) Построим график мощности пути от времени для всех случаев. На графике видим (Рисунок 8) полное совпадение графиков конечных типов данных, передаваемых нами  и “бесконечного”. Выводом по проделанному опыту является то, что  данная техника внесения затуханий в канал идеально подходит для моделирования пакетных данных (непостоянно передаваемых)  так как характеристики канала  сохраняются даже тогда, когда данные не передаются.
 
 
 
Рисунок 8 — График изменения мощности сигнала передаваемого от
первой передающей антенны к первой приемной от времени