IRootLab
An Open-Source MATLAB toolbox for vibrational biospectroscopy
diff_sg.m
Go to the documentation of this file.
1 %>@ingroup maths
2 %> @file
3 %> @brief Savitzky-Golay differentiation
4 %>
5 %> There are two ways to use it:
6 %>@code
7 %> [X_after] = diff_sg(X, [], order, porder, ncoeff);
8 %>@endcode
9 % or
10 %>@code
11 %> [X_after, x_after] = diff_sg(X, x, order, porder, ncoeff);
12 %>@endcode
13 %>
14 %> First case is when second parameter (x) is passed as an []
15 %
16 %> @param X Matrix
17 %> @param x x-axis values corresponding to the columns of @c X
18 %> @param order Differential order. Accepted values: 1 or 2
19 %> @param porder Polynomial order
20 %> @param ncoeff Number of filter coefficients. Must be off
21 %> @return <em>[X_after]</em> or <em>[X_after, x_after]</em> as described above.
22 function varargout = diff_sg(X, x, order, porder, ncoeff)
23 
24 if ~exist('order', 'var')
25  order = 1;
26 end;
27 if ~exist('porder', 'var')
28  porder = 2;
29 end;
30 if ~exist('ncoeff', 'var')
31  ncoeff = 9;
32 end;
33 
34 if order ~= 1 && order ~= 2
35  error('Accepted differential orders: 1 and 2 only!');
36 end;
37 
38 
39 if ncoeff/2 == floor(ncoeff/2)
40  error('Number of filter coefficients must be odd!');
41 end;
42 
43 flag_x = ~isempty(x);
44 [no, nf] = size(X);
45 factor = factorial(order);
46 nf_after = nf + ncoeff-1 - (ncoeff-1)*2; % first additive term is in account for convolution,
47  % second (subtractive term is in account for the (ncoeff-1) border instabilities)
48 X_after = zeros(no, nf_after);
49 
50 
51 [b, g] = sgolay(porder, ncoeff); % g is a matrix containing one filter per column. i-th column is (i-1)-th derivative corresponding filter
52 H = g(:, order+1);
53 H = H(end:-1:1); % filter is reversed because it is designed by sgolay() for dot product, not convolution
54 
55 for i = 1:no
56  temp = conv(X(i, :), H);
57  X_after(i, :) = temp(ncoeff:end-ncoeff+1)*factor;
58 end;
59 
60 if flag_x
61  offset = (ncoeff-1)/2;
62  x_after = x(1+offset:nf-offset);
63 end;
64 
65 if ~flag_x
66  varargout = {X_after};
67 else
68  varargout = {X_after, x_after};
69 end;
70 
71 
function diff_sg(in X, in x, in order, in porder, in ncoeff)
Analysis Session (AS) base class.
Definition: as.m:6