b = sgolay(k,f) designs a Savitzky-Golay FIR smoothing filter b. The polynomial order k must be less than the frame size, f, which must be odd. If k = f-1, the designed filter produces no smoothing. The output, b, is an f-by-f matrix whose rows represent the time-varying FIR filter coefficients. In a smoothing filter implementation (for example,sgolayfilt), the last (f-1)/2 rows (each an FIR filter) are applied to the signal during the startup transient, and the first (f-1)/2 rows are applied to the signal during the terminal transient. The center row is applied to the signal in the steady state.
b = sgolay(k,f,w) specifies a weighting vector w with length f, which contains the real, positive-valued weights to be used during the least-squares minimization.
[b,g] = sgolay(...) returns the matrix g of differentiation filters. Each column of g is a differentiation filter for derivatives of order p-1 where p is the column index. Given a signal x of length f, you can find an estimate of the pth order derivative, xp, of its middle value from:
xp((f+1)/2) = (factorial(p)) * g(:,p+1)' * x
b = sgolay(k,f) b = sgolay(k,f,w) [b,g] = sgolay(...)
%Use sgolay to smooth a noisy sinusoid. Compute the resulting first and second derivatives. N = 4; % Order of polynomial fit F = 21; % Window length [b,g] = sgolay(N,F); % Calculate S-G coefficients dx = 0.2; xLim = 200; x = 0:dx:xLim-1; y = 5*sin(0.4*pi*x) + randn(size(x)); % Sinusoid with noise HalfWin = ((F+1)/2) -1; for n = (F+1)/2:996-(F+1)/2, % Zeroth derivative (smoothing only) SG0(n) = dot(g(:,1),y(n - HalfWin:n + HalfWin)); % 1st differential SG1(n) = dot(g(:,2),y(n - HalfWin:n + HalfWin)); % 2nd differential SG2(n) = 2*dot(g(:,3)',y(n - HalfWin:n + HalfWin))'; end SG1 = SG1/dx; % Turn differential into derivative SG2 = SG2/(dx*dx); % and into 2nd derivative