R-DECO: An open-source Matlab based graphical user interface for the detection and correction of R-peaks 1.0.0

File: <base>/R_peak_detection/GUI/filtersignal.m (4,273 bytes)
function [signal,check] = filtersignal(signal,fs,type,order,hpf,lpf,stopf)

%  INPUT:   signal  - Signal
%           fs   - Sampling frequency
%           type - This is a vector of ones and zeros. 
%           order - This is a cell with the high pass and low pass filter orders
%                  
%           hpf   - cutoff frequency for highpass filter
%           lpf   - cutoff frequency for lowpass filter
%           stopf - cutoff frequency for band stop filter
%           other - 1 or 0, define a new filter when other ==1
%  OUTPUT:  signal - Filtered signal
%
%
% Author(s):    Jonathan Moeyersons       (Jonathan.Moeyersons@esat.kuleuven.be)
%               Sabine Van Huffel         (Sabine.Vanhuffel@esat.kuleuven.be)
%               Carolina Varon            (Carolina.Varon@esat.kuleuven.be)
%
% Version History:
% - 06/05/2019   JM      Initial version
%
% Copyright (c) 2019,  Jonathan Moeyersons, KULeuven-ESAT-STADIUS 
%
% This software is made available for non commercial research purposes only 
% under the GNU General Public License. However, notwithstanding any 
% provision of the GNU General Public License, this software may not be 
% used for commercial purposes without explicit written permission after 
% contacting jonathan.moeyersons@esat.kuleuven.be
%
% 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 <https://www.gnu.org/licenses/>.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Pre-define check
check = 1;

% Set the signal in the correct form (collumn vectors)
[R_temp,K_temp] = size(signal);
if R_temp < K_temp
    signal = signal';
end

% Get the Nyquist frequency
Nf = fs/2;  

% High pass filter
if type(1)
    try
        Cf      = hpf/Nf;        % Cutoff freq. Passband corner freq. 0.5Hz

        [bh,ah] = butter(order{1},Cf,'high');   % High pass filter
        signal  = filtfilt(bh,ah,signal);
    catch ME
        % Show an error dialog
        errordlg(ME.message)
        
        % Change check
        check=0;
    end    
end

% Low pass filter
if type(2)
    try
        Cf      = lpf/Nf;        % Cutoff freq. Passband corner freq. 100Hz

        [bl,al] = butter(order{2},Cf,'low');    % Low pass filter
        signal  = filtfilt(bl,al,signal);
    catch ME
        % Show an error dialog
        errordlg(ME.message)
        
        % Change check
        check=0;
    end 
end

% Notch filter
if type(3)
    try
        % Define zeros
        omega   = stopf/Nf*pi;
        zero(1) = cos(omega)+1i*sin(omega);
        zero(2) = cos(omega)-1i*sin(omega);

        % Define poles
        pole    = 0.99*zero;

        % Define coefficients
        bs      = [1 -zero(1)-zero(2) zero(1)*zero(2)] ;
        as      = [1 -pole(1)-pole(2) pole(1)*pole(2)] ;

        signal  = filtfilt(bs,as,signal);
    catch ME
        % Show an error dialog
        errordlg(ME.message)
        
        % Change check
        check = 0;
    end 
end 

% Self designed filter
if type(4)
    try
        % Design filter
        Filt = designfilt;

        if ~isempty(Filt)
            if strcmp(Filt.FrequencyResponse,'differentiator') || strcmp(Filt.FrequencyResponse,'hilbert')
                 % Filter the signal
                 signal = filter(Filt,signal);
            else
                % Filter the signal
                signal = filtfilt(Filt,signal);   
            end
        else
            % Change check
            check = 0;
        end
    catch ME
        % Show an error dialog
        errordlg(ME.message)

        % Change check
        check = 0;
    end
end