sgolay
Savitzky-Golay Filter Design
Syntax
[B, C] = sgolay(k, nf) [B, C] = sgolay(k, nf, w)
Arguments
- k
- a positive scalar with integer value: the fitting polynomial degree. 
- nf
- a positive scalar with integer value: the filter length, must be odd and greater than k+1. 
- w
- a real vector of length nf with positive entries: the weights. If omitted no weights are applied. 
- B
- a real n by n array: the set of filter coefficients: the early rows of B smooth based on future values and later rows smooth based on past values, with the middle row using half future and half past. In particular, you can use row i to estimate x(k) based on the i-1 preceding values and the n-i following values of x values as y(k) = B(i,:) * x(k-i+1:k+n-i). 
- C
- a real n by k+1 array: the matrix of differentiation filters. Each column of C is a differentiation filter for derivatives of order P-1 where P is the column index. Given a signal X with length nf, an estimate of the P-th order derivative of its middle value can be found from: (P) X ((nf+1)/2) = P!*C(:,P+1)'*X
Description
This function computes the smoothing FIR Savitzky-Golay Filter. This is achieved by fitting successive sub-sets of adjacent data points with a low-degree polynomial by the method of linear least squares.
This filter can also be used to approximate numerical derivatives.
Examples
- The sgolay function can be used to construct FIR filter with no group delay. The following instructions explains what the sgolayfilt function does: - dt = 0.01; t = (0:0.01:4*%pi)'; x = sin(t)+0.05*rand(t,'normal'); nf = 61; [B,C] = sgolay(3,nf); nfs2 = floor(nf/2); //compute the middle part of the filtered signal xfm = filter(B(nfs2+1,:), 1, x); xfm = xfm(nf:$); //compute the left part of the filtered signal xfl = B(1:nfs2,:)*x(1:nf); //compute the right part of the filtered signal xfr = B(nfs2+2:nf,:)*x($-nf+1:$); clf plot(t,x,'b',t,[xfl;xfm;xfr],'r'); gce().children(1).thickness = 2; legend(["Raw","Filtered"]); - The above script generate this graph:  
- It can also be used to obtain approximate derivatives: - dt=0.01; t = (0:0.01:4*%pi)'; x = sin(t)+0.03*rand(t,'normal'); nf = 61; [B,C] = sgolay(3,nf); nfs2 = floor(nf/2); dx=-conv(x,C(:,2)',"valid"); d2x=2*conv(x,C(:,3)',"valid"); clf(); subplot(211) plot(t(2:$),diff(x)/dt,'g',t,cos(t),'b',t(nfs2+1:$-nfs2),dx/dt,'r'); legend(["diff","theoretical","sgolay"]); title("First order differentiation") subplot(212) plot(t,-sin(t),'b',t(nfs2+1:$-nfs2),d2x/(dt^2),'r'); legend(["theoretical","sgolay"]); title("Second order differentiation")  
Bibliography
Abraham Savitzky et Marcel J. E. Golay, « Smoothing and Differentiation of Data by Simplified Least Squares Procedures », Analytical Chemistry, vol. 8, no 36, 1964, p. 1627–1639 (DOI 10.1021/ac60214a047)
See Also
- sgolayfilt — Filter signal using Savitzky-Golay Filter.
- conv — discrete 1-D convolution.
History
| Version | Description | 
| 6.1.1 | Function added. Courtesy of Serge Steer, INRIA | 
| Report an issue | ||
| << remezb | Filters | sgolaydiff >> |