%wavework源函数
function [varargout]=wavework(opcode,type,c,s,n,x)
%wavework用来编辑小波重构结构的。
%建立在opcode的type和n去获取或修改得到一个指定的系数
%输入:
%opcode 执行程序
%'copy' [varargout]=y=requested(通过type和n)系数矩阵
%'cut' [varargout]=[nc,y]得到新的重构向量(零系数矩阵)和系数矩阵
%'paste' [varargout]=[nc]通过替换x得到新的带有系数矩阵的新重构向量
%type 系数类型
%'a' 近似值系数
%'h' 水平细节
%'v' 垂直细节
%'d' 对角线细节
%[c,s]是一个小波工具重构结构。n是重构水平(type='a'则忽略)。x是为粘贴用的二维系数矩阵
error(nargchk(4,6,nargin));
if (ndims(c)~=2) | (size(c,1)~=1)
error('C must be a row vector.')
end
if (ndims(s)~=2 | ~isreal(s) | isnumeric(s) | (size(s,2)) ~=2
error('S must be a real,numeric two-column array.');
end
elements=prod(s,2);%系数矩阵元素
if (length(c)<elements(end)) | ...
~(elements(1)+3*sum(elements(2:end-1))>=elements(end))
error(['[c,s] must be a standard wavelet decomsition' 'structure.']);
end
if nargin<5,
n=1;%默认水平为1
end
nmax=size(s,1)-2;%最大水平为[c,s]
aflag=(lower(type(1))=='a');
if ~aflag & (n>nmax)
error('N exceeds the decomposition in [c,s].');
end
switch lower(type(1))%将指针转为1
case 'a'
nindex=1;
start=1;stop=elements(1);ntst(1);ntst=nmax;
case{'h','v','d'}
switch type
case 'h',offset=0;%细节的补偿值
case 'v',offset=1;
case 'd',offset=2;
end
nindex=size(s,1)-n;%索引到详细信息
start=elements(1)+3*sum(elements(2:nmax-n+1))+offset*elements(nindex)-1;
stop=start+elements(nindex)-1;
ntst=n;
otherwise
error('TYPE must begin with ''a'',''h'',''v'',or''d''.');
end
switch lower(opcode)%需求反应
case{'copy','cut'}
y=repmat(0,s(nindex,:));
y(:)=c(start:stop);nc=c;
if strcmp(lower(opcode(1:3)),'cut')
nc(start:stop)=0;varargout={nc,y};
else
varargout={y};
end
case'paste'
if prod(size(x)) ~=elements(end-ntst)
error('X is not sized for the requested paste.');
else
nc=c;nc(start:stop)=x(:);varargout={nc};
end
otherwise
error('Unrecognized OPCODE.')
end
wavework.m
最新推荐文章于 2021-03-16 17:47:41 发布