www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/eml/upsconv2.m
function y = upsconv2(x,f,s,dwtARG1,dwtARG2) % MATLAB Code Generation Library Function % % Copyright 1995-2016 The MathWorks, Inc. %#codegen narginchk(2,5); coder.varsize('y'); ONE = coder.internal.indexInt(1); % Check arguments for Extension and Shift. switch nargin case 3 perFLAG = false; dwtSHIFT = [false,false]; case 4 % Arg4 is a STRUCT coder.internal.prefer_const(dwtARG1); perFLAG = isequal(dwtARG1.extMode,'per'); shiftInput = coder.internal.indexInt(dwtARG1.shift2D); dwtSHIFT = eml_bitand(shiftInput,ONE) == ONE; case 5 coder.internal.prefer_const(dwtARG1,dwtARG2); perFLAG = isequal(dwtARG1,'per'); shiftInput = coder.internal.indexInt(dwtARG2); dwtSHIFT = eml_bitand(shiftInput,ONE) == ONE; end % Special case. if isempty(x) ytype = coder.internal.scalarEg(x,f{:}); y = zeros('like',ytype); return end % Define Size. ndimX = coder.internal.indexInt(eml_ndims(x)); if ndimX > 2 sx = 2*coder.internal.indexInt([size(x,1),size(x,2)]); else sx = 2*coder.internal.indexInt(size(x)); end if coder.internal.isConst(isempty(s)) && isempty(s) if perFLAG s1 = sx; else lf = coder.internal.indexInt(length(f{1})); s1 = sx - lf + 2; end else s1 = coder.internal.indexInt(s); end if ndimX < 3 y = upsconv2ONE(x,f,s1,dwtSHIFT,perFLAG); else y1 = upsconv2ONE(x(:,:,1),f,s1,dwtSHIFT,perFLAG); y = coder.nullcopy(zeros([size(y1,1),size(y1,2),3],'like',y1)); y(:,:,1) = y1; y(:,:,2) = upsconv2ONE(x(:,:,2),f,s1,dwtSHIFT,perFLAG); y(:,:,3) = upsconv2ONE(x(:,:,3),f,s1,dwtSHIFT,perFLAG); end %-------------------------------------------------------------------------- function y = upsconv2ONE(z,f,s,dwtSHIFT,perFLAG) % Compute Upsampling and Convolution. coder.internal.prefer_const(dwtSHIFT,perFLAG); ONE = coder.internal.indexInt(1); if perFLAG lf = coder.internal.indexInt(length(f{1})); lfd2 = eml_rshift(lf,ONE); y1 = dyadup(z,'row',false,true); % undocumented "force even" syntax y1 = wextend('addrow','per',y1,lfd2); y1 = conv2(y1,f{1}(:),'full'); y2 = coder.nullcopy(zeros(s(1),size(y1,2),'like',y1)); lfm1 = lf - 1; % y = y(lf:lf+s(1)-1,:); for j = ONE:size(y1,2) for i = ONE:s(1) y2(i,j) = y1(lfm1 + i,j); end end %------------------------------------------- y1 = dyadup(y2,'col',false,true); % undocumented "force even" syntax y1 = wextend('addcol','per',y1,lfd2); y1 = conv2(y1,f{2}(:)','full'); % y = y(:,lf:lf+s(2)-1); y = coder.nullcopy(zeros(s(1),s(2),'like',y1)); for j = ONE:s(2) for i = ONE:s(1) y(i,j) = y1(i,lfm1 + j); end end %------------------------------------------- if dwtSHIFT(1) == 1 && dwtSHIFT(2) == 1 y = circshift(y,int32([-1,-1])); elseif dwtSHIFT(1) == 1 y = circshift(y,int32([-1,0])); elseif dwtSHIFT(2) == 1 y = circshift(y,int32([0,-1])); end %------------------------------------------- else y = dyadup(z,'row',false); y = conv2(y,f{1}(:),'full'); y = dyadup(y,'col',false); y = conv2(y,f{2}(:)','full'); y = wkeep2(y,s,'c',dwtSHIFT); end %--------------------------------------------------------------------------