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

Illustration
Lucian - 2021-03-03T10:30:07+00:00
Question: Right filter syntax for the [z,p,k] syntax

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 answered . 2025-11-20

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

 

 


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!