annotate aim-mat/tools/@signal/smooth.m @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents 20ada0af3d7d
children
rev   line source
tomwalters@0 1 % method of class @signal
tomwalters@0 2 % function sigresult=smooth(org_sig,sigma)
tomwalters@0 3 % INPUT VALUES:
tomwalters@0 4 % org_sig: orgiginal @signal
tomwalters@0 5 % sigma: smooth width
tomwalters@0 6 % type: 'gauss' gauss average, sigma is sigma of gauss function (default)
tomwalters@0 7 % 'rect' rectangle window, width = 2*sigma+1
tomwalters@0 8 % mirrow signal at border
tomwalters@0 9 %
tomwalters@0 10 % RETURN VALUE:
tomwalters@0 11 % sigresult: smoothed @signal
tomwalters@0 12 %
tomwalters@0 13 % smoothes the signal by multipliing it with gaussian filters of
tomwalters@0 14 % the width "sigma" in ms
tomwalters@0 15 %
bleeck@3 16 % This external file is included as part of the 'aim-mat' distribution package
bleeck@3 17 % (c) 2011, University of Southampton
bleeck@3 18 % Maintained by Stefan Bleeck (bleeck@gmail.com)
bleeck@3 19 % download of current version is on the soundsoftware site:
bleeck@3 20 % http://code.soundsoftware.ac.uk/projects/aimmat
bleeck@3 21 % documentation and everything is on http://www.acousticscale.org
tomwalters@0 22
tomwalters@0 23 function sig=smooth(org_sig,sigma, type)
tomwalters@0 24
tomwalters@0 25 % vals=getvalues(org_sig);
tomwalters@0 26 % % check sigma
tomwalters@0 27 % if sigma<3
tomwalters@0 28 % sigma==3
tomwalters@0 29 % end
tomwalters@0 30 % if mod(sigma, 2)==0
tomwalters@0 31 % sigma=sigma+1
tomwalters@0 32 % end
tomwalters@0 33 % % Generate Kernel
tomwalters@0 34 % t = (-2*sigma):(2*sigma);
tomwalters@0 35 % kernel = 1/(sqrt(2*pi)*sigma)*exp(-(t).^2/(2*sigma.^2));
tomwalters@0 36 %
tomwalters@0 37 if (nargin<3)
tomwalters@0 38 type='gauss';
tomwalters@0 39 end
tomwalters@0 40
tomwalters@0 41 vals=getvalues(org_sig);
tomwalters@0 42 new_vals=vals;
tomwalters@0 43 % Stefans's version
tomwalters@0 44 if strcmp(type,'gauss')
tomwalters@0 45 nr_points=getnrpoints(org_sig);
tomwalters@0 46 smooth_base=1:nr_points;
tomwalters@0 47 smooth_frame = zeros(nr_points,1);
tomwalters@0 48 for ii = 1:nr_points
tomwalters@0 49 % kernel = exp(-(smooth_base-ii).^2/(2*sigma^2));
tomwalters@0 50 kernel = exp(-(((smooth_base-ii).*(smooth_base-ii))/(2*sigma*sigma)));
tomwalters@0 51 kernel = kernel / sum(kernel);
tomwalters@0 52 new_vals(ii) = sum(vals.*kernel');
tomwalters@0 53 end
tomwalters@0 54 end
tomwalters@0 55 if strcmp(type, 'rect')
tomwalters@0 56 nr_points=getnrpoints(org_sig);
tomwalters@0 57 % mirroring the border
tomwalters@0 58 sigma=round(sigma);
tomwalters@0 59 vals=vals';
tomwalters@0 60 if (length(vals)<sigma)
tomwalters@0 61 sig=signal(org_sig);
tomwalters@0 62 results(1:nr_points) = mean(vals');
tomwalters@0 63 sig=setvalues(sig, results');
tomwalters@0 64 return;
tomwalters@0 65 end
tomwalters@0 66 vals = [upsidedown(vals(1:sigma)) vals upsidedown(vals((end-sigma+1):end))];
tomwalters@0 67 % kernel = ones(1, (2*sigma+1));
tomwalters@0 68 % kernel = kernel/sum(kernel);
tomwalters@0 69 faktor = 1/(2*(sigma+1));
tomwalters@0 70 vals = vals.*faktor;
tomwalters@0 71 for i=1:nr_points
tomwalters@0 72 new_vals(i) = sum(vals(i:(i+2*sigma)));
tomwalters@0 73 end
tomwalters@0 74 new_vals=new_vals';
tomwalters@0 75 end
tomwalters@0 76
tomwalters@0 77
tomwalters@0 78
tomwalters@0 79 sig=signal(org_sig);
tomwalters@0 80 sig=setvalues(sig, new_vals);
tomwalters@0 81 sig=setname(sig, sprintf('smoothed Signal %s', getname(org_sig)));
tomwalters@0 82
tomwalters@0 83
tomwalters@0 84
tomwalters@0 85 % turns a vector (row) upside down
tomwalters@0 86 function y=upsidedown(x)
tomwalters@0 87 y=[];
tomwalters@0 88 for i=length(x):-1:1
tomwalters@0 89 y=[y x(i)];
tomwalters@0 90 end