I have to design an 8th-order IIR filter with the following transfer function magnitude response as a specification:
I use "ellip" function from matlab to calculate the unquantised coefficient set:
Then i implement the filter using a cascade of second-order sections using "tf2sos" matlab function:
And then i quantize these coefficients:
After all these steps i take the two matrices below:
I choose the filter representation for every second-order instance to be like below (Direct Form 2):
- circle with "X" is a multiplication
- circle with "Σ" is an addition
- and the triangle is a delay element
After that i have done all of these i write some matlab code to model the structure above:
%Implementation of a second-order filter structure function[y,state,pointer]=Second_Order(x,a,b,state,pointer) %The filter routine when fed with an input sample produce one output %sample each time it is called %x=input value %a=array containing feedback coefficients[1,a1,a2] %b=array containing feed forward coefficients[b0,b1,b2] %state=array(of length 2) containing old input values %y=output value %compute output value y=b(1)*x+state(pointer+1); pointer=rem(pointer+1,2); %update pointer in modulo form %Update states state(pointer+1)=b(2)*x-a(2)*y+state(pointer+1); pointer=rem(pointer+1,2); %Overwrite oldest sum with b(N-1).x state(pointer+1)=b(3)*x-a(3)*y; pointer=rem(pointer+1,2);%Increment pointer modulo-(N-1)
At the end, and the point that i don't know how to do it properly is how i can display the impulse and step response of the whole filter and not for every second order section.
For example if i write something like that, i think i take the impulse response of the first second order section. How i can take the impulse resonse of the whole system?
%Initialization [b,a]=ellip(4,1.3,60,2*[0.2,0.3]); [sos,q]=tf2sos(b,a); sosq=Quantize('round',sos,2^6); bf=sosq(1,1:3); af=sosq(1,4:6); %impulse invariant design impsv=zeros([1,2]);%impulse response state variable stpsv=zeros([1,2]);%step response state variable len=20; % run length impy=zeros([1,len]);%impulse response result stpy=zeros([1,len]);% step response result impp=0; stpp=0; % Simulation of filter operation x=1; for k=1:len [impy(k),impsv,impp]=Second_Order(x,af,bf,impsv,impp); [stpy(k),stpsv,stpp]=Second_Order(1,af,bf,stpsv,stpp); x=0; end