В качестве дополнения к моей недавней статье хотелось бы также поговорить о теме MU (Multi User) MIMO. Есть у мною уже упомянутого профессора Хаардта одна очень известная статья, где он вместе со своими коллегами предлагает алгоритм разделения пользователей по нисходящему каналу (Down Link) на основе линейных методов, а именно блоковой диагонализации (Block Diagonalization) канала. Статья имеет внушающее количество цитирований, а также является краеугольной публикацией для одного из заданий экзамена. Поэтому почему бы и не разобрать основы предлагаемого алгоритма?   Во-первых, давайте определимся в какой области в тематике MIMO мы будем сейчас работать.
Условно, все методы передачи в рамках MIMO технологии можно разделить на две основные группы:  Основной целью является увеличение помехоустойчивости передачи. Пространственные каналы, если упрощенно, дублируют друг друга, за счет чего мы получаем лучшее качество передачи.  Примеры:
 — Блочные коды (например, схема Аламути);
 — Коды, основанные на алгоритме Витерби. Основной целью является увеличение скорости передачи. Мы уже обсуждали в предыдущей статье, что при определенных условиях канал MIMO можно рассматривать как ряд параллельных каналов SISO. Собственно говоря, это и есть центральная идея пространственного мультиплексирования: добиться максимального количества независимых информационных потоков. Главная проблема в данном случае — это подавление межканальной интерференции (inter-channel interference), для чего существуют несколько классов решений:  — горизонтальное разделение каналов;
 — вертикальное (например, алгоритм V-BLAST);
 — диагональное (например, алгоритм D-BLAST). Но и это, конечно, не всё. Идею пространственного мультиплексирования можно расширить: разделять не только каналы, но и пользователей (SDMA — Space Division Multiple Access).  
(ссылка на источник иллюстрации) Следовательно, и бороться в этом случае уже нужно с интерференцией межпользовательской (inter-user interference). Именно для этого и был предложен алгоритм под названием  Block diagonalization Zero-Forcing, который мы сегодня и рассматриваем. Начнем, как и прежде, с модели принятого сигнала (received signal). А точнее, покажем на схеме что куда и из чего происходит:  Канальная матрица в этом случае имеет вид:  при общем числе передающих антенн , и общем числе приёмных антенн . Итак, модель принятых символов (сигналов) можно записать в векторном виде как:  Однако, интереснее посмотреть на формулу для конкретного пользователя:  Собственно говоря:  — это полезный сигнал для k-ого пользователя,  — это интерференция от других пользователей,  Вот мы и подошли к формулировке главной задачи: Этим мы и займемся. Описание проведем на примере, а в качестве иллюстрации я буду приводить скриншоты из первых рук, немного их комментируя. Рассмотрим первого пользователя:  Проговорим основные шаги: Раскладываем её методом SVD. В матрице  находим шумовое подпространство (null-subspace) — матрицу  (т.е. всё что выходит за ранг матрицы  — обозначим его ).  Составляем из этой шумовой матрицы и её эрмитового сопряжения некоторую матрицу проекции . Идём дальше:  Теперь уже оригинальную часть канальной матрицы  перемножаем с полученной матрицей проекции . Раскладываем результат через SVD. В матрице  выбираем  строк, где  — ранг . Транспонируем их и получаем матрицу  (или  — где как обозначают). И так эта процедура будет повторяться для каждого пользователя. Не это ли магия математики: используя методы линейной алгебры, решаем вполне технические задачи! Я думаю, не будет лишним провести небольшое моделирование, чтобы закрепить результат. Для этого будем использовать Python 3, а именно: для основных расчетов, и: для отображения результата. Пусть, у нас имеются 8 передающих антенн и 3 пользователя, у которых 3, 2 и 3 приёмных антенны соответственно: Инициализируем наш класс и применяем соответствующие методы: Приводим к читабельному виду: И немного подрихтуем для наглядности (хотя можно и без этого): Должно получиться нечто такое:  Собственно, вот они и блоки, вот она и диагонализация. И минимизация интерференции. Такие дела. P.S. Преподавательскому составу и студенческой братии родной специальности передаю привет! Инженер