wolffd@0: function varargout = mirsum(orig,varargin) wolffd@0: % s = mirsum(f) sums the envelope of the multi-channel object f. wolffd@0: % wolffd@0: % Optional arguments: wolffd@0: % mirsum(f,'Centered') centers the resulting envelope. wolffd@0: % mirsum(f,'Mean') divides the summation by the number of channels. wolffd@0: wolffd@0: % mirsum(f,'Weights')... wolffd@0: wolffd@0: c.key = 'Centered'; wolffd@0: c.type = 'Boolean'; wolffd@0: c.default = 0; wolffd@0: c.when = 'After'; wolffd@0: option.c = c; wolffd@0: wolffd@0: m.key = 'Mean'; wolffd@0: m.type = 'Boolean'; wolffd@0: m.default = 0; wolffd@0: m.when = 'After'; wolffd@0: option.m = m; wolffd@0: wolffd@0: adj.key = 'Adjacent'; wolffd@0: adj.type = 'Integer'; wolffd@0: adj.default = 1; wolffd@0: option.adj = adj; wolffd@0: wolffd@0: weights.key = 'Weights'; wolffd@0: weights.type = 'Integer'; wolffd@0: weights.default = []; wolffd@0: option.weights = weights; wolffd@0: wolffd@0: specif.option = option; wolffd@0: wolffd@0: if isamir(orig,'mirtemporal') wolffd@0: specif.eachchunk = @eachtemporalchunk; wolffd@0: specif.combinechunk = 'Concat'; %@combinetemporalchunk; wolffd@0: else wolffd@0: specif.combinechunk = @combinechunk; wolffd@0: end wolffd@0: varargout = mirfunction(@mirsum,orig,varargin,nargout,specif,@init,@main); wolffd@0: wolffd@0: wolffd@0: function [x type] = init(x,option) wolffd@0: type = mirtype(x); wolffd@0: wolffd@0: wolffd@0: function s = main(x,option,postoption) wolffd@0: x = purgedata(x); wolffd@0: if iscell(x) wolffd@0: x = x{1}; wolffd@0: end wolffd@0: d = get(x,'Data'); wolffd@0: pp = get(x,'PeakPos'); wolffd@0: pv = get(x,'PeakVal'); wolffd@0: pm = get(x,'PeakMode'); wolffd@0: p = get(x,'Pos'); wolffd@0: sc = cell(1,length(d)); wolffd@0: spp = cell(1,length(d)); wolffd@0: spv = cell(1,length(d)); wolffd@0: spm = cell(1,length(d)); wolffd@0: for h = 1:length(d) wolffd@0: dh = d{h}; wolffd@0: sch = cell(1,length(dh)); wolffd@0: spph = cell(1,length(dh)); wolffd@0: spvh = cell(1,length(dh)); wolffd@0: spmh = cell(1,length(dh)); wolffd@0: for i = 1:length(dh) wolffd@0: % Summation of signal wolffd@0: s3 = size(dh{i},3); wolffd@0: if not(isempty(option.weights)) wolffd@0: weights = reshape(option.weights,1,1,length(option.weights)); wolffd@0: if length(weights)~=s3 wolffd@0: %warning('WARNING in MIRSUM..'); wolffd@0: weights = weights(1,1,1:s3); wolffd@0: end wolffd@0: dh{i} = dh{i}.*repmat(weights,[size(dh{i},1),size(dh{i},2),1]); wolffd@0: end wolffd@0: if option.adj < 2 wolffd@0: sch{i} = sum(dh{i},3); wolffd@0: else wolffd@0: m0 = option.adj; wolffd@0: nc1 = size(dh{i},3); wolffd@0: nc2 = ceil(nc1/m0); wolffd@0: sch{i} = zeros(size(dh{i},1),size(dh{i},2),nc2); wolffd@0: for j = 1:nc2 wolffd@0: sch{i}(:,:,j) = sum(dh{i}(:,:,(j-1)*m0+1:min(j*m0,nc1))... wolffd@0: ,3); wolffd@0: end wolffd@0: end wolffd@0: % Summation of peaks wolffd@0: if not(isempty(pp)) && not(isempty(pp{1})) wolffd@0: ppi = pp{h}{i}; wolffd@0: pvi = pv{h}{i}; wolffd@0: pmi = pm{h}{i}; wolffd@0: nfr = size(ppi,2); wolffd@0: nbd = size(ppi,3); wolffd@0: sppi = cell(1,nfr,1); wolffd@0: spvi = cell(1,nfr,1); wolffd@0: spmi = cell(1,nfr,1); wolffd@0: for j = 1:nfr wolffd@0: sppj = []; wolffd@0: spvj = []; wolffd@0: spmj = []; wolffd@0: for k = 1:nbd wolffd@0: ppk = ppi{1,j,k}; wolffd@0: pvk = pvi{1,j,k}; wolffd@0: pmk = pmi{1,j,k}; wolffd@0: for l = 1:length(ppk) wolffd@0: fp = find(ppk(l) == sppj); wolffd@0: if fp wolffd@0: spvj(fp) = spvj(fp) + pvk(l); wolffd@0: else wolffd@0: sppj(end+1) = ppk(l); wolffd@0: spvj(end+1) = pvk(l); wolffd@0: spmj(end+1) = pmk(l); wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: sppi{1,j,1} = sppj; wolffd@0: spvi{1,j,1} = spvj; wolffd@0: spmi{1,j,1} = spmj; wolffd@0: end wolffd@0: spph{i} = sppi; wolffd@0: spvh{i} = spvi; wolffd@0: spmh{i} = spmi; wolffd@0: else wolffd@0: spph{i} = []; wolffd@0: spvh{i} = []; wolffd@0: spmh{i} = []; wolffd@0: end wolffd@0: if not(isempty(p)) && not(isempty(p{h})) wolffd@0: p{h}{i} = p{h}{i}(:,:,1); wolffd@0: end wolffd@0: end wolffd@0: sc{h} = sch; wolffd@0: spp{h} = spph; wolffd@0: spv{h} = spvh; wolffd@0: spm{h} = spmh; wolffd@0: end wolffd@0: s = set(x,'Data',sc,'Pos',p,'PeakPos',spp,'PeakVal',spv,'PeakMode',spm); wolffd@0: if not(isempty(postoption)) wolffd@0: s = post(s,postoption); wolffd@0: end wolffd@0: wolffd@0: wolffd@0: function s = post(s,option) wolffd@0: if option.c wolffd@0: d = get(s,'Data'); wolffd@0: for k = 1:length(d) wolffd@0: for i = 1:length(d{k}) wolffd@0: d{k}{i} = center(d{k}{i}); wolffd@0: end wolffd@0: end wolffd@0: s = set(s,'Data',d); wolffd@0: end wolffd@0: if option.m wolffd@0: d = get(s,'Data'); wolffd@0: ch = get(s,'Channels'); wolffd@0: if not(isempty(ch)) wolffd@0: for k = 1:length(d) wolffd@0: for i = 1:length(d{k}) wolffd@0: d{k}{i} = d{k}{i}/length(ch{k}); wolffd@0: end wolffd@0: ch{k} = [1]; wolffd@0: end wolffd@0: s = set(s,'Data',d,'Channels',ch); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: wolffd@0: function [y orig] = eachtemporalchunk(orig,option,missing) wolffd@0: [y orig] = mirsum(orig,option); wolffd@0: wolffd@0: wolffd@0: %function y = combinetemporalchunk(old,new) wolffd@0: %do = get(old,'Data'); wolffd@0: %to = get(old,'Time'); wolffd@0: %dn = get(new,'Data'); wolffd@0: %tn = get(new,'Time'); wolffd@0: %y = set(old,'Data',{{[do{1}{1};dn{1}{1}]}},... wolffd@0: % 'Time',{{[to{1}{1};tn{1}{1}]}}); wolffd@0: % wolffd@0: wolffd@0: function y = combinechunk(old,new) wolffd@0: if isa(old,'mirspectrum') wolffd@0: warning('WARNING IN MIRSUM: not yet fully generalized to mirspectrum') wolffd@0: end wolffd@0: do = get(old,'Data'); wolffd@0: do = do{1}{1}; wolffd@0: dn = get(new,'Data'); wolffd@0: dn = dn{1}{1}; wolffd@0: if length(dn) < length(do) wolffd@0: dn(length(do),:,:) = 0; % Zero-padding wolffd@0: end wolffd@0: y = set(old,'ChunkData',do+dn);