High-pass Butterworth filter and filtfilt
조회 수: 16 (최근 30일)
이전 댓글 표시
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
채택된 답변
Star Strider
2017년 2월 15일
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
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Digital Filtering에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!