# Test, Visualize, and Enforce Passivity of Rational Output

This example shows how to test, visualize, and enforce the passivity of output from the `rational` function.

### S-Parameter Data Passivity

Time-domain analysis and simulation depends critically on being able to convert frequency-domain S-parameter data into causal, stable, and passive time-domain representations. Because the `rational` function guarantees that all poles are in the left half plane,` rational `output is both stable and causal by construction. The problem is passivity.

N-port S-parameter data represents a frequency-dependent transfer function H(f). You can create an S-parameters object in RF Toolbox™ by reading a Touchstone® file, such as `passive.s2p`, into the `sparameters` function.

You can use the` ispassive` function to check the passivity of the S-parameter data, and the `passivity` function to plot the 2-norm of the N x N matrices H(f) at each data frequency.

```S = sparameters('passive.s2p'); ispassive(S)```
```ans = logical 1 ```
`passivity(S)`

### Testing and Visualizing `rational` Output Passivity

The `rational` function converts N-port sparameter data, `S` into an object that represents a rational fit to the data. Using the `ispassive` function on the output reports that even if input data `S` is passive, the output fit is not passive. In other words, the norm H(f) is greater than one at some frequency in the range [0,Inf].

The `passivity` function takes a rational function as input and plots its passivity. This is a plot of the upper bound of the norm(H(f)) on [0,Inf], also known as the H-infinity norm.

```fit = rational(S); ispassive(fit)```
```ans = logical 0 ```
`passivity(fit)`

The `makepassive` function takes as input a rational object, and produces a passive fit by using convex optimization techniques to optimally match the data of the S-parameter input `S` while satisfying passivity constraints. The residues and direct term of the output `pfit` are modified, but the poles of the output pfit are identical to the poles of the input fit.

`pfit = makepassive(fit,'Display','on');`
```ITER H-INFTY NORM FREQUENCY ERRDB CONSTRAINTS 0 1 + 7.145e-03 515.536 MHz -40.4597 1 1 + 5.441e-04 319.279 MHz -41.7548 5 2 1 + 7.829e-05 382.974 MHz -41.7319 7 3 1 + 7.929e-06 360.028 MHz -41.728 9 4 1 - 9.002e-07 359.355 MHz -41.7273 10 ```
`ispassive(pfit)`
```ans = logical 1 ```
`passivity(pfit)`

`all(pfit.Poles == fit.Poles)`
```ans = logical 1 ```

### Generate Equivalent SPICE Circuit from Passive Fit

The `generateSPICE` function takes a passive fit and generates an equivalent circuit as a SPICE subckt file. The input fit is an object as returned by rational with an S-parameters object as input. The generated file is a SPICE model constructed solely of passive R, L, C elements and controlled source elements E, F, G, and H.

