Right filter syntax for the [z,p,k] syntax

L
Lucian · Mar 3, 2021 · 2K views
Question
Hi, I used the butterworth filter with the [b,a] syntax:     filtord=4; SampleRate=20000; d = fdesign.bandpass('N,F3dB1,F3dB2',4,100, 300,SampleRate); hd = design(d,'butter'); % zero phase shift by reverse filtering SignalFiltered=filtfilt(b,a, Signal); Now I want to use higher order filter numbers where the help suggests to switch to the [z,p,k] syntax.     Wn=[100,300]/(SampleRate/2); % cutoff frequencies normalized by nyquist ftype='bandpass'; filtord=10; [z, p, k] = butter(filtord,Wn,ftype); [sos,g]=zp2sos(z,p,k); hd=dfilt.df2sos(sos,g); Simple question: would will be the appropriate filter command (SignalFiltered=filtfilt(??))? Or is there a missing piece of code? Thanks for your advice!   P.S.: Is the missing code the following: [b,a]= sos2tf(hd.sosMatrix,hd.ScaleValues); SignalFiltered=filtfilt(b,a, Signal); ???????
Expert Answer
Profile picture of Prashant Kumar
Prashant Kumar PhD Expert
Answered Aug 25, 2026
n general you don't want to switch back to b and a because you then have the numerical issue again.
 
If you have at least  MATLAB R2011a, you can do
SignalFiltered = filtfilt(hd.sosMatrix,hd.ScaleValues,Signal);
Otherwise, you can do
 
 
hd.PersistentMemory = true;
y = filter(hd,Signal);
SignalFiltered = filter(hd,fliplr(y));
twice, one forward and one backward to mimic the behavior of filtfilt. You may need to set PersistentMemory to true to retain the state

 

 
Have a different question? Ask here

Get a Free Consultation or a Sample Assignment Review!