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=smooth(org_sig,sigma, type)
% method of class @signal
% function sigresult=smooth(org_sig,sigma)
%   INPUT VALUES:
%       org_sig:       orgiginal @signal
%       sigma:         smooth width
%       type:          'gauss'  gauss average, sigma is sigma of gauss function (default)
%                      'rect'   rectangle window,  width = 2*sigma+1 
%                               mirrow signal at border
%                       
%   RETURN VALUE:
%       sigresult:  smoothed @signal
%
% smoothes the signal by multipliing it with gaussian filters of
% the width "sigma" in ms
%
% (c) 2003, University of Cambridge, Medical Research Council 
% Stefan Bleeck (stefan@bleeck.de)
% http://www.mrc-cbu.cam.ac.uk/cnbh/aimmanual
% $Date: 2003/06/27 16:03:30 $
% $Revision: 1.6 $

function sig=smooth(org_sig,sigma, type)

% vals=getvalues(org_sig);
% % check sigma 
% if sigma<3
%     sigma==3
% end
% if mod(sigma, 2)==0
%     sigma=sigma+1
% end
% % Generate Kernel
% t = (-2*sigma):(2*sigma);
% kernel = 1/(sqrt(2*pi)*sigma)*exp(-(t).^2/(2*sigma.^2));
% 
if (nargin<3)
    type='gauss';
end

vals=getvalues(org_sig);
new_vals=vals; 
% Stefans's version
if strcmp(type,'gauss')
    nr_points=getnrpoints(org_sig);
    smooth_base=1:nr_points;
    smooth_frame = zeros(nr_points,1);
    for ii = 1:nr_points
%         kernel = exp(-(smooth_base-ii).^2/(2*sigma^2));
        kernel = exp(-(((smooth_base-ii).*(smooth_base-ii))/(2*sigma*sigma)));
        kernel = kernel / sum(kernel);
        new_vals(ii) = sum(vals.*kernel');
    end
end
if strcmp(type, 'rect')
   nr_points=getnrpoints(org_sig); 
   % mirroring the border
   sigma=round(sigma);
   vals=vals';
   if (length(vals)<sigma)
       sig=signal(org_sig);
       results(1:nr_points) = mean(vals');
       sig=setvalues(sig, results');
       return;
   end
   vals = [upsidedown(vals(1:sigma)) vals upsidedown(vals((end-sigma+1):end))];
%    kernel = ones(1, (2*sigma+1));
%    kernel = kernel/sum(kernel);
   faktor = 1/(2*(sigma+1));
   vals = vals.*faktor;
   for i=1:nr_points
       new_vals(i) = sum(vals(i:(i+2*sigma)));
   end
   new_vals=new_vals';
end


 
sig=signal(org_sig);
sig=setvalues(sig, new_vals);
sig=setname(sig, sprintf('smoothed Signal %s', getname(org_sig)));



% turns a vector (row) upside down
function y=upsidedown(x)
y=[];
for i=length(x):-1:1
    y=[y x(i)];
end

Contact us at files@mathworks.com