%function subback
%
%This function will subtract the background of a spectrum in a iterative
%way. It will fit a polynom through the datapoints and those points either
%of the fitted polynome or those of the spectrum below the fitted spectrum
%will be used for the following iteration. In this way, with higher
%iterations, one obtains a better prediction of the background.
%
%Syntax:
% NewSpectra = subback (Spectra, xaxis, iter, order, doplot)
% NewSpectra = subback (Spectra, xaxis)
%
%With:
% Spectra: datamatrix with the spectra in rows
% xaxis: the corresponding x-axis
% iter: the number of iterations to do, standard value 200
% order: order of the polynom used for fitting, standard value 5
% doplot: boolean: indicates whether plots of the original spectrum with
% fitted background, and plots of the resulting spectrum need to be
% made
% NewSpectra: the spectra with the background subtracted
%
%Literature:
% 1) Lieber CA, Mahadevan-Jansen A, Automated method for subtraction of
% fluorescence from biological Raman spectra, Applied spectroscopy, 57
% (2003) 11, 1363-1367
%
%Example:
% load data
% xaxis = 1:size(data,2);
% subplot (2,1,1);
% plot (xaxis, data);
% title ('Original dataset');
% subplot (2, 1, 2);
% plot (xaxis, subback (data, xaxis, 100, 5, 0));
% title ('Background subtracted');
%The Biodata toolbox for MATLAB: a spectral database system for storing and
%processing spectra
%C 2005-2008, Kris De Gussem, Raman Spectroscopy Research Group, Department
%of analytical chemistry, Ghent University
%C 2009 Kris De Gussem
%
%This file is part of Biodata.
%
%Biodata 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.
%
%Biodata 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 Biodata. If not, see <http://www.gnu.org/licenses/>.
%Copyright (c) 2005-2009, 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 [NewSpectra, param] = subback (Spectra, xaxis, iter, order, doplot)
switch nargin
case 2
doplot = 0;
iter = 200;
order = 5;
case 5
otherwise
error ('Biodata:msg', 'Wrong number of input parameters...');
end
[m,n] = size(Spectra);
NewSpectra = zeros(m,n);
warning off MATLAB:polyfit:RepeatedPointsOrRescale
param.P = cell(m,1);
param.S = cell(m,1);
h_importspec = waitbar(0,'Subtracting background...');
for nr = 1:m %do all spectra in matrix
waitbar(nr/m, h_importspec);
ThisSpectrum = Spectra(nr,:);
for i = 1:iter %just do some iterations so that iwhe have a perfect estimate of the background
[P,S] = polyfit(xaxis,ThisSpectrum,order);
NewSpectra(nr,:) = polyval (P, xaxis);
ind = find (NewSpectra(nr,:) > ThisSpectrum);
NewSpectra(nr,ind) = ThisSpectrum(1,ind);
ThisSpectrum = NewSpectra(nr,:);
end
back = polyval (P, xaxis);
if doplot
%plot the two spectra
figure('name', 'Result of background subtraction');
plot (xaxis, Spectra(nr,:), 'b',xaxis, NewSpectra(nr,:), 'r');
h = title ([ 'Spectrum ' num2str(nr) ]);
set(h, 'Fontweight', 'bold');
set(h, 'Fontsize', 16);
legend('Original spectrum', 'Fitted background');
figure('name', 'Result: background-subtracted spectrum');
%plot the final spectrum as wel
plot (xaxis, Spectra(nr,:)-back);
h = title ([ 'Spectrum ' num2str(nr) ]);
set(h, 'Fontweight', 'bold');
set(h, 'Fontsize', 16);
end
NewSpectra(nr,:) = Spectra(nr,:)-back;
try
param.P{nr} = P;
param.S{nr} = S;
catch
end
end
close(h_importspec);
warning on MATLAB:polyfit:RepeatedPointsOrRescale
param.iter = iter;
param.order = order;
param.doplot = doplot;