Tuesday, August 8, 2017

z transform - How to implement a filter in matlab


I want to implement the 'filter' function in matlab but I just can't seem to replicate the results I get when using the matlab function.


My understanding of the matlab function is that it takes 3 arguments: 'b' = array of numerator coefficients , 'a' = array of denominator coefficients and 'array' = the array to be filtered.So if you wanted to filter an array with a filter H(z) where:


$$ H(z) = \frac{b_1 + b_2z^{-1}}{a_1 + a_2z^{-1}} $$


and store it in an array called "result" then you would write


result = filter( [b1 b2] , [a1 a2] , array );

Now I tried to implement the 'filter' function ( with the number of coefficients in the numerator and denominator limited to 2) by getting the difference equation from H(z) then using it to get the resultant array but this route does not seem to work, ie


$$ H(z) = \frac{Y(z)}{X(z)} = \frac{b_1 + b_2z^{-1}}{a_1 + a_2z^{-1}} $$



$$ X(z) (b_1 + b_2z^{-1}) = Y(z)(a_1 + a_2z^{-1}) $$


$$ b_1x[n] + b_2x[n-1] = a_1y[n] + a_2y[n-1] $$


$$ \implies y[n] = \frac{b_1}{a_1}x[n] + \frac{b_2}{a_1}x[n-1] - \frac{a_2}{a_1}y[n-1] $$


Meaning the matlab code should look something like


function [ result ] = myFilter( b , a , audio )
%MyFilter
%a,b = Two Element Arrays
%array = the array we want to filter

N = size(audio,2);


for i = 1:N
if( i == 1 )
result(i) = ( b(2)/a(1)) * audio(i);

else
result(i) = ( b(1) / a(1) ) * audio(i) + ...
( b(2) / a(1) ) * audio(i-1) - ...
( a(2) / a(1) ) * result(i-1);
end

end

end

The function above does not produce the same results as the matlab filter function.Does anyone know what I am doing wrong? Have I understood how the filter function in matlab works?



Answer



You have a typo in:


result(i) = ( b(2)/a(1)) * audio(i);

That should be:



result(i) = ( b(1)/a(1)) * audio(i);

No comments:

Post a Comment

periodic trends - Comparing radii in lithium, beryllium, magnesium, aluminium and sodium ions

Apparently the of last four, $\ce{Mg^2+}$ is closest in radius to $\ce{Li+}$. Is this true, and if so, why would a whole larger shell ($\ce{...