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 |