No BSD License  

Highlights from
Generic Signal Class

from Generic Signal Class by Stefan Bleeck
A generic class that allows easy signal (data in time) managment

sig=add(a,b,start_time,dauer)
% method of class @signal
% function sigresult=add(sig1,sig2,[start_time],[duration])
%   INPUT VALUES:
%       sig1:       first @signal
%       sig2:       second @signal or struct
%       start_time: start time for the addition. [default: 0]
%       duration:   duration of the signal, that is added [default: getlength(sig2)]
%   RETURN VALUE:
%       sigresult:  @signal that is the sum of signals sig1 and sig2`
%       the resulting signal can be longer then sig1 or sig2, when start_time
%       and duration is according. sig2 can be a signal-object or an struct
%
% 
% (c) 2003, University of Cambridge, Medical Research Council 
% Stefan Bleeck (stefan@bleeck.de)
% http://www.mrc-cbu.cam.ac.uk/cnbh/aimmanual
% $Date: 2003/08/06 10:46:30 $
% $Revision: 1.5 $


function sig=add(a,b,start_time,dauer)

if nargin < 4
    if isobject(b)
        dauer=getlength(b);
    end
end
if nargin < 3
    start_time=0;
end

% wenn ein Spaltenvektor hinaufaddier werden soll
if isnumeric(b)
    sr=GetSR(a);
    nr=size(b)
    if nr>1
        temp=signal(b,sr);  % erzeuge ein neues Signal aus den Werten
        sig=add(a,temp);    % und lasse dann die beiden Signale zusammenaddieren
    else
        sig=a+b;
    end
    return;
end



% das resultierede Signal kann lnger sein als die Ausgangssignale
% erst feststellen, wie lang das nachher sein soll
laenge1=getlength(a);
laenge2=getlength(b); %so lang ist das zweite Signal
if laenge2<dauer
    disp('error: the signal is shorter then the duration');
    return;
end

sr1=getsr(a);
sr2=getsr(b);
if sr1~=sr2
    error('signal::add::error: samplerates differ - not implemented yet');
end

lneu=start_time+dauer;    % so lang wird das neue Signal
if lneu<laenge1 % oder es ist nicht lnger als vorher
    lneu=laenge1;
end

binl1=time2bin(a,lneu+getminimumtime(a));
binl2=time2bin(a,laenge1+getminimumtime(a));    %achtung, sonst rundungsfehler
if binl1 > binl2 % wenn das neue Signal lnger wird
    temp=signal(lneu,sr1,a.name,a.unit_x,a.unit_y,a.start_time);
    % kopiere zuerst das alte Signal
    start=1;
    stop=time2bin(a,laenge1+getminimumtime(a));
    temp.werte(start:stop)=a.werte(start:stop);
    % rekursiver Aufruf, denn nun ist das Signal lang genug
    sig=add(temp,b,start_time,dauer);
    return;
end

% normalfall: Das Ergebnissignal ist nun hchstens genauso lang
sig=a;  %kopieren des alten Signals in das Rckgabesignal
start1=time2bin(a,start_time)+1;
% stop1=time2bin(a,start_time+dauer-1/sr1);
stop1=time2bin(a,start_time+dauer);
start2=1;
stop2=time2bin(a,dauer+getminimumtime(a));

% do some error checking:
if stop2-start2 == stop1-start1
    sig.werte(start1:stop1)=sig.werte(start1:stop1)+b.werte(start2:stop2);
else
    if start1>1
        stop1=start1+stop2-start2;
        sig.werte(start1:stop1)=sig.werte(start1:stop1)+b.werte(start2:stop2);
    else
      
        disp('signal::add problem with adding - havent added')
    end
end

return;




Contact us at files@mathworks.com