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