%Function savgol
%
%This function performs savitsky-golay preprocessing on a spectrum.
%
%Syntax:
% SG = savgol (x, wi, or, deriv)
%
%Parameters:
% x: the dataset, one row is one spectrum
% wi: width of the window
% or: order of the polynomial
% deriv: order of the derivative of the polynomial
% SG: the preprocessed dataset
%
%Example:
% load data
% xaxis = 1:size(data,1);
% subplot (2,1,1);
% plot (xaxis, data);
% title ('Original dataset');
% subplot (2, 1, 2);
% plot (xaxis, savgol (data, 13, 2, 1));
% title ('First derivative');
%This software package is dual licensed. You can use it according to the terms
%of either the GPLv3 or the BSD license.
%
%C 2007, Kris De Gussem, Raman Spectroscopy Research Group, Department
%of analytical chemistry, Ghent University
%
%This program is free software: you can redistribute it and/or modify
%it under the terms of the GNU General Public License as published by
%the Free Software Foundation, either version 3 of the License, or
%(at your option) any later version.
%
%This program is distributed in the hope that it will be useful,
%but WITHOUT ANY WARRANTY; without even the implied warranty of
%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%GNU General Public License for more details.
%
%You should have received a copy of the GNU General Public License
%along with this program. If not, see
%http://www.gnu.org/licenses/.
%Copyright (c) 2007, Kris De Gussem
%All rights reserved.
%
%Redistribution and use in source and binary forms, with or without
%modification, are permitted provided that the following conditions are
%met:
%
% * Redistributions of source code must retain the above copyright
% notice, this list of conditions and the following disclaimer.
% * Redistributions in binary form must reproduce the above copyright
% notice, this list of conditions and the following disclaimer in
% the documentation and/or other materials provided with the distribution
% * Neither the name of Raman Spectroscopy Research Group, Department of
% analytical chemistry, Ghent University nor the names
% of its contributors may be used to endorse or promote products derived
% from this software without specific prior written permission.
%
%THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
%AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
%IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
%ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
%LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
%CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
%SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
%INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
%CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
%ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
%POSSIBILITY OF SUCH DAMAGE.
function SG = savgol (x, wi, or, deriv)
g = sgsdf(-(wi-1)/2:(wi-1)/2, or, deriv); % Calculate S-G coefficients
[n,m] = size(x);
g=repmat(g,n,1);
HalfWin = ((wi+1)/2) -1;
EOS = m-(wi+1)/2+1;
SG = zeros(n,m);
for i = (wi+1)/2:EOS
SG(:,i) = dot(g, x(:,i - HalfWin: i + HalfWin),2);
end
cb = EOS+1:m;
SG(:,cb) = repmat (SG(:,EOS), 1, length (cb));