```generateSPICE(pfit,'mypassive.ckt') type mypassive.ckt```
```* Equivalent circuit model for mypassive.ckt .SUBCKT mypassive po1 po2 Vsp1 po1 p1 0 Vsr1 p1 pr1 0 Rp1 pr1 0 50 Ru1 u1 0 50 Fr1 u1 0 Vsr1 -1 Fu1 u1 0 Vsp1 -1 Ry1 y1 0 1 Gy1 p1 0 y1 0 -0.02 Vsp2 po2 p2 0 Vsr2 p2 pr2 0 Rp2 pr2 0 50 Ru2 u2 0 50 Fr2 u2 0 Vsr2 -1 Fu2 u2 0 Vsp2 -1 Ry2 y2 0 1 Gy2 p2 0 y2 0 -0.02 Rx1 x1 0 1 Fxc1_2 x1 0 Vx2 1.73983662941813 Cx1 x1 xm1 4.40797252381963e-09 Vx1 xm1 0 0 Gx1_1 x1 0 u1 0 -0.0637780116111523 Rx2 x2 0 1 Fxc2_1 x2 0 Vx1 -1.10434906482951 Cx2 x2 xm2 4.40797252381963e-09 Vx2 xm2 0 0 Gx2_1 x2 0 u1 0 0.0704331874794615 Rx3 x3 0 1 Cx3 x3 0 2.46549218243635e-12 Gx3_1 x3 0 u1 0 -0.857110973445692 Rx4 x4 0 1 Cx4 x4 0 1.19630314783494e-11 Gx4_1 x4 0 u1 0 -2.76936140494346 Rx5 x5 0 1 Cx5 x5 0 1.85575923283012e-11 Gx5_1 x5 0 u1 0 -1.31122037346803 Rx6 x6 0 1 Cx6 x6 0 8.71015575423206e-11 Gx6_1 x6 0 u1 0 -0.691518683335449 Rx7 x7 0 1 Cx7 x7 0 5.76402180507914e-10 Gx7_1 x7 0 u1 0 -0.0721137010476538 Rx8 x8 0 1 Cx8 x8 0 1.32870599427364e-08 Gx8_1 x8 0 u1 0 -0.853443666992151 Rx9 x9 0 1 Fxc9_10 x9 0 Vx10 1.74899789209539 Cx9 x9 xm9 4.40797252381963e-09 Vx9 xm9 0 0 Gx9_2 x9 0 u2 0 -0.0646435567444553 Rx10 x10 0 1 Fxc10_9 x10 0 Vx9 -1.09856447702868 Cx10 x10 xm10 4.40797252381963e-09 Vx10 xm10 0 0 Gx10_2 x10 0 u2 0 0.0710151151082463 Rx11 x11 0 1 Cx11 x11 0 2.46549218243635e-12 Gx11_2 x11 0 u2 0 -0.903013298701984 Rx12 x12 0 1 Cx12 x12 0 1.19630314783494e-11 Gx12_2 x12 0 u2 0 -2.78912399833068 Rx13 x13 0 1 Cx13 x13 0 1.85575923283012e-11 Gx13_2 x13 0 u2 0 -1.32139928022124 Rx14 x14 0 1 Cx14 x14 0 8.71015575423206e-11 Gx14_2 x14 0 u2 0 -0.731804932668761 Rx15 x15 0 1 Cx15 x15 0 5.76402180507914e-10 Gx15_2 x15 0 u2 0 -0.0762155756410513 Rx16 x16 0 1 Cx16 x16 0 1.32870599427364e-08 Gx16_2 x16 0 u2 0 -0.853738421522371 Gyc1_1 y1 0 x1 0 -1 Gyc1_2 y1 0 x2 0 -1 Gyc1_3 y1 0 x3 0 -1 Gyc1_4 y1 0 x4 0 0.133812501038142 Gyc1_5 y1 0 x5 0 -0.577025534598742 Gyc1_6 y1 0 x6 0 -1 Gyc1_7 y1 0 x7 0 1 Gyc1_8 y1 0 x8 0 0.998930222960295 Gyc1_9 y1 0 x9 0 0.9812580927411 Gyc1_10 y1 0 x10 0 0.985349183222844 Gyc1_11 y1 0 x11 0 0.820751465966825 Gyc1_12 y1 0 x12 0 -1 Gyc1_13 y1 0 x13 0 1 Gyc1_14 y1 0 x14 0 0.920287412225175 Gyc1_15 y1 0 x15 0 -0.91669216502865 Gyc1_16 y1 0 x16 0 -1 Gyd1_1 y1 0 u1 0 0.999298520305084 Gyd1_2 y1 0 u2 0 -0.0123008134989598 Gyc2_1 y2 0 x1 0 0.992716554851763 Gyc2_2 y2 0 x2 0 0.990345122187567 Gyc2_3 y2 0 x3 0 0.823596484403637 Gyc2_4 y2 0 x4 0 -1 Gyc2_5 y2 0 x5 0 1 Gyc2_6 y2 0 x6 0 0.974339278618892 Gyc2_7 y2 0 x7 0 -0.968808354500153 Gyc2_8 y2 0 x8 0 -1 Gyc2_9 y2 0 x9 0 -1 Gyc2_10 y2 0 x10 0 -1 Gyc2_11 y2 0 x11 0 -1 Gyc2_12 y2 0 x12 0 0.207629903960971 Gyc2_13 y2 0 x13 0 -0.668109166178573 Gyc2_14 y2 0 x14 0 -1 Gyc2_15 y2 0 x15 0 1 Gyc2_16 y2 0 x16 0 0.998693355982142 Gyd2_1 y2 0 u1 0 0.0129572556240674 Gyd2_2 y2 0 u2 0 0.999452705396658 .ENDS ```