view aim-mat/tools/@signal/smooth.m @ 0:74dedb26614d

Initial checkin of AIM-MAT version 1.5 (6.4.2011).
author tomwalters
date Fri, 20 May 2011 12:32:31 +0100
parents
children 20ada0af3d7d
line wrap: on
line source
% 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-2008, University of Cambridge, Medical Research Council 
% Maintained by Tom Walters (tcw24@cam.ac.uk), written by Stefan Bleeck (stefan@bleeck.de)
% http://www.pdn.cam.ac.uk/cnbh/aim2006
% $Date: 2008-06-10 18:00:16 +0100 (Tue, 10 Jun 2008) $
% $Revision: 585 $

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