High-pass Butterworth filter and filtfilt

16 views (last 30 days)
Hello everyone, I'm trying to high-filter a signal beacause when I perform a fft of the original signal I find a contribution at very low frequency even if I take the fft of detrend(signal). I want to cut out that contribution. I wrote this simple script:
Fcp=3; %cutoff frequency
[z,p,k]=butter(8,Fcp/(Fsp/2),'high');
sos=zp2sos(z,p,k);
%fvtool(sos,'Analysis','freq')
x101filtfilt=filtfilt(z,p,x101);
figure;
plot(t101,x101,t101,x101filtfilt);
grid on
title('PE101 (pressure signal)')
xlabel('t (s)')
ylabel('Pressure (kPa)')
legend({'Original PE101 Signal','Actual PE101 Signal (filtered and realigned signal)'});
The sampling frequency is 600 Hz and the signal x101 is about 180 s long. I receive the error: "Warning: Imaginary parts of complex X and/or Y arguments ignored". As a matter of fact the new signal x101filtfilt contains imaginary numbers. Where am I wrong? Thank you very much.
  1 Comment
Jan
Jan on 15 Feb 2017
And does x101, z or p contain complex values? Which command produces this error?

Sign in to comment.

Accepted Answer

Star Strider
Star Strider on 15 Feb 2017
You have two errors that I can see.
1. You need both outputs from zp2sos:
[sos,g] = zp2sos(z,p,k);
2. Then use those in your filtfilt call:
x101filtfilt = filtfilt(sos,g,x101);
That should solve your imaginary number problem (unless ‘x101’ is complex).
I also analysed your filter with freqz:
freqz(sos, 2^16, Fsp)
It appears stable and that it will do what you want it to do.
  2 Comments
Guglielmo Giambartolomei
Guglielmo Giambartolomei on 16 Feb 2017
Star Strider, you're a fallen angel; it works now! Your syntax is different from the one recommended in matlab guide. Thank you very much!

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!