This is machine translation

Translated by Microsoft
Mouse over text to see original. Click the button below to return to the English verison of the page.


Savitzky-Golay filtering


y = sgolayfilt(x,order,framelen)
y = sgolayfilt(x,order,framelen,weights)
y = sgolayfilt(x,order,framelen,weights,dim)


y = sgolayfilt(x,order,framelen) applies a Savitzky-Golay FIR smoothing filter to the data in vector x. If x is a matrix, sgolayfilt operates on each column. The polynomial order, order, must be less than the frame length, framelen, and in turn framelen must be odd. If k = framelen-1, the filter produces no smoothing.

y = sgolayfilt(x,order,framelen,weights) specifies a weighting vector, weights, with length framelen, which contains the real, positive-valued weights to be used during the least-squares minimization. If weights is not specified, or if it is specified as empty, [], it defaults to an identity matrix.

y = sgolayfilt(x,order,framelen,weights,dim) specifies the dimension, dim, along which the filter operates. If dim is not specified, sgolayfilt operates along the first nonsingleton dimension; that is, dimension 1 for column vectors and nontrivial matrices, and dimension 2 for row vectors.


collapse all

Generate a random signal and smooth it using sgolayfilt. Specify a polynomial order of 3 and a frame length of 11. Plot the original and smoothed signals.

order = 3;
framelen = 11;

lx = 34;
x = randn(lx,1);

sgf = sgolayfilt(x,order,framelen);

hold on

The sgolayfilt function performs most of the filtering by convolving the signal with the center row of B, the output of sgolay. The result is the steady-state portion of the filtered signal. Generate and plot this portion.

m = (framelen-1)/2;

B = sgolay(order,framelen);

steady = conv(x,B(m+1,:),'same');


Samples close to the signal edges cannot be placed at the center of a symmetric window and have to be treated differently.

To determine the startup transient, matrix multiply the first (framelen-1)/2 rows of B by the first framelen samples of the signal.

ybeg = B(1:m,:)*x(1:framelen);

To determine the terminal transient, matrix multiply the final (framelen-1)/2 rows of B by the final framelen samples of the signal.

yend = B(framelen-m+1:framelen,:)*x(lx-framelen+1:lx);

Concatenate the transients and the steaty-state portion to generate the complete signal.

cmplt = steady;
cmplt(1:m) = ybeg;
cmplt(lx-m+1:lx) = yend;

hold off

Adding weights to the minimization breaks the symmetry of B and requires extra steps for a proper solution.

Smooth the mtlb signal by applying a cubic Savitzky-Golay filter to data frames of length 41.

load mtlb
smtlb = sgolayfilt(mtlb,3,41);

plot(1:2000, mtlb(1:2000))
axis([0 2000 -4 4])

axis([0 2000 -4 4])

More About

collapse all


Savitzky-Golay smoothing filters (also called digital smoothing polynomial filters or least-squares smoothing filters) are typically used to "smooth out" a noisy signal whose frequency span (without noise) is large. In this type of application, Savitzky-Golay smoothing filters perform much better than standard averaging FIR filters, which tend to filter out a significant portion of the signal's high frequency content along with the noise. Although Savitzky-Golay filters are more effective at preserving the pertinent high frequency components of the signal, they are less successful than standard averaging FIR filters at rejecting noise.

Savitzky-Golay filters are optimal in the sense that they minimize the least-squares error in fitting a polynomial to frames of noisy data.


[1] Orfanidis, Sophocles J. Introduction to Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1996.

See Also

| | |

Introduced before R2006a

Was this topic helpful?