## SB10YD

### Fitting frequency response data with a stable, minimum phase SISO system

[Specification] [Arguments] [Method] [References] [Comments] [Example]

Purpose

      To fit a supplied frequency response data with a stable, minimum
      phase SISO (single-input single-output) system represented by its
      matrices A, B, C, D. It handles both discrete- and continuous-time
      cases.

Specification

          SUBROUTINE SB10YD( DISCFL, FLAG, LENDAT, RFRDAT, IFRDAT, OMEGA, N,
         $                   A, LDA, B, C, D, TOL, IWORK, DWORK, LDWORK,
         $                   ZWORK, LZWORK, INFO )
    C     .. Scalar Arguments ..
          INTEGER            DISCFL, FLAG, INFO, LDA, LDWORK, LENDAT,
         $                   LZWORK, N
          DOUBLE PRECISION   TOL
    C     .. Array Arguments ..
          INTEGER            IWORK(*)
          DOUBLE PRECISION   A(LDA, *), B(*), C(*), D(*), DWORK(*),
         $                   IFRDAT(*), OMEGA(*), RFRDAT(*)
          COMPLEX*16         ZWORK(*)

Arguments

Input/Output Parameters

      DISCFL  (input) INTEGER
              Indicates the type of the system, as follows:
              = 0: continuous-time system;
              = 1: discrete-time system.

      FLAG    (input) INTEGER
              If FLAG = 0, then the system zeros and poles are not
              constrained.
              If FLAG = 1, then the system zeros and poles will have
              negative real parts in the continuous-time case, or moduli
              less than 1 in the discrete-time case. Consequently, FLAG
              must be equal to 1 in mu-synthesis routines.

      LENDAT  (input) INTEGER
              The length of the vectors RFRDAT, IFRDAT and OMEGA.
              LENDAT >= 2.

      RFRDAT  (input) DOUBLE PRECISION array, dimension (LENDAT)
              The real part of the frequency data to be fitted.

      IFRDAT  (input) DOUBLE PRECISION array, dimension (LENDAT)
              The imaginary part of the frequency data to be fitted.

      OMEGA   (input) DOUBLE PRECISION array, dimension (LENDAT)
              The frequencies corresponding to RFRDAT and IFRDAT.
              These values must be nonnegative and monotonically
              increasing. Additionally, for discrete-time systems
              they must be between 0 and PI.

      N       (input/output) INTEGER
              On entry, the desired order of the system to be fitted.
              N <= LENDAT-1.
              On exit, the order of the obtained system. The value of N
              could only be modified if N > 0 and FLAG = 1.

      A       (output) DOUBLE PRECISION array, dimension (LDA,N)
              The leading N-by-N part of this array contains the
              matrix A. If FLAG = 1, then A is in an upper Hessenberg
              form, and corresponds to a minimal realization.

      LDA     INTEGER
              The leading dimension of the array A.  LDA >= MAX(1,N).

      B       (output) DOUBLE PRECISION array, dimension (N)
              The computed vector B.

      C       (output) DOUBLE PRECISION array, dimension (N)
              The computed vector C. If FLAG = 1, the first N-1 elements
              are zero (for the exit value of N).

      D       (output) DOUBLE PRECISION array, dimension (1)
              The computed scalar D.

Tolerances

      TOL     DOUBLE PRECISION
              The tolerance to be used for determining the effective
              rank of matrices. If the user sets TOL > 0, then the given
              value of TOL is used as a lower bound for the reciprocal
              condition number;  a (sub)matrix whose estimated condition
              number is less than 1/TOL is considered to be of full
              rank.  If the user sets TOL <= 0, then an implicitly
              computed, default tolerance, defined by TOLDEF = SIZE*EPS,
              is used instead, where SIZE is the product of the matrix
              dimensions, and EPS is the machine precision (see LAPACK
              Library routine DLAMCH).

