Fit frequency response magnitude data with minimum-phase state-space model using log-Chebyshev magnitude design


B = fitmagfrd(A,N)
B = fitmagfrd(A,N,RD)
B = fitmagfrd(A,N,RD,WT)
B = fitmagfrd(A,N,RD,WT,C)


B = fitmagfrd(A,N) is a stable, minimum-phase ss object, with state-dimension N, whose frequency response magnitude closely matches the magnitude data in A. A is a 1-by-1 frd object, and N is a nonnegative integer.

B = fitmagfrd(A,N,RD) forces the relative degree of B to be RD. RD must be a nonnegative integer whose default value is 0. You can specify the default value for RD by setting RD to an empty matrix.

B = fitmagfrd(A,N,RD,WT) uses the magnitude of WT to weight the optimization fit criteria. WT can be a double, ss or frd. If WT is a scalar, then it is used to weight all entries of the error criteria (A-B). If WT is a vector, it must be the same size as A, and each individual entry of WT acts as a weighting function on the corresponding entry of (A-B). The default value for WT is 1, and you can specify it by setting WT to an empty matrix.

B = fitmagfrd(A,N,RD,WT,C) enforces additional magnitude constraints on B, specified by the values of C.LowerBound and C.UpperBound. These can be empty, double or frd (with C.Frequency equal to A.Frequency). If C.LowerBound is non-empty, then the magnitude of B is constrained to lie above C.LowerBound. No lower bound is enforced at frequencies where C.LowerBound is equal to -inf. Similarly, the UpperBound field can be used to specify an upper bound on the magnitude of B. If C is a double or frd (with C.Frequency equal to A.Frequency), then the upper and lower bound constraints on B are taken directly from A as:

  • if C(w) == –1, then enforce abs(B(w)) <= abs(A(w))

  • if C(w) == 1, then enforce abs(B(w)) >= abs(A(w))

  • if C(w) == 0, then no additional constraint

where w denotes the frequency.


collapse all

Fit Frequency Response Data With Stable Minimum-Phase State-Space Model

Create frequency response magnitude data from a fifth-order system.

sys = tf([1 2 2],[1 2.5 1.5])*tf(1,[1 0.1]);
sys = sys*tf([1 3.75 3.5],[1 2.5 13]);
omega = logspace(-1,1);
sysg = abs(frd(sys,omega));

Fit the magnitude data with a minimum-phase, stable third-order system.

ord = 3;
b1 = fitmagfrd(sysg,ord);
b1g = frd(b1,omega);
legend('Data','3rd order fit');

Fit the magnitude data with a third-order system constrained to lie below and above the given data.

C2.UpperBound = sysg;
C2.LowerBound = [];
b2 = fitmagfrd(sysg,ord,[],[],C2);
b2g = frd(b2,omega);
C3.UpperBound = [];
C3.LowerBound = sysg;
b3 = fitmagfrd(sysg,ord,[],[],C3);
b3g = frd(b3,omega);
legend('Data','3rd order fit','3rd order fit, below data',...
       '3rd order fit, above data')

Fit the magnitude data with a second-order system constrained to lie below and above the given data.

ord = 2;
C2.UpperBound = sysg;
C2.LowerBound = [];
b2 = fitmagfrd(sysg,ord,[],sysg,C2);
b2g = frd(b2,omega);
C3.UpperBound = [];
C3.LowerBound = sysg;
b3 = fitmagfrd(sysg,ord,[],sysg,C3);
b3g = frd(b3,omega);
bgp = fitfrd(genphase(sysg),ord);
bgpg = frd(bgp,omega);
legend('Data','3rd order fit','2d order fit, below data',...
       '2nd order fit, above data','bgpg')


This input frd object must be either a scalar 1-by-1 object or, a row, or column vector.

More About

collapse all


fitmagfrd uses a version of log-Chebyshev magnitude design, solving

   min f     subject to (at every frequency point in A):  
           |d|^2 /(1+ f/WT) < |n|^2/A^2 < |d|^2*(1 + f/WT) 

plus additional constraints imposed with C. n, d denote the numerator and denominator, respectively, and B = n/d. n and d have orders (N-RD) and N, respectively. The problem is solved using linear programming for fixed f and bisection to minimize f. An alternate approximate method, which cannot enforce the constraints defined by C, is B = fitfrd(genphase(A),N,RD,WT).


Oppenheim, A.V., and R.W. Schaffer, Digital Signal Processing, Prentice Hall, New Jersey, 1975, p. 513.

Boyd, S. and Vandenberghe, L., Convex Optimization, Cambridge University Press, 2004.

See Also

Was this topic helpful?