Ускорение потокового проекта пикселей с помощью MATLAB Coder

В этом примере показано, как ускорить алгоритм обработки видео в пиксельном потоке в MATLAB ® с помощью MATLAB Coder™.

Для запуска этого примера необходимо иметь лицензию MATLAB Coder.

Ускорение с помощью MATLAB Coder позволяет моделировать большие форматы кадра, такие как видео 1080p, на практичных скоростях. Используйте этот рабочий процесс ускорения после отладки алгоритма с использованием небольшого формата кадра. Тестирование проекта с небольшим изображением продемонстрировано в примере Pixel-Streaming Проекта в MATLAB (Vision HDL Toolbox).

Как работает MATLAB Coder

MATLAB Coder генерирует код С из кода MATLAB. Генерация кода ускоряет симуляцию путем блокировки размеров и типов данных переменных. Этот процесс удаляет накладные расходы на проверку интерпретированного языка на размер и тип данных в каждой строке кода. Этот пример компилирует оба файла испытательного стенда DesignAccelerationHDLTestBench.m и файл проекта DesignAccelerationHDLDesign.m в MEX-функцию и использует полученный файл MEX для ускорения симуляции.

Директива (или прагма)% # codegen под сигнатурой функции указывает, что вы намерены сгенерировать код для алгоритма MATLAB. Добавление этой директивы предписывает анализатору кода MATLAB помочь вам диагностировать и исправить нарушения, которые привели бы к ошибкам во время генерации кода. Директива% # codegen не влияет на интерпретированную симуляцию.

Лучшие практики

Симуляции отладки с большими форматами кадра непрактичны в интерпретированном режиме из-за длительного времени симуляции. Однако отладка симуляции MEX сложна из-за отсутствия отладочного доступа в код.

Чтобы избежать этих сценариев, лучшая практика состоит в том, чтобы разработать и проверить алгоритм и испытательный стенд с помощью формата кадра. В большинстве случаев HDL-целевой проект может быть реализован без зависимости от формата кадра. Как только вы уверены, что проект и испытательный стенд работают правильно, то увеличьте формат кадра в испытательном стенде, и используйте MATLAB Coder, чтобы ускорить симуляцию. Чтобы увеличить формат кадра, испытательный стенд требует только незначительных изменений, что можно увидеть, сравнивая DesignAccelerationHDLTestBench.m с PixelStreamingDesignHDLTestBench.m в Pixel-Streaming Design в MATLAB (Vision HDL Toolbox).

Испытательный стенд

На испытательном стенде DesignAccelerationHDLTestBench.mобъект videoIn считывает каждую систему координат из источника видео, и объект скалера интерполирует эту систему координат с 240p до 1080p. Это изображение 1080p передается объекту frm2pix, который преобразует полную систему координат изображения в поток пикселей и структур управления. Функция DesignAccelerationHDLDesign затем вызывается, чтобы обработать один пиксель (и связанную с ним структуру управления) за раз. После того, как мы обработаем весь поток пикселей и собираем выходной поток, объект pix2frm преобразует выходной поток в полнокадровое видео. Функция DesignAccelerationHDLViewer отображает выходные и оригинальные изображения один за другим.

Рабочий процесс выше реализован в следующих линиях DesignAccelerationHDLTestBench.m.

     ...
     for f = 1:numFrm
         frmFull = step(videoIn);       % Get a new frame
         frmIn = step(scaler,frmFull);  % Enlarge the frame
         [pixInVec,ctrlInVec] = step(frm2pix,frmIn);
         for p = 1:numPixPerFrm
             [pixOutVec(p),ctrlOutVec(p)] =...
                     visionhdlsobel_design(pixInVec(p),ctrlInVec(p));
         end
         frmOut = step(pix2frm,pixOutVec,ctrlOutVec);
         DesignAccelerationHDLViewer(actPixPerLine,actLine,[frmIn uint8(255*frmOut)]);
     end
     ...

Тип данных frmIn является uint8, в то время как тип данных frmOut, ребро выхода обнаружения, является логическим. Матрицы различных типов данных не могут быть конкатенированы, поэтому uint8 (255 * frmOut) преобразует логические false и true в uint8 (0) и uint8 (255), соответственно.

И frm2pix, и pix2frm используются для преобразования между полным кадром и пиксельным потоком областей. Внутренний цикл for-loop выполняет обработку потока пикселей. Остальная часть испытательного стенда выполняет обработку полного кадра (т.е. videoIn, скалер и средство просмотра внутри функции DesignAccelerationHDLViewer).

Перед завершением испытательного стенда отображается частота систем координат, чтобы проиллюстрировать скорость симуляции.

Не все функции, используемые в испытательном стенде, поддерживают генерацию кода C. Для тех, кто этого не делает, таких как tic, toc, fprintf, используйте coder.extrinsic, чтобы объявить их внешними функциями. Внешние функции исключены из генерации MEX. Симуляция выполняет их в регулярном интерпретированном режиме.

Пиксельные

Проекты

Функция, заданная в DesignAccelerationHDLDesign.m принимает поток пикселей и пять управляющих сигналов и возвращает измененный поток пикселей и сигналы управления. Дополнительные сведения о протоколе потокового пикселя, используемом системными объектами из Toolbox™ Vision HDL, см. в разделе Интерфейс потокового пикселя (Vision HDL Toolbox).

В этом примере функция содержит объект Edge Detector System.

В особом внимании этого примера находится рабочий процесс, а не сам проект алгоритма. Поэтому проект кода довольно прост. Как только вы знакомы с рабочим процессом, легко реализовать расширенные алгоритмы видео, используя возможности, предоставляемые системными объектами из Vision HDL Toolbox.

Создайте файл MEX и симулируйте проект

Сгенерируйте и выполните файл MEX.

codegen('DesignAccelerationHDLTestBench');
DesignAccelerationHDLTestBench_mex;
Code generation successful.


10 frames have been processed in 12.92 seconds.
Average frame rate is 0.77 frames/second.

Средство просмотра отображает оригинальное видео слева, а выход справа.

Генерация HDL-кода

Введите следующую команду, чтобы создать новый проект HDL- Coder™ во временной папке

coder -hdlcoder -new DesignAccelerationProject

Затем добавьте файл DesignAccelerationHDLDesign.m к проекту в качестве функции MATLAB и DesignAccelerationHDLTestBench.m в качестве испытательного стенда MATLAB.

Руководство по созданию и заполнению проектов MATLAB HDL Coder см. в разделе Начало работы с MATLAB в HDL.

Запустите советник по рабочим процессам. В Workflow Advisor щелкните правой кнопкой мыши шаг 'Генерация Кода'. Выберите опцию «Run to selected task», чтобы выполнить все шаги от начала до генерации HDL-кода.

Просмотрите сгенерированный HDL-код, щелкнув по ссылкам в окне журнала.