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);