Back to Code

ezfilt

Uses multiple regression based on a selection of cosines.

function [slow, fast] = ezfilt(signal, Fs, cutFreq)

% function [slow, fast] = ezfilt(signal, Fs, cutFreq)

fcrit = cutFreq;

% Create X
X = [];
t = 1:length(signal);
t = (t - 0) ./ Fs;
T = t(end);
f0 = 0;
while 1 == 1,
    cos0 = cos(2 * pi * f0 * t);
    X = [X cos0(:)];
    f0 = f0 + 0.5 / T;
    if f0 > fcrit,
        break;
    end;
end;

% Fit
b = inv(X' * X) * X' * signal(:);
slow = X * b;
fast = signal(:) - slow;

If you have the signal processing toolbox, the normal approach would be to use a real filter as follows:
function vecfilt = teg_filt(vec, Fs, freqLims, hilostr)

% vecfilt = teg_filt(vec, Fs, freqLims, hilostr)
%
% http://www.electronics-tutorials.ws/filter/filter_8.html
% nth order butterworth: H(jw) = 1 / sqrt(1 + eps^2 * (w / w_p)^(2n)))

bw_n = 3; % 6 * bw_n per doubling of frequency
Wn = freqLims ./ (0.5 * Fs);

[z,p,k] = butter(bw_n, Wn, hilostr);
sos = zp2sos(z,p,k);

vecfilt = sosfilt(sos, vec);
vecfilt = sosfilt(sos, vecfilt(end:(-1):1));
vecfilt = vecfilt(end:(-1):1);