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

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

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

Как работы MATLAB Coder

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

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

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

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

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

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

В испытательном стенде mlhdlc_vht_sobel_tb, объект videoIn читает каждый кадр из источника видеосигнала, и функция imresize интерполирует этот кадр от 240 пунктов до 1 080 пунктов. Это изображение на 1 080 пунктов передается объекту frm2pix, который преобразовывает кадр полного образа в поток пикселей и управляющих структур. Функция mlhdlc_vht_sobel затем вызвана, чтобы обработать один пиксель (и его связанная управляющая структура) за один раз. После того, как мы обработаем целый пиксельный поток и соберем поток вывода, pix2frm объект преобразовывает поток вывода в видео полного кадра. Функция mlhdlc_vht_sobel_viewer отображает выходные и оригинальные изображения бок о бок.

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

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

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

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

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

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

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

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

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

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

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

Чтобы не загрязнить вашу текущую рабочую папку, выполните следующие строки кода, чтобы скопировать необходимые файлы в качестве примера во временную папку.

currDir = pwd;
tempDir = tempname;

% Create a temporary folder and copy the MATLAB files.
mkdir(tempDir);
demoDir = fullfile(matlabroot,'toolbox','hdlcoder','hdlcoderdemos','matlabhdlcoderdemos');
copyfile(fullfile(demoDir,'mlhdlc_vht_sobel_tb.m'),tempDir);
copyfile(fullfile(demoDir,'mlhdlc_vht_sobel.m'),tempDir);
copyfile(fullfile(demoDir,'mlhdlc_vht_sobel_viewer.m'),tempDir);
cd(tempDir);

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

fprintf('Generating the MEX file, please wait ..\n');
codegen('mlhdlc_vht_sobel_tb');
fprintf('Executing the MEX file ..\n');
mlhdlc_vht_sobel_tb_mex;
Generating the MEX file, please wait ..
Executing the MEX file ..

10 frames have been processed in 14.88 seconds.
Average frame rate is 0.67 frames/second.

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

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

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

coder -hdlcoder -new DesignAccelerationProject

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

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

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

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

Запустите следующие команды, чтобы очистить временную папку проекта.

clear mlhdlc_vht_sobel_tb_mex;
cd(currDir);
rmdir(tempDir,'s');
clear currDir tempDir demoDir;