Workspace

      IWORK   INTEGER array, dimension (max(2,2*N+1))

      DWORK   DOUBLE PRECISION array, dimension (LDWORK)
              On exit, if INFO = 0, DWORK(1) returns the optimal value
              of LDWORK and DWORK(2) contains the optimal value of
              LZWORK.

      LDWORK  INTEGER
              The length of the array DWORK.
              LDWORK = max( 2, LW1, LW2, LW3, LW4 ), where
              LW1 = 2*LENDAT + 4*HNPTS;  HNPTS = 2048;
              LW2 =   LENDAT + 6*HNPTS;
              MN  = min( 2*LENDAT, 2*N+1 )
              LW3 = 2*LENDAT*(2*N+1) + max( 2*LENDAT, 2*N+1 ) +
                    max( MN + 6*N + 4, 2*MN + 1 ), if N > 0;
              LW3 = 4*LENDAT + 5                 , if N = 0;
              LW4 = max( N*N + 5*N, 6*N + 1 + min( 1,N ) ), if FLAG = 1;
              LW4 = 0,                                      if FLAG = 0.
              For optimum performance LDWORK should be larger.

      ZWORK   COMPLEX*16 array, dimension (LZWORK)

      LZWORK  INTEGER
              The length of the array ZWORK.
              LZWORK = LENDAT*(2*N+3), if N > 0;
              LZWORK = LENDAT,         if N = 0.

Error Indicator

      INFO    INTEGER
              = 0:  successful exit;
              < 0:  if INFO = -i, the i-th argument had an illegal
                    value;
              = 1:  if the discrete --> continuous transformation cannot
                    be made;
              = 2:  if the system poles cannot be found;
              = 3:  if the inverse system cannot be found, i.e., D is
                    (close to) zero;
              = 4:  if the system zeros cannot be found;
              = 5:  if the state-space representation of the new
                    transfer function T(s) cannot be found;
              = 6:  if the continuous --> discrete transformation cannot
                    be made.

Method

      First, if the given frequency data are corresponding to a
      continuous-time system, they are changed to a discrete-time
      system using a bilinear transformation with a scaled alpha.
      Then, the magnitude is obtained from the supplied data.
      Then, the frequency data are linearly interpolated around
      the unit-disc.
      Then, Oppenheim and Schafer complex cepstrum method is applied
      to get frequency data corresponding to a stable, minimum-
      phase system. This is done in the following steps:
      - Obtain LOG (magnitude)
      - Obtain IFFT of the result (DG01MD SLICOT subroutine);
      - halve the data at 0;
      - Obtain FFT of the halved data (DG01MD SLICOT subroutine);
      - Obtain EXP of the result.
      Then, the new frequency data are interpolated back to the
      original frequency.
      Then, based on these newly obtained data, the system matrices
      A, B, C, D are constructed; the very identification is
      performed by Least Squares Method using DGELSY LAPACK subroutine.
      If needed, a discrete-to-continuous time transformation is
      applied on the system matrices by AB04MD SLICOT subroutine.
      Finally, if requested, the poles and zeros of the system are
      checked. If some of them have positive real parts in the
      continuous-time case (or are not inside the unit disk in the
      complex plane in the discrete-time case), they are exchanged with
      their negatives (or reciprocals, respectively), to preserve the
      frequency response, while getting a minimum phase and stable
      system. This is done by SB10ZP SLICOT subroutine.

References

      [1] Oppenheim, A.V. and Schafer, R.W.
          Discrete-Time Signal Processing.
          Prentice-Hall Signal Processing Series, 1989.

      [2] Balas, G., Doyle, J., Glover, K., Packard, A., and Smith, R.
          Mu-analysis and Synthesis toolbox - User's Guide,
          The Mathworks Inc., Natick, MA, USA, 1998.

Further Comments

      None

Example

Program Text

      None

Program Data

      None

Program Results

      None

Return to Supporting Routines index