Быстрый вывод графики в Matlab.
Случилось приятное событие, о котором так долго
мечтало всё прогрессивное DSP-человечество! Дело в том, что ещё со студенческих
времён, когда Kluwert познакомился и влюбился в Matlab, была мечта, что
когда-нибудь настанет возможность писать в Matlab'е алгоритмы, работающие в
реальном, ну или почти в реальном времени. Особенно этому желанию
способствовало появление набора подпрограмм ("toolbox")
"Instrument Control Toolbox".
И вот Kluwert'у от очередного заказчика перепал заказ на создание
"РЛС-имитатора". Это шняга, которая имитирует посылку по сети
UDP/IP-пакетами "первички" после её оцифровки с выхода на
видеочастоте от примерно такого простенького морского радиолокатора:
Ок. И тут было решено: а что если с этой задачей справится непосредственно Matlab. Далее - код компилируется, ставится MCR-дистрибутив и, в принципе, никто не поймёт, что это матлабовская прога работает. Ну а если и поймёт: ТЗ выполнено? Выполнено! Какие вопросы?!
От заказчика была потребована мощная машинка. И, т.к. заказчик оказался не из прижимистых (редкая тема!) быстро был приобретен восьми ядерный i7 с 16Гбайт памяти и мощной CUDA-совместимой 690-ой GeForce'синой. Kluwert побыстрому (за два дня!) набросал прогу, которая имитировала отражения от точечных и протяжённых целей с заданными параметрами помеховой обстановки и валила это всё в Ethernet.
И о чудо! Даже без использования CUDA-команд Matlab молотил в реальном времени (реальная РЛС делала один оборот за 4 сек при 720-ти угловых метках). При этом ещё и хватало мощностей для имитации неравномерности вращения антенны и даже отражений от моря.
Ура, ура! У Kluwert'а была перспектива сказать заказчику: "О, блин, ну это большая работа...", договорится о нескольких месяцах и соответствующих деньгах :). А самому сделать всё (вместе с документацией!) за несколько дней и спокойно заняться другой халтуркой или докторским диссером :)
Но нет места в жизни халяве! Заказчику понадобилось, что бы в графическом интерфейсе к проге "первичка" отображалась на ИКО:
Первая попытка вывести на экран изображение с помощью стандартных графиков оказалась не удачной: самый быстрый вывод изображения - image позволял сделать один оборот на экране минут за 5! Какие там 4 сек!!
Но выход из положения был найден. Оказалось, что есть многократно более быстрый способ вывода изображения на экран. Для этого команда image даётся только один раз (в проге - после нажатия кнопки "сброс") и ссылка на неё запоминается (h = image...). Далее - создаётся матрица - копия изображения. Начальную загрузку этой матрицы можно сделать из свойств объекта h
ImageMatrix = get(h,'CData');
Выполняются необходимые расчёты и внесение изменений в матрицу ImageMatrix. После чего новая матрица выводится на экран командами
set(h,'CData',ImageMatrix);
drawnow;
Такой вывод минимум на порядок быстрее, чем каждый раз вызывать команду image. Для того, что бы не перерисовывать разметку и бегунок (тем более, что использовалась палитра gray, так что было бы проблематично их нарисовать цветными!) линии, дальностные окружности, угловой бегунок и цифры рисовались командами line, text, ellipse и т.д. Единственная проблема, которая при этом возникала - пересчёт координат (график и линии, увы, живут в разных мирах в Матлабе). Причём Kluwert'у было лень досконально разбираться с этими перерасчётами и он делал так: рисовал от руки, включив меню "Annotation" и переносил элементы разметки в код автоматически. Быстро и сурово, правда, есть некоторые неточности: на картинке видно, что начала углового бегунка слегка не попадает в центр ИКО. Ну да и бес с ним!
В конечном итоге, при применении CUDA-возможностей видеокарты, прога укладывалась в real-time. А работа над прогой растянулась почти на месяц, но 90% времени сожрало написание кода интерфейса в GUIDE. И то, только по тому, что чувак, курировавший этот проект, был бесповоротно свихнут на объектно-ориентированном программировании и вписал в ТЗ, что Kluwert тоже должен писать в Матлабе в объектном стиле. Ну и ладно, хоть прощупал как это с объектами в Матлабе :).
В следующей теме Kluwert собирается рассказать, как он использовал Matlab для обработки реальных гидроакустических сигналов, получая и излучая их прямо из Matlab'а через реальное "железо". Оставайтесь с Kluwert'ом!

