Main Content

Pixel-Streaming Design in MATLAB

This example shows how to design pixel-stream video processing algorithms using Vision HDL Toolbox™ objects in the MATLAB® environment and generate HDL code from the design.

This example also tests the design using a small thumbnail image to reduce simulation time. To simulate larger images, such as 1080p video format, use MATLAB Coder™ to accelerate the simulation. See Accelerate Pixel-Streaming Designs Using MATLAB Coder.

Test Bench

In the test bench PixelStreamingDesignHDLTestBench.m, the videoIn object reads each frame from a video source which is then converted to grayscale, and then imresize is used to reduce this frame from 240p to a thumbnail size for the sake of simulation speed. This thumbnail image is passed to the frm2pix object, which converts the full image frame to a stream of pixels and control structures. The function PixelStreamingDesignHDLDesign.m is then called to process one pixel (and its associated control structure) at a time. After we process the entire pixel-stream and collect the output stream, the pix2frm object converts the output stream to full-frame video. The viewer object displays the output and original images side-by-side.

The workflow above is implemented in the following lines of PixelStreamingDesignHDLTestBench.m.

     ...
     for f = 1:numFrm       
         frmFull = rgb2gray(readFrame(videoIn));             % Get a new frame  
         frmIn = imresize(frmFull, [actLine actPixPerLine]); % Reduce the frame size
         [pixInVec,ctrlInVec] = frm2pix(frmIn);                   
         for p = 1:numPixPerFrm    
             [pixOutVec(p),ctrlOutVec(p)] = PixelStreamingDesignHDLDesign(pixInVec(p),ctrlInVec(p));                                              
         end         
         frmOut = pix2frm(pixOutVec,ctrlOutVec);
         viewer([frmIn frmOut]);
     end
     ...

Both frm2pix and pix2frm are used to convert between full-frame and pixel-stream domains. The inner for-loop performs pixel-stream processing. The rest of the test bench performs full-frame processing (i.e., videoIn, imresize, and viewer).

Before the test bench terminates, the frame rate is displayed to illustrate the simulation speed.

Pixel-Stream Design

The function defined in PixelStreamingDesignHDLDesign.m accepts a pixel stream and five control signals, and returns a modified pixel stream and control signals. For more information on the streaming pixel protocol used by System objects from the Vision HDL Toolbox, see Streaming Pixel Interface.

In this example, the function contains the Gamma Corrector System object.

The focus of this example is the workflow, not the algorithm design itself. Therefore, the design code is quite simple. Once you are familiar with the workflow, it is straightforward to implement advanced video algorithms by taking advantage of the functionality provided by the System objects from Vision HDL Toolbox.

Simulate the Design

Simulate the design with the test bench prior to HDL code generation to make sure there are no runtime errors.

PixelStreamingDesignHDLTestBench;
10 frames have been processed in 37.73 seconds.
Average frame rate is 0.27 frames/second.

The viewer displays the original video on the left, and the output on the right. One can clearly see that the gamma operation results in a brighter image.

Enter the following command to create a new HDL Coder™ project,

coder -hdlcoder -new PixelStreamingDesignProject

Then, add the file PixelStreamingDesignHDLDesign.m to the project as the MATLAB Function and PixelStreamingDesignHDLTestBench.m as the MATLAB Test Bench.

Refer to Get Started with MATLAB to HDL Workflow (HDL Coder) for a tutorial on creating and populating MATLAB HDL Coder projects.

Launch the Workflow Advisor. In the Workflow Advisor, right-click the 'Code Generation' step. Choose the option 'Run to selected task' to run all the steps from the beginning through HDL code generation.

Examine the generated HDL code by clicking the links in the log window.