3 %> @brief Savitzky-Golay differentiation
5 %> There are two ways to use it:
7 %> [X_after] =
diff_sg(X, [], order, porder, ncoeff);
11 %> [X_after, x_after] =
diff_sg(X, x, order, porder, ncoeff);
14 %> First
case is when second parameter (x) is passed
as an []
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)
24 if ~exist('order', 'var')
27 if ~exist('porder', 'var')
30 if ~exist('ncoeff', 'var')
34 if order ~= 1 && order ~= 2
35 error('Accepted differential orders: 1 and 2 only!');
39 if ncoeff/2 == floor(ncoeff/2)
40 error('Number of filter coefficients must be odd!');
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);
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
53 H = H(end:-1:1); % filter is reversed because it is designed by sgolay() for dot product, not convolution
56 temp = conv(X(i, :), H);
57 X_after(i, :) = temp(ncoeff:end-ncoeff+1)*factor;
61 offset = (ncoeff-1)/2;
62 x_after = x(1+offset:nf-offset);
66 varargout = {X_after};
68 varargout = {X_after, x_after};
function diff_sg(in X, in x, in order, in porder, in ncoeff)
Analysis Session (AS) base class.