diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirsum.m @ 0:e9a9cd732c1e tip

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