MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn moreOpportunities for recent engineering grads.

Apply Today
Asked by Alex on 19 Nov 2011

Hey everyone, I've tried creating a bandpass filter and finding it's transfer function but have had no luck. As you can see below, I tried making the filter and the line for 'd' runs just fine, but when I try to create the IIR filter 'HdIIR' from object d, it doesn't work. It has worked for other objects like 'd' I have created so I do not understand why this one doesn't work (albeit that my other objects used different parameters, but this should still be valid).

Once I get the filter to work, I would like to find the numerator and the denominator of the transfer function (S-domain preferable) of the filter but cannot find a method that will do so given either 'd' or 'HdIIR'.

Please help if you can!

-------------------------------------------------------------

clear all

close all

f_p1=40000; %Pass Frequency in Hz

f_p2=50000; %Stop Frequency in Hz

r_s=25; %Stopband Attenuation in dB

r_p=3; %Passband Ripple

n=10;

d = fdesign.bandpass('N,F3dB1,F3dB2,Ast1,Ap,Ast2',n,f_p1,f_p2,r_s,r_p,r_s,150e3);

HdIIR = design(d,'butter');

-----------------------------------------------------------------

??? Error using ==> fdesign.abstracttype.superdesign at 60 butter is an invalid design method.

Error in ==> fdesign.abstracttype.design at 11 varargout{1} = superdesign(this, varargin{:});

Error in ==> Demo at 13 HdIIR = design(d,'butter');

*No products are associated with this question.*

Answer by Kaustubha Govind on 21 Nov 2011

It appears that 'butter' is not a valid design method for the band-pass filter object.

Using designmethods on your filter design object, I got:

>> designmethods(d)

Design Methods for class fdesign.bandpass (N,F3dB1,F3dB2,Ast1,Ap,Ast2):

ellip

So 'ellip' seems to be the only available design method for your band-pass filter.

Show 3 older comments

Alex on 22 Nov 2011

Hey Wayne!

So here is what I have:

d = fdesign.bandpass('N,F3dB1,F3dB2,Ast1,Ap,Ast2',n,f_p1,f_p2,r_s,r_p,r_s,150e3);

HdIIR = design(d,'ellip');

fvtool(HdIIR);

[B,A]=sos2tf(HdIIR.sosMatrix,HdIIR.ScaleValues)

---------------------------------------------------------------------

B =

Columns 1 through 6

0.0304 0.0726 0.1441 0.1566 0.1144 -0.0000

Columns 7 through 11

-0.1144 -0.1566 -0.1441 -0.0726 -0.0304

A =

Columns 1 through 6

1.0000 2.9945 8.0928 13.1008 18.9969 19.5845

Columns 7 through 11

18.1275 11.9235 7.0249 2.4738 0.7874

My question is, how do I put that in the form of a normal transfer function? Also, what domain does this assume? I checked the PZ plot from the fvtool and it shows 5 poles so the 6 column output threw me off unless the 6th column is a scalar.

Also, why do you use Hd ? What does that mean? I've noticed it in a lot of your responses!

Wayne King on 22 Nov 2011

B are the numerator coefficients and A are the denominator coefficients. They are just the coefficients for the difference equation.

H is just a MATLAB convention for a handle to an object Hd is a filter object. You don't have to use H. You could use hd, or no h at all, I just use h when I want to remind myself that the output is a handle object.

## 1 Comment

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/21679#comment_47388

Does anyone have any insight as to why this filter will not compile?