Ускорьте передающий потоком пиксель проект Используя MATLAB Coder

Этот пример демонстрирует рабочий процесс для ускорения алгоритма обработки видеоданных пиксельного потока с помощью MATLAB Coder™ и генерируя HDL-код из проекта. У вас должна быть лицензия MATLAB Coder, чтобы запустить этот пример.

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

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

В испытательном стенде DesignAccelerationHDLTestBench.m, объект videoIn читает каждую систему координат из источника видеосигнала, и объект счетчика интерполирует эту систему координат от 240 пунктов до 1 080 пунктов. Это изображение на 1 080 пунктов передается объекту 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) сопоставляет логический ложный и верный для uint8 (0) и uint8 (255), соответственно.

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

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

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

Проект пиксельного потока

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

В этом примере функция содержит Системный объект Детектора Ребра.

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

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

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

codegen('DesignAccelerationHDLTestBench');
DesignAccelerationHDLTestBench_mex;
10 frames have been processed in 16.38 seconds.
Average frame rate is 0.61 frames/second.

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

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

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

coder -hdlcoder -new DesignAccelerationProject

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

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

Запустите Советника по вопросам Рабочего процесса. В Советнике по вопросам Рабочего процесса щелкните правой кнопкой по шагу 'Code Generation'. Выберите опцию, 'Запущенную к выбранной задаче', чтобы запустить все шаги с начала через генерацию HDL-кода.

Исследуйте сгенерированный HDL-код путем щелчка по ссылкам в логарифмическом окне.