⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xil_rgb2ycrcb_fi_model.m

📁 基于FPGA的YUV转换RGB的色度空间转换
💻 M
字号:
function [y, cr, cb] = Xil_RGB2YCrCb_fi_model(R, G, B,  ...
                           IWIDTH, CWIDTH, MWIDTH, OWIDTH,  ...
                           ACOEF, BCOEF, CCOEF, DCOEF,  ...
                           YMAX, YMIN, CMAX, CMIN,      ... 
                           YOFFSET, COFFSET );
    if  (nargin < 4 ) IWIDTH  = 8; end      
    if  (nargin < 5 ) CWIDTH  = 17; end     % Coefficients are unsigned
    if  (nargin < 6 ) MWIDTH  = 18; end     
    if  (nargin < 7 ) OWIDTH  = 8; end
    if  (nargin < 8 ) ACOEF   = 0.2988; end    
    if  (nargin < 9 ) BCOEF   = 0.1138; end    
    if  (nargin < 10) CCOEF   = 0.7131; end  % 0.5/(1-ACOEF)  
    if  (nargin < 11) DCOEF   = 0.5642; end  % 0.5/(1-BCOEF) 
    if  (nargin < 12) YMAX    = pow2(OWIDTH)-1; end
    if  (nargin < 13) YMIN    = 0 ; end
    if  (nargin < 14) CMAX    = pow2(OWIDTH)-1; end
    if  (nargin < 15) CMIN    = 0 ; end
    if  (nargin < 16) YOFFSET = 0 ; end
    if  (nargin < 17) COFFSET = pow2(OWIDTH-1); end

    q_i=quantizer([IWIDTH, 0], 'ufixed', 'round', 'wrap');   
    r =  quantize( q_i, R); % unsigned fixpoint quantized version of input channels
    g =  quantize( q_i, G);
    b =  quantize( q_i, B);

    q_c=quantizer([CWIDTH, CWIDTH-1], 'round', 'wrap');   
    acoef =  quantize( q_c, ACOEF); % signed fixpoint quantized version of input channels
    bcoef =  quantize( q_c, BCOEF);
    ccoef =  quantize( q_c, CCOEF);
    dcoef =  quantize( q_c, DCOEF);
   
    rg = r-g;
    bg = b-g;

    rgm = rg*acoef;
    bgm = bg*bcoef;

    FRACT_WIDTH = MWIDTH-IWIDTH-2   ;  % Number of fractional bits are retained after multiplication
    q_m=quantizer([MWIDTH-2, FRACT_WIDTH], 'floor', 'wrap'); 
    rgm_used = quantize( q_m, rgm);
    bgm_used = quantize( q_m, bgm);
    
    y_inta = rgm_used+bgm_used;
    y_intb = g;
    y_int =  y_inta+y_intb;

    by = b - y_int;
    ry = r - y_int;

    q_o=quantizer([OWIDTH+2, 0], 'round', 'wrap'); 
    cb_int_round = quantize( q_o, by*dcoef + COFFSET);
    cr_int_round = quantize( q_o, ry*ccoef + COFFSET);
    y_int_round  = quantize( q_o, y_int+YOFFSET);
    
    % Do the clipping
    y_int_postmax  =  y_int_round; wh = find(  y_int_postmax > YMAX);  y_int_postmax(wh) = YMAX;
    cb_int_postmax = cb_int_round; wh = find( cb_int_postmax > CMAX); cb_int_postmax(wh) = CMAX;
    cr_int_postmax = cr_int_round; wh = find( cr_int_postmax > CMAX); cr_int_postmax(wh) = CMAX;
    
    % Do the clamping
    y  =  y_int_postmax; wh = find(  y < YMIN);  y(wh) = YMIN;
    cb = cb_int_postmax; wh = find( cb < CMIN); cb(wh) = CMIN;
    cr = cr_int_postmax; wh = find( cr < CMIN); cr(wh) = CMIN;
    
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -