Доброго времени суток, Хабр! Разбирая тему технологии MIMO (Multiple input-multiple output), которая сейчас используется повсеместно, я обнаружил насколько мало материала по этой тематике представлено в отечественной литературе. Хабр регулярно читаю около 3 лет и полного ликбеза по этому вопросу я здесь тоже не видел. Постараюсь исправить эту ситацию. Как ЭТО работает и почему это актуально именно сегодня, а также история развития этой технологии. Кого заинтересовало прошу под кат.
MIMO раньше представлялась только лишь как технология разнесенного приема (имеем одну передающую и N приемных антенн). Реализуя эту идею было выпущено несколько серий военных тропосферных станций (может кому и довелось послужить на таких) и в принципе на том этапе, расходы на разворачивание дополнительных антенн себя оправдывали.
Принцип обработки был прост как лопата: в двух приемных ветках сравнивалось отношение сигнал/шум и в соответствии с оценкой этого значения каждой ветке обработки назначались весовые коэффициенты, играющие роль при принятии решения, грубо говоря, что было передано: 0 или 1. Эта нехитрая система так и была названа критерием оптимального весового сложения (MRC).
Дальше-больше. В 1997 году ирано-американец Аламоути предлагает новинку основанную на уже известных тезисах, назвав её пространственно-временным блоковым кодом (STBC). После этого год от года увеличивается вал публикаций на тему MIMO и тема стает очень актуальной на фоне того, что частотно-энергетическую эффективность систем связи повышать стало все сложнее и сложнее (уже продуманы максимально эффективные сигнально-кодовые конструкции). А дальше пошло-поехало: пространственно-временное решетчатое кодирование, пространственное мультиплексирование, а также большое количество алгоритмов декодирования от простейшего «максимального правдоподобия (ML- max likehood)» до сферического турбодекодирования на GPU и т.д.
Проходя путь от передатчика (T) к приемника ( R) наша радиоволна затухает (теряет в энергетике), причем то насколько она потеряет зависит то, есть ли между нашими T и R прямая видимость. Если она есть, то основная вина за потери ложится на потери среды распространения (path loss), если прямой видимости нет, то начинается самое интересное. Сталкиваясь с различными препятствиями волна идет к пункту назначения несколькими путями (многолучевое распространение) и соответственно каждый луч проходит разное расстояние. На приеме все эти лучи могут складывать с противофазе, что дополнительно снижает интенсивность сигнала, что заставляет уровень сигнала постоянно «плавать». Поэтому в зоне неуверенного приема ваши мобильники никак не могут определиться сколько «палочек сигнала» показывать.
Все это безобразие назвали замираниями. Бывают они разными и могут описывать разными законами. При наличии постоянной компоненты (наличии прямой видимости) подойдет распределение Райса, а при её отсутствии — Релеевское (частный вариант). Формул не буду приводить умышленно, они большие и страшные.
k — так называемая комплексная передаточная функция канала (определяющая его ФЧХ и АЧХ), причем различная для каждого момента времени для каждого из принятых сигналов. Главная изюминка как раз и заключается в том, что сигналы для каждой из приемных антенн проходят разные пути.
В соответствии с методом ПВБК, входной поток данных разбивается на пары [с1, с2], причем, на первом полутактовом интервале символ c1 передается через антенну Т1 и символ c2 передается через антенну Т2. На втором полутактовом интервале порядок передачи изменяется: через антенну Т1 передается инверсия символа c2 (на рисунке обозначен как (–c*2), а символ c1 передается через антенну Т2 (на рисунке обозначен как (c*1). Данный алгоритм удобно представить в виде матрицы, где номер строки будет соответствовать номеру передатчика, а номер столбца – номер полутакта (в общем случае – шаг такта) передачи. Символ "*" как уже многие догадались-комплексное сопряжение.
В итоге на входе мы получаем 2 сигнала (мультипликативные отклики за первый и второй такт), проведя ряд занимательных математических преобразований мы получаем исходный сигнал, а точнее пару этих сигналов. Собственно вся фишка и заключается в том, что каждый из этих сигналов передавался 2 раза.
Почему это возможно? Потому что k разный для каждого луча, а матрица Аламоути (рисунок выше) является ортогональной.
Все свои расчеты и моделирование я провожу в Matlab'e потому, что этосамая лучшая в мире очень удобная для таких экспериментов среда.
Вот собственно кусок для расчета кривой Аламоути:
Эта часть для классической схемы:
Из графика видно что выигрыш для вероятности ошибки Pош=10^(-3) примерно 12 [дБ]. И это просто огромная величина.
Спасибо тем, кто дочитал, хочу отметить, что:
Остальное уже касается MIMO-OFDM и это тема отдельной статьи.
Немножко истории
У большого числа технологий, которые имеют место в сегодняшней телекоммуникационной среде «ноги растут» из военных наработок. Технология ортогонального частотного мультиплексирования (OFDM), например, была предложена ещё в 80-х годах нашими американскими друзьями, но реализовать её удалось совсем недавно лишь потому, что она чрезвычайно требовательна к вычислительной мощности системы (всему виной пресловутое БПФ).MIMO раньше представлялась только лишь как технология разнесенного приема (имеем одну передающую и N приемных антенн). Реализуя эту идею было выпущено несколько серий военных тропосферных станций (может кому и довелось послужить на таких) и в принципе на том этапе, расходы на разворачивание дополнительных антенн себя оправдывали.
Принцип обработки был прост как лопата: в двух приемных ветках сравнивалось отношение сигнал/шум и в соответствии с оценкой этого значения каждой ветке обработки назначались весовые коэффициенты, играющие роль при принятии решения, грубо говоря, что было передано: 0 или 1. Эта нехитрая система так и была названа критерием оптимального весового сложения (MRC).
Дальше-больше. В 1997 году ирано-американец Аламоути предлагает новинку основанную на уже известных тезисах, назвав её пространственно-временным блоковым кодом (STBC). После этого год от года увеличивается вал публикаций на тему MIMO и тема стает очень актуальной на фоне того, что частотно-энергетическую эффективность систем связи повышать стало все сложнее и сложнее (уже продуманы максимально эффективные сигнально-кодовые конструкции). А дальше пошло-поехало: пространственно-временное решетчатое кодирование, пространственное мультиплексирование, а также большое количество алгоритмов декодирования от простейшего «максимального правдоподобия (ML- max likehood)» до сферического турбодекодирования на GPU и т.д.
Как это работает
И ещё немного теорииРадиоканалы
Вообще эта классификация огромна и её обзор достоен отдельной статьи, но мы остановимся лишь на нескольких моментах.Проходя путь от передатчика (T) к приемника ( R) наша радиоволна затухает (теряет в энергетике), причем то насколько она потеряет зависит то, есть ли между нашими T и R прямая видимость. Если она есть, то основная вина за потери ложится на потери среды распространения (path loss), если прямой видимости нет, то начинается самое интересное. Сталкиваясь с различными препятствиями волна идет к пункту назначения несколькими путями (многолучевое распространение) и соответственно каждый луч проходит разное расстояние. На приеме все эти лучи могут складывать с противофазе, что дополнительно снижает интенсивность сигнала, что заставляет уровень сигнала постоянно «плавать». Поэтому в зоне неуверенного приема ваши мобильники никак не могут определиться сколько «палочек сигнала» показывать.
Все это безобразие назвали замираниями. Бывают они разными и могут описывать разными законами. При наличии постоянной компоненты (наличии прямой видимости) подойдет распределение Райса, а при её отсутствии — Релеевское (частный вариант). Формул не буду приводить умышленно, они большие и страшные.
MIMO вот ОНО
Разбор того, как ЭТО работает проведем на самом простом примере. У нас есть 2 антенны на передаче и одна на приеме.k — так называемая комплексная передаточная функция канала (определяющая его ФЧХ и АЧХ), причем различная для каждого момента времени для каждого из принятых сигналов. Главная изюминка как раз и заключается в том, что сигналы для каждой из приемных антенн проходят разные пути.
В соответствии с методом ПВБК, входной поток данных разбивается на пары [с1, с2], причем, на первом полутактовом интервале символ c1 передается через антенну Т1 и символ c2 передается через антенну Т2. На втором полутактовом интервале порядок передачи изменяется: через антенну Т1 передается инверсия символа c2 (на рисунке обозначен как (–c*2), а символ c1 передается через антенну Т2 (на рисунке обозначен как (c*1). Данный алгоритм удобно представить в виде матрицы, где номер строки будет соответствовать номеру передатчика, а номер столбца – номер полутакта (в общем случае – шаг такта) передачи. Символ "*" как уже многие догадались-комплексное сопряжение.
В итоге на входе мы получаем 2 сигнала (мультипликативные отклики за первый и второй такт), проведя ряд занимательных математических преобразований мы получаем исходный сигнал, а точнее пару этих сигналов. Собственно вся фишка и заключается в том, что каждый из этих сигналов передавался 2 раза.
Почему это возможно? Потому что k разный для каждого луча, а матрица Аламоути (рисунок выше) является ортогональной.
Практика
А теперь проведем моделирование и посмотрим выигрыш MIMO перед SISO(single in single out).Все свои расчеты и моделирование я провожу в Matlab'e потому, что это
Вот собственно кусок для расчета кривой Аламоути:
numOfBlk = 1e6; % число блоков для передачи
qampoz = 4; % выбираем позиционность сигнала КАМ
SNRdB = 6:1:40; %пределы изменения отношения сигнал/шум
linColor = 'b'; % цвет 1
linSym = 'o'; % цвет 2
errRate = zeros(size(SNRdB)); %пустышка
% Аламоути
for i = 1 : length(SNRdB)
txData = randint(numOfBlk*2,1,qampoz);%формируем инф поток
temp = reshape(txData,numOfBlk,2); %разбиваем на подпотоки
temp = qammod(temp,qampoz); %модулируем
H = 1/sqrt(2) * (randn(numOfBlk,2) + sqrt(-1)*randn(numOfBlk,2)); %задаем канал(он релеевский)
txMod(:,1) = H(:,1).* 1/sqrt(2).*temp(:,1) + H(:,2).* 1/sqrt(2).*temp(:,2) ; %обработка на приеме
txMod(:,2) = -H(:,1).*(1/sqrt(2).*temp(:,2)').' + H(:,2).*(1/sqrt(2).*temp(:,1)').' ;
txMod = awgn(txMod,SNRdB(i),'measured');
temp(:,1) = sqrt(2)*(H(:,1)'.' .* txMod(:,1) + H(:,2) .* txMod(:,2)'.')./(abs(H(:,1)).^2 + abs(H(:,2)).^2);
temp(:,2) = sqrt(2)*(H(:,2)'.' .* txMod(:,1) - H(:,1) .* txMod(:,2)'.')./(abs(H(:,1)).^2 + abs(H(:,2)).^2);
rxData(:,1) = qamdemod(temp(:,1),qampoz); %демодуляция
rxData(:,2) = qamdemod(temp(:,2),qampoz);
[numErr errRate(i)] = symerr(rxData,reshape(txData,numOfBlk,2)); %считаем ошибки
end
Эта часть для классической схемы:
%SISO
for i = 1 : length(SNRdB)
temp = qammod(txData,qampoz);
H = 1/sqrt(2) * (randn(numOfBlk*2,1) + sqrt(-1)*randn(numOfBlk*2,1));%тот же канал
txMod = H.*temp;
txMod = awgn(txMod,SNRdB(i),'measured');
temp = txMod./H;
rxData = qamdemod(temp,qampoz);
[numErr errRate(i)] = symerr(rxData,txData);
end
Из графика видно что выигрыш для вероятности ошибки Pош=10^(-3) примерно 12 [дБ]. И это просто огромная величина.
В качестве заключения
Спасибо тем, кто дочитал, хочу отметить, что:
- Одночастотный сигнал это хорошо, но в расчетах я принимал идеальный вариант когда точно известна КПФ канала на приеме, а как провести его оценку в реальности? Тут-то идеален OFDM сигнал в структуру которого можно встроить пилот-сигналы и по ним построить профиль канала (узнать КПФ для каждой поднесущей). Кстати они использовались ещё до MIMO (см. DVB-T например) для оценки помехоустойчивости
- Модель канала выбрана самая легкая и от реального далековата
- Модель сигнала выбрана самая простая, если брать сигнал OFDM, то его формирование само по себе непростое занятие + тогда должны быть другие условия к модели канала (канал-то частотно-селективный нужен)
- ПВБК не единственный и не самый эффективный из методов применяемых в технологии MIMO, но самый простой и легко реализуемый
- Выигрыш для КАМ-16,64 уменьшается с ростом позиционности, все дело в энергетике (причина — меньшее Евклидово расстояние между сигнальным точками)
Остальное уже касается MIMO-OFDM и это тема отдельной статьи.