File Exchange

image thumbnail


version (1.67 KB) by Vassili Pastushenko
Generalization and improvement of SGOLAYFILT(Dat,1,Frame).

1 Download

Updated 27 Jul 2004

No License

Program: SAVFILT

Simply AVeraging FILTer for vectors or matrices (works on columns of matrices)

Description: generalized and improved version of SGOLAYFILT(Dat,1,W)

In practice SGOLAYFILT is most frequently used with ORDer 1, because at given filtering frame W the ORDer 1 gives the highest smoothening of the Data. Advantages of SAVFILT(Dat,W) in comparison to SGOLAYFILT(Dat,1,W):

1. Better results at the rands of the Data: instead of arbitrary padding the Data with zeros, a possibly wide frame is used at the rands.
2. SAVFILT accepts arbitrary frames W>1, not only odd ones, as SGOLAYFILT does. The results of filtering white noise with any W>1 leads to almost by the factor of sqrt(W) smaller standard deviation of the filtered data in comparison to raw data. This feature is especially helpful in the case of filtering periodical data with an arbitrary period.
3. With odd W SAVFILT works more than 2 times faster than SGOLAYFILT, and about at the same speed in the case of nonodd W (can be made equally fast and with exact efficiency sqrt(W)). The Efficiency of any low-pass filter is defined as: E=std(Dat)/std(DatF), Dat being white gaussian noise and DatF is filtered Dat Call:

Dat = Data to be filtered, a matrix N*M, any([N,M]>1)
E= filter efficiency, abs(E)>1
W= abs(E)^2
% W or E are used interchangeably. If nargin>2, W-value will be replaced by W=abs(E^2)

DatF = Filtered Data

V.Pastushenko, 22-nd July 1993, J.Kepler Univ. of Linz, Austria

Cite As

Vassili Pastushenko (2021). SAVFILT (, MATLAB Central File Exchange. Retrieved .

Comments and Ratings (5)


You can accelerate the processing by ~30%, if you replace the lines:
81: BEGIN=DatF(1:2:W,:);
95: DatF=DatF.*WEIG;
w1 = transpose(1:2:W);
iw1 = 1 ./ w1;
iw1C = iw1(:, ones(1, C));
BEGIN = DatF(w1, :);
ENDIN = cumsum(Dat(R:-1:R-W+1, :));
DatF(HW+2:R-HW-1, :) = (DatF(W+1:R-1, :) -
DatF(1:R-W-1, :)) .* (1 / W);
DatF(1:HW+1, :) = BEGIN .* iw1C;
DatF(R:-1:R-HW, :) = ENDIN(w1, :) .* iw1C;
Kind regards, Jan

Ferry Kienberger

Worked very well indeed!


I like Savitzky-Golay filter for smoothing and differentiation.

Jianwen Luo

Very Good.

Jianwen Luo

Very Good!

MATLAB Release Compatibility
Created with R12.1
Compatible with any release
Platform Compatibility
Windows macOS Linux

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!