You are here : matlabSignal Processingsgolay

# sgolay() - Signal Processing

`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`

### Syntax

```b = sgolay(k,f)
b = sgolay(k,f,w)
[b,g] = sgolay(...)```

### Example

```%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```