Bandpass filter vs sequential high and lowpass filter in Matlab: weird difference
Show older comments
I am trying to bandpass a neural signal acquired at 20kHz between 0.5 and 100 Hz. I have tried to do it in two ways. The first way is to sequentially highpass and lowpass the signal and the second one is to use the bandpass function in Matlab. To my surprise, the results were dramatically different. See image below:

Here is the code:
clear
close all
load('bandpass_vs_seq_lo_and_hi_pass','tr','fs') % loads variable called tr and fs
% tr is the signal vector and fs is the sampling rate, 20kHz
padlen=0.01; % padding length in secs to remove transients at signal start and end
padn=padlen*fs; % padding length in samples
f_lo=0.5; % lo cutoff
f_hi=100; % hi cutoff
tvec=(1/fs:1/fs:1/fs*length(tr));
figure
ax1=subplot(3,1,1);
ax2=subplot(3,1,2);
ax3=subplot(3,1,3);
% sequential highpass and lowpass filter
% hipass filter
nutr=[flipud(tr(1:padn));tr;flipud(tr(end-(padn-1):end))]; % prefixing and appending signal
[filtr,~]=highpass(nutr,f_lo,fs);
filtr=filtr(padn+1:end-padn); % removing prefixed and appended parts
tr1=filtr;
% lopass filter
nutr=[flipud(tr1(1:padn));tr1;flipud(tr1(end-(padn-1):end))];
[filtr2,~]=lowpass(nutr,f_hi,fs);
filtr2=filtr2(padn+1:end-padn);
tr1=filtr2;
% bandpass filter
nutr=[flipud(tr(1:padn));tr;flipud(tr(end-(padn-1):end))];
[filtr,~]=bandpass(nutr,[f_lo,f_hi],fs);
filtr=filtr(padn+1:end-padn);
tr2=filtr;
plot(ax1,tvec,tr)
plot(ax2,tvec,tr1)
plot(ax3,tvec,tr2)
xlabel(ax3,'Time (s)')
title(ax1,'Original signal, fs=20kHz')
title(ax2,'Sequential high pass and lowpass (0.5 to 100 Hz)')
title(ax3,'Bandpass (0.5 to 100 Hz)')
Can anyone shed light on what is going on here?
Also asked here:
https://dsp.stackexchange.com/questions/73407/bandpass-filter-vs-sequential-high-and-lowpass-filter-in-matlab-weird-differenc
3 Comments
Mathieu NOE
on 24 Feb 2021
hello
this is weird... I tested your code on a simple white noise and it gives strange results...
I first believed there is too large a factor between the (high) sampling rate (20 kHz) and the frequency range of interest (0.5 -100 Hz) so I introduced a decimation first before filtering , but that did not really help.
I found that even the sequential approach gives some oscillations at the beginning of the signal - see below

to get rid of these oscillations, I had to increase the hipass cut off freq to 5 Hz ... quite siginficant !

also strange to me is the difference of resulting amplitude between plot 2 and 3 (?)
Also the code is very slow on my machine. I guess I would prefer to stick to the "old" way using butter and filtfilt
at least i know what filter orders I use and I can plot the filter transfer function...
Anand Kulkarni
on 28 Feb 2021
Mathieu NOE
on 1 Mar 2021
hello
just minor improvement, if you detrend (remove mean value of your signal), you can probably reduce the amount of padding needed
tr = tr -mean(tr );
Accepted Answer
More Answers (0)
Categories
Find more on Signal Processing Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!