В этом примере показано, как генерировать код HDL из конструкции MATLAB ®, реализующей алгоритм формирования изображений с высоким динамическим диапазоном.
High Dynamic Range Imaging (HDRI или HDR) - это набор методов, используемых в визуализации и фотографии для обеспечения большего динамического диапазона между самыми светлыми и темными областями изображения, чем современные стандартные методы цифрового изображения или фотографические методы. HDR изображения могут более точно представлять диапазон уровней интенсивности, обнаруженных в реальных сценах, от прямого солнечного света до слабого звездного света, и часто захватываются посредством множества различных экспонируемых изображений одной и той же темы.
design_name = 'mlhdlc_hdr'; testbench_name = 'mlhdlc_hdr_tb';
Рассмотрим дизайн MATLAB
dbtype(design_name);
1 function [valid_out, x_out, y_out, ... 2 HDR1, HDR2, HDR3] = mlhdlc_hdr(YShort1, YShort2, YShort3, ... 3 YLong1, YLong2, YLong3, ... 4 plot_y_short_in, plot_y_long_in, ... 5 valid_in, x, y) 6 % 7 8 % Copyright 2013-2015 The MathWorks, Inc. 9 10 % This design implements a high dynamic range imaging algorithm. 11 12 plot_y_short = plot_y_short_in; 13 plot_y_long = plot_y_long_in; 14 15 %% Apply Lum(Y) channels LUTs 16 y_short = plot_y_short(uint8(YShort1)+1); 17 y_long = plot_y_long(uint8(YLong1)+1); 18 19 y_HDR = (y_short+y_long); 20 21 %% Create HDR Chorm channels 22 % HDR per color 23 24 HDR1 = y_HDR * 2^-8; 25 HDR2 = (YShort2+YLong2) * 2^-1; 26 HDR3 = (YShort3+YLong3) * 2^-1; 27 28 %% Pass on valid signal and pixel location 29 30 valid_out = valid_in; 31 x_out = x; 32 y_out = y; 33 34 end
dbtype(testbench_name);
1
2 %
3
4 % Copyright 2013-2015 The MathWorks, Inc.
5
6 % Clean screen and memory
7 close all
8 clear mlhdlc_hdr
9 set(0,'DefaultFigureWindowStyle','docked')
10
11
12 %% Read the two exposed images
13
14 short = imread('mlhdlc_hdr_short.tif');
15 long = imread('mlhdlc_hdr_long.tif');
16
17 % define HDR output variable
18 HDR = zeros(size(short));
19 [height, width, color] = size(HDR);
20
21 figure('Name', [mfilename, '_plot']);
22 subplot(1,3,1);
23 imshow(short, 'InitialMagnification','fit'), title('short');
24
25 subplot(1,3,2);
26 imshow(long, 'InitialMagnification','fit'), title('long');
27
28
29 %% Create the Lum(Y) channels LUTs
30 % Pre-process
31 % Luminance short LUT
32 ShortLut.x = [0 16 45 96 255];
33 ShortLut.y = [0 20 38 58 115];
34
35 % Luminance long LUT
36 LongLut.x = [ 0 255];
37 LongLut.y = [ 0 140];
38
39 % Take the same points to plot the joined Lum LUT
40 plot_x = 0:1:255;
41 plot_y_short = interp1(ShortLut.x,ShortLut.y,plot_x); %LUT short
42 plot_y_long = interp1(LongLut.x,LongLut.y,plot_x); %LUT long
43
44 %subplot(4,1,3);
45 %plot(plot_x, plot_y_short, plot_x, plot_y_long, plot_x, (plot_y_long+plot_y_short)), grid on;
46
47
48 %% Create the HDR Lum channel
49 % The HDR algorithm
50 % read the Y channels
51
52 YIQ_short = rgb2ntsc(short);
53 YIQ_long = rgb2ntsc(long);
54
55 %% Stream image through HDR algorithm
56
57 for x=1:width
58 for y=1:height
59 YShort1 = round(YIQ_short(y,x,1)*255); %input short
60 YLong1 = round(YIQ_long(y,x,1)*255); %input long
61
62 YShort2 = YIQ_short(y,x,2); %input short
63 YLong2 = YIQ_long(y,x,2); %input long
64
65 YShort3 = YIQ_short(y,x,3); %input short
66 YLong3 = YIQ_long(y,x,3); %input long
67
68 valid_in = 1;
69
70 [valid_out, x_out, y_out, HDR1, HDR2, HDR3] = mlhdlc_hdr(YShort1, YShort2, YShort3, YLong1, YLong2, YLong3, plot_y_short, plot_y_long, valid_in, x, y);
71
72 % use x and y to reconstruct image
73 if valid_out == 1
74 HDR(y_out,x_out,1) = HDR1;
75 HDR(y_out,x_out,2) = HDR2;
76 HDR(y_out,x_out,3) = HDR3;
77 end
78 end
79 end
80
81 %% plot HDR
82 HDR_rgb = ntsc2rgb(HDR);
83 subplot(1,3,3);
84 imshow(HDR_rgb, 'InitialMagnification','fit'), title('hdr ');
Всегда рекомендуется моделировать конструкцию с помощью средства тестирования до создания кода, чтобы убедиться в отсутствии ошибок во время выполнения.
mlhdlc_hdr_tb

