annotate toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirsum.m @ 0:cc4b1211e677 tip

initial commit to HG from Changeset: 646 (e263d8a21543) added further path and more save "camirversion.m"
author Daniel Wolff
date Fri, 19 Aug 2016 13:07:06 +0200
parents
children
rev   line source
Daniel@0 1 function varargout = mirsum(orig,varargin)
Daniel@0 2 % s = mirsum(f) sums the envelope of the multi-channel object f.
Daniel@0 3 %
Daniel@0 4 % Optional arguments:
Daniel@0 5 % mirsum(f,'Centered') centers the resulting envelope.
Daniel@0 6 % mirsum(f,'Mean') divides the summation by the number of channels.
Daniel@0 7
Daniel@0 8 % mirsum(f,'Weights')...
Daniel@0 9
Daniel@0 10 c.key = 'Centered';
Daniel@0 11 c.type = 'Boolean';
Daniel@0 12 c.default = 0;
Daniel@0 13 c.when = 'After';
Daniel@0 14 option.c = c;
Daniel@0 15
Daniel@0 16 m.key = 'Mean';
Daniel@0 17 m.type = 'Boolean';
Daniel@0 18 m.default = 0;
Daniel@0 19 m.when = 'After';
Daniel@0 20 option.m = m;
Daniel@0 21
Daniel@0 22 adj.key = 'Adjacent';
Daniel@0 23 adj.type = 'Integer';
Daniel@0 24 adj.default = 1;
Daniel@0 25 option.adj = adj;
Daniel@0 26
Daniel@0 27 weights.key = 'Weights';
Daniel@0 28 weights.type = 'Integer';
Daniel@0 29 weights.default = [];
Daniel@0 30 option.weights = weights;
Daniel@0 31
Daniel@0 32 specif.option = option;
Daniel@0 33
Daniel@0 34 if isamir(orig,'mirtemporal')
Daniel@0 35 specif.eachchunk = @eachtemporalchunk;
Daniel@0 36 specif.combinechunk = 'Concat'; %@combinetemporalchunk;
Daniel@0 37 else
Daniel@0 38 specif.combinechunk = @combinechunk;
Daniel@0 39 end
Daniel@0 40 varargout = mirfunction(@mirsum,orig,varargin,nargout,specif,@init,@main);
Daniel@0 41
Daniel@0 42
Daniel@0 43 function [x type] = init(x,option)
Daniel@0 44 type = mirtype(x);
Daniel@0 45
Daniel@0 46
Daniel@0 47 function s = main(x,option,postoption)
Daniel@0 48 x = purgedata(x);
Daniel@0 49 if iscell(x)
Daniel@0 50 x = x{1};
Daniel@0 51 end
Daniel@0 52 d = get(x,'Data');
Daniel@0 53 pp = get(x,'PeakPos');
Daniel@0 54 pv = get(x,'PeakVal');
Daniel@0 55 pm = get(x,'PeakMode');
Daniel@0 56 p = get(x,'Pos');
Daniel@0 57 sc = cell(1,length(d));
Daniel@0 58 spp = cell(1,length(d));
Daniel@0 59 spv = cell(1,length(d));
Daniel@0 60 spm = cell(1,length(d));
Daniel@0 61 for h = 1:length(d)
Daniel@0 62 dh = d{h};
Daniel@0 63 sch = cell(1,length(dh));
Daniel@0 64 spph = cell(1,length(dh));
Daniel@0 65 spvh = cell(1,length(dh));
Daniel@0 66 spmh = cell(1,length(dh));
Daniel@0 67 for i = 1:length(dh)
Daniel@0 68 % Summation of signal
Daniel@0 69 s3 = size(dh{i},3);
Daniel@0 70 if not(isempty(option.weights))
Daniel@0 71 weights = reshape(option.weights,1,1,length(option.weights));
Daniel@0 72 if length(weights)~=s3
Daniel@0 73 %warning('WARNING in MIRSUM..');
Daniel@0 74 weights = weights(1,1,1:s3);
Daniel@0 75 end
Daniel@0 76 dh{i} = dh{i}.*repmat(weights,[size(dh{i},1),size(dh{i},2),1]);
Daniel@0 77 end
Daniel@0 78 if option.adj < 2
Daniel@0 79 sch{i} = sum(dh{i},3);
Daniel@0 80 else
Daniel@0 81 m0 = option.adj;
Daniel@0 82 nc1 = size(dh{i},3);
Daniel@0 83 nc2 = ceil(nc1/m0);
Daniel@0 84 sch{i} = zeros(size(dh{i},1),size(dh{i},2),nc2);
Daniel@0 85 for j = 1:nc2
Daniel@0 86 sch{i}(:,:,j) = sum(dh{i}(:,:,(j-1)*m0+1:min(j*m0,nc1))...
Daniel@0 87 ,3);
Daniel@0 88 end
Daniel@0 89 end
Daniel@0 90 % Summation of peaks
Daniel@0 91 if not(isempty(pp)) && not(isempty(pp{1}))
Daniel@0 92 ppi = pp{h}{i};
Daniel@0 93 pvi = pv{h}{i};
Daniel@0 94 pmi = pm{h}{i};
Daniel@0 95 nfr = size(ppi,2);
Daniel@0 96 nbd = size(ppi,3);
Daniel@0 97 sppi = cell(1,nfr,1);
Daniel@0 98 spvi = cell(1,nfr,1);
Daniel@0 99 spmi = cell(1,nfr,1);
Daniel@0 100 for j = 1:nfr
Daniel@0 101 sppj = [];
Daniel@0 102 spvj = [];
Daniel@0 103 spmj = [];
Daniel@0 104 for k = 1:nbd
Daniel@0 105 ppk = ppi{1,j,k};
Daniel@0 106 pvk = pvi{1,j,k};
Daniel@0 107 pmk = pmi{1,j,k};
Daniel@0 108 for l = 1:length(ppk)
Daniel@0 109 fp = find(ppk(l) == sppj);
Daniel@0 110 if fp
Daniel@0 111 spvj(fp) = spvj(fp) + pvk(l);
Daniel@0 112 else
Daniel@0 113 sppj(end+1) = ppk(l);
Daniel@0 114 spvj(end+1) = pvk(l);
Daniel@0 115 spmj(end+1) = pmk(l);
Daniel@0 116 end
Daniel@0 117 end
Daniel@0 118 end
Daniel@0 119 sppi{1,j,1} = sppj;
Daniel@0 120 spvi{1,j,1} = spvj;
Daniel@0 121 spmi{1,j,1} = spmj;
Daniel@0 122 end
Daniel@0 123 spph{i} = sppi;
Daniel@0 124 spvh{i} = spvi;
Daniel@0 125 spmh{i} = spmi;
Daniel@0 126 else
Daniel@0 127 spph{i} = [];
Daniel@0 128 spvh{i} = [];
Daniel@0 129 spmh{i} = [];
Daniel@0 130 end
Daniel@0 131 if not(isempty(p)) && not(isempty(p{h}))
Daniel@0 132 p{h}{i} = p{h}{i}(:,:,1);
Daniel@0 133 end
Daniel@0 134 end
Daniel@0 135 sc{h} = sch;
Daniel@0 136 spp{h} = spph;
Daniel@0 137 spv{h} = spvh;
Daniel@0 138 spm{h} = spmh;
Daniel@0 139 end
Daniel@0 140 s = set(x,'Data',sc,'Pos',p,'PeakPos',spp,'PeakVal',spv,'PeakMode',spm);
Daniel@0 141 if not(isempty(postoption))
Daniel@0 142 s = post(s,postoption);
Daniel@0 143 end
Daniel@0 144
Daniel@0 145
Daniel@0 146 function s = post(s,option)
Daniel@0 147 if option.c
Daniel@0 148 d = get(s,'Data');
Daniel@0 149 for k = 1:length(d)
Daniel@0 150 for i = 1:length(d{k})
Daniel@0 151 d{k}{i} = center(d{k}{i});
Daniel@0 152 end
Daniel@0 153 end
Daniel@0 154 s = set(s,'Data',d);
Daniel@0 155 end
Daniel@0 156 if option.m
Daniel@0 157 d = get(s,'Data');
Daniel@0 158 ch = get(s,'Channels');
Daniel@0 159 if not(isempty(ch))
Daniel@0 160 for k = 1:length(d)
Daniel@0 161 for i = 1:length(d{k})
Daniel@0 162 d{k}{i} = d{k}{i}/length(ch{k});
Daniel@0 163 end
Daniel@0 164 ch{k} = [1];
Daniel@0 165 end
Daniel@0 166 s = set(s,'Data',d,'Channels',ch);
Daniel@0 167 end
Daniel@0 168 end
Daniel@0 169
Daniel@0 170
Daniel@0 171 function [y orig] = eachtemporalchunk(orig,option,missing)
Daniel@0 172 [y orig] = mirsum(orig,option);
Daniel@0 173
Daniel@0 174
Daniel@0 175 %function y = combinetemporalchunk(old,new)
Daniel@0 176 %do = get(old,'Data');
Daniel@0 177 %to = get(old,'Time');
Daniel@0 178 %dn = get(new,'Data');
Daniel@0 179 %tn = get(new,'Time');
Daniel@0 180 %y = set(old,'Data',{{[do{1}{1};dn{1}{1}]}},...
Daniel@0 181 % 'Time',{{[to{1}{1};tn{1}{1}]}});
Daniel@0 182 %
Daniel@0 183
Daniel@0 184 function y = combinechunk(old,new)
Daniel@0 185 if isa(old,'mirspectrum')
Daniel@0 186 warning('WARNING IN MIRSUM: not yet fully generalized to mirspectrum')
Daniel@0 187 end
Daniel@0 188 do = get(old,'Data');
Daniel@0 189 do = do{1}{1};
Daniel@0 190 dn = get(new,'Data');
Daniel@0 191 dn = dn{1}{1};
Daniel@0 192 if length(dn) < length(do)
Daniel@0 193 dn(length(do),:,:) = 0; % Zero-padding
Daniel@0 194 end
Daniel@0 195 y = set(old,'ChunkData',do+dn);