Выполнение следующих строк копирует необходимые файлы во временную папку
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_hdr']; % create a temporary folder and copy the MATLAB files cd(tempdir); [~, ~, ~] = rmdir(mlhdlc_temp_dir, 's'); mkdir(mlhdlc_temp_dir); cd(mlhdlc_temp_dir); % copy files to the temp dir copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, 'mlhdlc_hdr_long.tif'), mlhdlc_temp_dir); copyfile(fullfile(mlhdlc_demo_dir, 'mlhdlc_hdr_short.tif'), mlhdlc_temp_dir);
coder -hdlcoder -new mlhdlc_hdr_prj
Затем добавьте файл «mlhdlc _ hdr.m» в проект в качестве функции MATLAB и «mlhdlc _ hdr _ tb.m» в качестве испытательного стенда MATLAB.
Более подробное руководство по созданию и заполнению проектов кодера MATLAB HDL см. в разделе Начало работы с MATLAB в Workflow-процессе HDL.
В этом примере показано использование входных значений параметра pass constant.
В этой конструкции входные параметры plot _ y _ short _ in и plot _ y _ long _ in являются постоянными входными параметрами. Можно определить их соответствующим образом, изменив типы ввода как 'constant (double (1x256))'
«plot _ y _ short _ in» и «plot _ y _ short _ in» являются входами LUT. Они постоянно складываются как двойные входы в конструкцию. Объявления портов для этих двух входных параметров не отображаются в сгенерированном коде HDL.
Обратите внимание, что внутри конструкции «mlhdlc _ hdr.m» эти переменные переназначены таким образом, что они правильно преобразуются с фиксированной точкой. Это не обязательно, если они используются только в качестве констант для определения размеров переменных, например, не являются частью логики.
Запустите HDL Advisor и щелкните правой кнопкой мыши на шаге «Code Generation» и выберите опцию «Run to selected task» для выполнения всех шагов от начала до создания кода HDL.
Следующий сценарий преобразует конструкцию в фиксированную точку и создает код HDL с помощью тестового стенда.
exArgs = {0,0,0,0,0,0,coder.Constant(ones(1,256)),coder.Constant(ones(1,256)),0,0,0};
fc = coder.config('fixpt');
fc.TestBenchName = 'mlhdlc_hdr_tb';
hc = coder.config('hdl');
hc.GenerateHDLTestBench = true;
hc.SimulationIterationLimit = 1000; % Limit number of testbench points
codegen -float2fixed fc -config hc -args exArgs mlhdlc_hdrПроверьте созданный код HDL, щелкнув гиперссылки в окне Журнал генерации кода.
Для очистки временной папки проекта можно выполнить следующие команды.
mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos'); mlhdlc_temp_dir = [tempdir 'mlhdlc_hdr']; clear mex; cd (mlhdlc_demo_dir); rmdir(mlhdlc_temp_dir, 's');