KiCad PCB EDA Suite
C_MICROSTRIP Class Reference

#include <c_microstrip.h>

Inheritance diagram for C_MICROSTRIP:
TRANSLINE

Public Member Functions

 C_MICROSTRIP ()
 
 ~C_MICROSTRIP ()
 
void setProperty (enum PRMS_ID aPrmId, double aValue)
 
double getProperty (enum PRMS_ID aPrmId)
 
void getProperties (void)
 @function getProperties More...
 
void checkProperties (void)
 @function checkProperties More...
 
void setResult (int, double, const char *)
 
void setResult (int, const char *)
 
bool isSelected (enum PRMS_ID aPrmId)
 
void Init ()
 
virtual void synthesize ()
 
virtual void calc ()
 
void analyze ()
 

Public Attributes

const char * m_Name
 
KIGFX::COLOR4D errCol = KIGFX::COLOR4D( 1, 0.63, 0.63, 1 )
 
KIGFX::COLOR4D warnCol = KIGFX::COLOR4D( 1, 1, 0.57, 1 )
 
KIGFX::COLOR4D okCol = KIGFX::COLOR4D( 1, 1, 1, 1 )
 

Protected Member Functions

bool minimizeZ0Error1D (double *)
 @function minimizeZ0Error1D More...
 
double skin_depth ()
 @function skin_depth calculate skin depth More...
 
void ellipke (double, double &, double &)
 
double ellipk (double)
 
void setErrorLevel (PRMS_ID, char)
 @function setErrorLevel More...
 

Protected Attributes

double m_parameters [EXTRA_PRMS_COUNT]
 
double len
 
double er_eff
 
double ang_l
 

Private Member Functions

double delta_u_thickness_single (double, double)
 
void delta_u_thickness ()
 
void compute_single_line ()
 
double filling_factor_even (double, double, double)
 
double filling_factor_odd (double, double, double)
 filling_factor_odd() - compute the filling factor for the coupled microstrips odd-mode without cover and zero conductor thickness More...
 
double delta_q_cover_even (double)
 
double delta_q_cover_odd (double)
 
void er_eff_static ()
 er_eff_static() - compute the static effective dielectric constants More...
 
double delta_Z0_even_cover (double, double, double)
 delta_Z0_even_cover() - compute the even-mode impedance correction for a homogeneous microstrip due to the cover More...
 
double delta_Z0_odd_cover (double, double, double)
 delta_Z0_odd_cover() - compute the odd-mode impedance correction for a homogeneous microstrip due to the cover More...
 
void Z0_even_odd ()
 Z0_even_odd() - compute the static even- and odd-mode static impedances. More...
 
void er_eff_freq ()
 
void conductor_losses ()
 
void dielectric_losses ()
 
void attenuation ()
 
void line_angle ()
 
void syn_err_fun (double *, double *, double, double, double, double, double)
 
void synth_width ()
 
void Z0_dispersion ()
 
void calcAnalyze () override
 Computation for analysis. More...
 
void calcSynthesize () override
 Computation for synthesis. More...
 
void showAnalyze () override
 Shows synthesis results and checks for errors / warnings. More...
 
void showSynthesize () override
 Shows analysis results and checks for errors / warnings. More...
 
void show_results () override
 Shows results. More...
 
void syn_fun (double *, double *, double, double, double, double)
 

Private Attributes

double h
 
double ht
 
double t
 
double rough
 
double w
 
double w_t_e
 
double w_t_o
 
double l
 
double s
 
double Z0_e_0
 
double Z0_o_0
 
double Z0e
 
double Z0o
 
double c_e
 
double c_o
 
double ang_l_e
 
double ang_l_o
 
double er_eff_e
 
double er_eff_o
 
double er_eff_e_0
 
double er_eff_o_0
 
double w_eff
 
double atten_dielectric_e
 
double atten_cond_e
 
double atten_dielectric_o
 
double atten_cond_o
 
MICROSTRIPaux_ms
 

Detailed Description

Definition at line 31 of file c_microstrip.h.

Constructor & Destructor Documentation

◆ C_MICROSTRIP()

C_MICROSTRIP::C_MICROSTRIP ( )

Definition at line 39 of file c_microstrip.cpp.

39  : TRANSLINE(),
40  h( 0.0 ), // height of substrate
41  ht( 0.0 ), // height to the top of box
42  t( 0.0 ), // thickness of top metal
43  rough( 0.0 ), // Roughness of top metal
44  w( 0.0 ), // width of lines
45  w_t_e( 0.0 ), // even-mode thickness-corrected line width
46  w_t_o( 0.0 ), // odd-mode thickness-corrected line width
47  l( 0.0 ), // length of lines
48  s( 0.0 ), // spacing of lines
49  Z0_e_0( 0.0 ), // static even-mode impedance
50  Z0_o_0( 0.0 ), // static odd-mode impedance
51  Z0e( 0.0 ), // even-mode impedance
52  Z0o( 0.0 ), // odd-mode impedance
53  c_e( 0.0 ), // even-mode capacitance
54  c_o( 0.0 ), // odd-mode capacitance
55  ang_l_e( 0.0 ), // even-mode electrical length in angle
56  ang_l_o( 0.0 ), // odd-mode electrical length in angle
57  er_eff_e( 0.0 ), // even-mode effective dielectric constant
58  er_eff_o( 0.0 ), // odd-mode effective dielectric constant
59  er_eff_e_0( 0.0 ), // static even-mode effective dielectric constant
60  er_eff_o_0( 0.0 ), // static odd-mode effective dielectric constant
61  w_eff( 0.0 ), // Effective width of line
62  atten_dielectric_e( 0.0 ), // even-mode dielectric losses (dB)
63  atten_cond_e( 0.0 ), // even-mode conductors losses (dB)
64  atten_dielectric_o( 0.0 ), // odd-mode dielectric losses (dB)
65  atten_cond_o( 0.0 ), // odd-mode conductors losses (dB)
66  aux_ms( nullptr )
67 {
68  m_Name = "Coupled_MicroStrip";
69  Init();
70 }
double er_eff_o
Definition: c_microstrip.h:56
double er_eff_o_0
Definition: c_microstrip.h:58
double w_t_e
Definition: c_microstrip.h:43
void Init()
Definition: transline.cpp:87
double er_eff_e
Definition: c_microstrip.h:55
double atten_dielectric_e
Definition: c_microstrip.h:60
double ang_l_o
Definition: c_microstrip.h:54
double ang_l_e
Definition: c_microstrip.h:53
double w_eff
Definition: c_microstrip.h:59
double atten_cond_o
Definition: c_microstrip.h:63
MICROSTRIP * aux_ms
Definition: c_microstrip.h:94
const char * m_Name
Definition: transline.h:85
double Z0_e_0
Definition: c_microstrip.h:47
double atten_dielectric_o
Definition: c_microstrip.h:62
double er_eff_e_0
Definition: c_microstrip.h:57
double atten_cond_e
Definition: c_microstrip.h:61
double rough
Definition: c_microstrip.h:41
double w_t_o
Definition: c_microstrip.h:44
double Z0_o_0
Definition: c_microstrip.h:48

References TRANSLINE::Init(), and TRANSLINE::m_Name.

◆ ~C_MICROSTRIP()

C_MICROSTRIP::~C_MICROSTRIP ( )

Definition at line 73 of file c_microstrip.cpp.

74 {
75  delete aux_ms;
76 }
MICROSTRIP * aux_ms
Definition: c_microstrip.h:94

References aux_ms.

Member Function Documentation

◆ analyze()

void TRANSLINE::analyze ( )
inherited

Definition at line 203 of file transline.cpp.

204 {
205  getProperties();
206  checkProperties();
207  calcAnalyze();
208  showAnalyze();
209  show_results();
210 }
virtual void calcAnalyze()
Computation for analysis.
Definition: transline.h:101
void checkProperties(void)
@function checkProperties
Definition: transline.cpp:161
virtual void show_results()
Shows results.
Definition: transline.h:113
virtual void showAnalyze()
Shows synthesis results and checks for errors / warnings.
Definition: transline.h:107
void getProperties(void)
@function getProperties
Definition: transline.cpp:144

References TRANSLINE::calcAnalyze(), TRANSLINE::checkProperties(), TRANSLINE::getProperties(), TRANSLINE::show_results(), and TRANSLINE::showAnalyze().

Referenced by PCB_CALCULATOR_FRAME::OnTranslineAnalyse().

◆ attenuation()

void C_MICROSTRIP::attenuation ( )
private

Definition at line 565 of file c_microstrip.cpp.

566 {
570 }
void dielectric_losses()
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
void conductor_losses()
double skin_depth()
@function skin_depth calculate skin depth
Definition: transline.cpp:229

References conductor_losses(), dielectric_losses(), TRANSLINE::m_parameters, TRANSLINE::skin_depth(), and SKIN_DEPTH_PRM.

Referenced by calcAnalyze().

◆ calc()

virtual void TRANSLINE::calc ( )
inlinevirtualinherited

Definition at line 98 of file transline.h.

98 {};

◆ calcAnalyze()

void C_MICROSTRIP::calcAnalyze ( )
overrideprivatevirtual

Computation for analysis.

Reimplemented from TRANSLINE.

Definition at line 802 of file c_microstrip.cpp.

803 {
804  /* compute thickness corrections */
806  /* get effective dielectric constants */
807  er_eff_static();
808  /* impedances for even- and odd-mode */
809  Z0_even_odd();
810  /* calculate freq dependence of er_eff_e, er_eff_o */
811  er_eff_freq();
812  /* calculate frequency dependence of Z0e, Z0o */
813  Z0_dispersion();
814  /* calculate losses */
815  attenuation();
816  /* calculate electrical lengths */
817  line_angle();
818 }
void er_eff_freq()
void Z0_dispersion()
void er_eff_static()
er_eff_static() - compute the static effective dielectric constants
void Z0_even_odd()
Z0_even_odd() - compute the static even- and odd-mode static impedances.
void delta_u_thickness()
void attenuation()

References attenuation(), delta_u_thickness(), er_eff_freq(), er_eff_static(), line_angle(), Z0_dispersion(), and Z0_even_odd().

Referenced by calcSynthesize(), and syn_fun().

◆ calcSynthesize()

void C_MICROSTRIP::calcSynthesize ( )
overrideprivatevirtual

Computation for synthesis.

Reimplemented from TRANSLINE.

Definition at line 906 of file c_microstrip.cpp.

907 {
908  double Z0_e, Z0_o, ang_l_dest;
909  double f1, f2, ft1, ft2, j11, j12, j21, j22, d_s_h, d_w_h, err;
910  double eps = 1e-04;
911  double w_h, s_h, le, lo;
912 
913 
914  /* required value of Z0_e and Z0_o */
915  Z0_e = m_parameters[Z0_E_PRM];
916  Z0_o = m_parameters[Z0_O_PRM];
917 
918 
921  ang_l_dest = m_parameters[ANG_L_PRM];
922 
923 
924  /* calculate width and use for initial value in Newton's method */
925  synth_width();
928  f1 = f2 = 0;
929 
930  /* rather crude Newton-Rhapson */
931  do
932  {
933  /* compute Jacobian */
934  syn_fun( &ft1, &ft2, s_h + eps, w_h, Z0_e, Z0_o );
935  j11 = ( ft1 - f1 ) / eps;
936  j21 = ( ft2 - f2 ) / eps;
937  syn_fun( &ft1, &ft2, s_h, w_h + eps, Z0_e, Z0_o );
938  j12 = ( ft1 - f1 ) / eps;
939  j22 = ( ft2 - f2 ) / eps;
940 
941  /* compute next step; increments of s_h and w_h */
942  d_s_h = ( -f1 * j22 + f2 * j12 ) / ( j11 * j22 - j21 * j12 );
943  d_w_h = ( -f2 * j11 + f1 * j21 ) / ( j11 * j22 - j21 * j12 );
944 
945  s_h += d_s_h;
946  w_h += d_w_h;
947 
948  /* compute the error with the new values of s_h and w_h */
949  syn_fun( &f1, &f2, s_h, w_h, Z0_e, Z0_o );
950  err = sqrt( f1 * f1 + f2 * f2 );
951 
952  /* converged ? */
953  } while( err > 1e-04 );
954 
955  /* denormalize computed width and spacing */
958 
959 
960  /* calculate physical length */
961  le = C0 / m_parameters[FREQUENCY_PRM] / sqrt( er_eff_e ) * ang_l_dest / 2.0 / M_PI;
962  lo = C0 / m_parameters[FREQUENCY_PRM] / sqrt( er_eff_o ) * ang_l_dest / 2.0 / M_PI;
963  m_parameters[PHYS_LEN_PRM] = sqrt( le * lo );
964 
965  calcAnalyze();
966 
967  m_parameters[ANG_L_PRM] = ang_l_dest;
968  m_parameters[Z0_E_PRM] = Z0_e;
969  m_parameters[Z0_O_PRM] = Z0_o;
970 }
double er_eff_o
Definition: c_microstrip.h:56
void syn_fun(double *, double *, double, double, double, double)
double er_eff_e
Definition: c_microstrip.h:55
double ang_l_o
Definition: c_microstrip.h:54
double ang_l_e
Definition: c_microstrip.h:53
void synth_width()
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
#define C0
Definition: units.h:62
void calcAnalyze() override
Computation for analysis.

References ang_l_e, ang_l_o, ANG_L_PRM, C0, calcAnalyze(), er_eff_e, er_eff_o, FREQUENCY_PRM, H_PRM, TRANSLINE::m_parameters, PHYS_LEN_PRM, PHYS_S_PRM, PHYS_WIDTH_PRM, syn_fun(), synth_width(), Z0_E_PRM, and Z0_O_PRM.

◆ checkProperties()

void TRANSLINE::checkProperties ( void  )
inherited

@function checkProperties

Checks the input parameters (ie: negative length). Does not check for incompatibility between values as this depends on the line shape.

Definition at line 161 of file transline.cpp.

162 {
163  // Do not check for values that are results of anylzing / synthesizing
164  // Do not check for transline specific incompatibilities ( like " conductor height sould be lesser than dielectric height")
165  if( !std::isfinite( m_parameters[EPSILONR_PRM] ) || m_parameters[EPSILONR_PRM] <= 0 )
167 
168  if( !std::isfinite( m_parameters[TAND_PRM] ) || m_parameters[TAND_PRM] < 0 )
170 
171  if( !std::isfinite( m_parameters[RHO_PRM] ) || m_parameters[RHO_PRM] < 0 )
173 
174  if( !std::isfinite( m_parameters[H_PRM] ) || m_parameters[H_PRM] < 0 )
176 
177  if( !std::isfinite( m_parameters[TWISTEDPAIR_TWIST_PRM] )
180 
181  if( !std::isfinite( m_parameters[STRIPLINE_A_PRM] ) || m_parameters[STRIPLINE_A_PRM] <= 0 )
183 
184  if( !std::isfinite( m_parameters[H_T_PRM] ) || m_parameters[H_T_PRM] <= 0 )
186 
187  // How can we check ROUGH_PRM ?
188 
189  if( !std::isfinite( m_parameters[MUR_PRM] ) || m_parameters[MUR_PRM] < 0 )
191 
192  if( !std::isfinite( m_parameters[TWISTEDPAIR_EPSILONR_ENV_PRM] )
195 
196  if( !std::isfinite( m_parameters[MURC_PRM] ) || m_parameters[MURC_PRM] < 0 )
198 
199  if( !std::isfinite( m_parameters[FREQUENCY_PRM] ) || m_parameters[FREQUENCY_PRM] <= 0 )
201 }
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
#define TRANSLINE_WARNING
Definition: transline.h:31
void setErrorLevel(PRMS_ID, char)
@function setErrorLevel
Definition: transline.cpp:423

References EPSILONR_PRM, FREQUENCY_PRM, H_PRM, H_T_PRM, TRANSLINE::m_parameters, MUR_PRM, MURC_PRM, RHO_PRM, TRANSLINE::setErrorLevel(), STRIPLINE_A_PRM, TAND_PRM, TRANSLINE_WARNING, TWISTEDPAIR_EPSILONR_ENV_PRM, and TWISTEDPAIR_TWIST_PRM.

Referenced by TRANSLINE::analyze(), and TRANSLINE::synthesize().

◆ compute_single_line()

void C_MICROSTRIP::compute_single_line ( )
private

Definition at line 151 of file c_microstrip.cpp.

152 {
153  if( aux_ms == NULL )
154  aux_ms = new MICROSTRIP();
155 
156  /* prepare parameters for single microstrip computations */
160  aux_ms->m_parameters[T_PRM] = 0.0;
161 
162  //aux_ms->m_parameters[H_T_PRM] = m_parameters[H_T_PRM];
163  aux_ms->m_parameters[H_T_PRM] = 1e12; /* arbitrarily high */
167  aux_ms->dispersion();
168 }
void dispersion()
Definition: microstrip.cpp:290
#define NULL
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
MICROSTRIP * aux_ms
Definition: c_microstrip.h:94
void microstrip_Z0()
Definition: microstrip.cpp:178

References aux_ms, MICROSTRIP::dispersion(), EPSILONR_PRM, FREQUENCY_PRM, H_PRM, H_T_PRM, TRANSLINE::m_parameters, MICROSTRIP::microstrip_Z0(), MURC_PRM, NULL, PHYS_WIDTH_PRM, and T_PRM.

Referenced by er_eff_static().

◆ conductor_losses()

void C_MICROSTRIP::conductor_losses ( )
private

Definition at line 490 of file c_microstrip.cpp.

491 {
492  double e_r_eff_e_0, e_r_eff_o_0, Z0_h_e, Z0_h_o, delta;
493  double K, R_s, Q_c_e, Q_c_o, alpha_c_e, alpha_c_o;
494 
495  e_r_eff_e_0 = er_eff_e_0;
496  e_r_eff_o_0 = er_eff_o_0;
497  Z0_h_e = Z0_e_0 * sqrt( e_r_eff_e_0 ); /* homogeneous stripline impedance */
498  Z0_h_o = Z0_o_0 * sqrt( e_r_eff_o_0 ); /* homogeneous stripline impedance */
499  delta = m_parameters[SKIN_DEPTH_PRM];
500 
501  if( m_parameters[FREQUENCY_PRM] > 0.0 )
502  {
503  /* current distribution factor (same for the two modes) */
504  K = exp( -1.2 * pow( ( Z0_h_e + Z0_h_o ) / ( 2.0 * ZF0 ), 0.7 ) );
505  /* skin resistance */
506  R_s = 1.0 / ( m_parameters[SIGMA_PRM] * delta );
507  /* correction for surface roughness */
508  R_s *= 1.0
509  + ( ( 2.0 / M_PI )
510  * atan( 1.40 * pow( ( m_parameters[ROUGH_PRM] / delta ), 2.0 ) ) );
511 
512  /* even-mode strip inductive quality factor */
513  Q_c_e = ( M_PI * Z0_h_e * m_parameters[PHYS_WIDTH_PRM] * m_parameters[FREQUENCY_PRM] )
514  / ( R_s * C0 * K );
515  /* even-mode losses per unith length */
516  alpha_c_e = ( 20.0 * M_PI / log( 10.0 ) ) * m_parameters[FREQUENCY_PRM]
517  * sqrt( e_r_eff_e_0 ) / ( C0 * Q_c_e );
518 
519  /* odd-mode strip inductive quality factor */
520  Q_c_o = ( M_PI * Z0_h_o * m_parameters[PHYS_WIDTH_PRM] * m_parameters[FREQUENCY_PRM] )
521  / ( R_s * C0 * K );
522  /* odd-mode losses per unith length */
523  alpha_c_o = ( 20.0 * M_PI / log( 10.0 ) ) * m_parameters[FREQUENCY_PRM]
524  * sqrt( e_r_eff_o_0 ) / ( C0 * Q_c_o );
525  }
526  else
527  {
528  alpha_c_e = alpha_c_o = 0.0;
529  }
530 
531  atten_cond_e = alpha_c_e * m_parameters[PHYS_LEN_PRM];
532  atten_cond_o = alpha_c_o * m_parameters[PHYS_LEN_PRM];
533 }
double er_eff_o_0
Definition: c_microstrip.h:58
#define ZF0
Definition: units.h:63
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
double atten_cond_o
Definition: c_microstrip.h:63
double Z0_e_0
Definition: c_microstrip.h:47
#define C0
Definition: units.h:62
double er_eff_e_0
Definition: c_microstrip.h:57
double atten_cond_e
Definition: c_microstrip.h:61
double Z0_o_0
Definition: c_microstrip.h:48

References atten_cond_e, atten_cond_o, C0, er_eff_e_0, er_eff_o_0, FREQUENCY_PRM, TRANSLINE::m_parameters, PHYS_LEN_PRM, PHYS_WIDTH_PRM, ROUGH_PRM, SIGMA_PRM, SKIN_DEPTH_PRM, Z0_e_0, Z0_o_0, and ZF0.

Referenced by attenuation().

◆ delta_q_cover_even()

double C_MICROSTRIP::delta_q_cover_even ( double  h2h)
private

Definition at line 214 of file c_microstrip.cpp.

215 {
216  double q_c;
217 
218  if( h2h <= 39 )
219  {
220  q_c = tanh( 1.626 + 0.107 * h2h - 1.733 / sqrt( h2h ) );
221  }
222  else
223  {
224  q_c = 1.0;
225  }
226 
227  return q_c;
228 }

Referenced by er_eff_static().

◆ delta_q_cover_odd()

double C_MICROSTRIP::delta_q_cover_odd ( double  h2h)
private

Definition at line 235 of file c_microstrip.cpp.

236 {
237  double q_c;
238 
239  if( h2h <= 7 )
240  {
241  q_c = tanh( 9.575 / ( 7.0 - h2h ) - 2.965 + 1.68 * h2h - 0.311 * h2h * h2h );
242  }
243  else
244  {
245  q_c = 1.0;
246  }
247 
248  return q_c;
249 }

Referenced by er_eff_static().

◆ delta_u_thickness()

void C_MICROSTRIP::delta_u_thickness ( )
private

Definition at line 119 of file c_microstrip.cpp.

120 {
121  double e_r, u, g, t_h;
122  double delta_u, delta_t, delta_u_e, delta_u_o;
123 
124  e_r = m_parameters[EPSILONR_PRM];
125  u = m_parameters[PHYS_WIDTH_PRM] / m_parameters[H_PRM]; /* normalized line width */
126  g = m_parameters[PHYS_S_PRM] / m_parameters[H_PRM]; /* normalized line spacing */
127  t_h = m_parameters[T_PRM] / m_parameters[H_PRM]; /* normalized strip thickness */
128 
129  if( t_h > 0.0 )
130  {
131  /* single microstrip correction for finite strip thickness */
132  delta_u = delta_u_thickness_single( u, t_h );
133  delta_t = t_h / ( g * e_r );
134  /* thickness correction for the even- and odd-mode */
135  delta_u_e = delta_u * ( 1.0 - 0.5 * exp( -0.69 * delta_u / delta_t ) );
136  delta_u_o = delta_u_e + delta_t;
137  }
138  else
139  {
140  delta_u_e = delta_u_o = 0.0;
141  }
142 
145 }
double w_t_e
Definition: c_microstrip.h:43
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
double delta_u_thickness_single(double, double)
double w_t_o
Definition: c_microstrip.h:44

References delta_u_thickness_single(), EPSILONR_PRM, H_PRM, TRANSLINE::m_parameters, PHYS_S_PRM, PHYS_WIDTH_PRM, T_PRM, w_t_e, and w_t_o.

Referenced by calcAnalyze().

◆ delta_u_thickness_single()

double C_MICROSTRIP::delta_u_thickness_single ( double  u,
double  t_h 
)
private

Definition at line 87 of file c_microstrip.cpp.

88 {
89  double delta_u;
90 
91  if( t_h > 0.0 )
92  {
93  delta_u =
94  (1.25 * t_h /
95  M_PI) *
96  ( 1.0 +
97  log( ( 2.0 +
98  (4.0 * M_PI * u -
99  2.0) / ( 1.0 + exp( -100.0 * ( u - 1.0 / (2.0 * M_PI) ) ) ) ) / t_h ) );
100 
101  }
102  else
103  {
104  delta_u = 0.0;
105  }
106  return delta_u;
107 }

Referenced by delta_u_thickness().

◆ delta_Z0_even_cover()

double C_MICROSTRIP::delta_Z0_even_cover ( double  g,
double  u,
double  h2h 
)
private

delta_Z0_even_cover() - compute the even-mode impedance correction for a homogeneous microstrip due to the cover

References: S. March, "Microstrip Packaging: Watch the Last Step", Microwaves, vol. 20, no. 13, pp. 83.94, Dec. 1981.

Definition at line 314 of file c_microstrip.cpp.

315 {
316  double f_e, g_e, delta_Z0_even;
317  double x, y, A, B, C, D, E, F;
318 
319  A = -4.351 / pow( 1.0 + h2h, 1.842 );
320  B = 6.639 / pow( 1.0 + h2h, 1.861 );
321  C = -2.291 / pow( 1.0 + h2h, 1.90 );
322  f_e = 1.0 - atanh( A + ( B + C * u ) * u );
323 
324  x = pow( 10.0, 0.103 * g - 0.159 );
325  y = pow( 10.0, 0.0492 * g - 0.073 );
326  D = 0.747 / sin( 0.5 * M_PI * x );
327  E = 0.725 * sin( 0.5 * M_PI * y );
328  F = pow( 10.0, 0.11 - 0.0947 * g );
329  g_e = 270.0 * ( 1.0 - tanh( D + E * sqrt( 1.0 + h2h ) - F / ( 1.0 + h2h ) ) );
330 
331  delta_Z0_even = f_e * g_e;
332 
333  return delta_Z0_even;
334 }
double atanh(double x)
Definition: units.h:52
#define F(x, y, z)
Definition: md5_hash.cpp:15
#define D(x)
Definition: ptree.cpp:41

References atanh(), D, and F.

Referenced by Z0_even_odd().

◆ delta_Z0_odd_cover()

double C_MICROSTRIP::delta_Z0_odd_cover ( double  g,
double  u,
double  h2h 
)
private

delta_Z0_odd_cover() - compute the odd-mode impedance correction for a homogeneous microstrip due to the cover

References: S. March, "Microstrip Packaging: Watch the Last Step", Microwaves, vol. 20, no. 13, pp. 83.94, Dec. 1981.

Definition at line 344 of file c_microstrip.cpp.

345 {
346  double f_o, g_o, delta_Z0_odd;
347  double G, J, K, L;
348 
349  J = tanh( pow( 1.0 + h2h, 1.585 ) / 6.0 );
350  f_o = pow( u, J );
351 
352  G = 2.178 - 0.796 * g;
353  if( g > 0.858 )
354  {
355  K = log10( 20.492 * pow( g, 0.174 ) );
356  }
357  else
358  {
359  K = 1.30;
360  }
361  if( g > 0.873 )
362  {
363  L = 2.51 * pow( g, -0.462 );
364  }
365  else
366  {
367  L = 2.674;
368  }
369  g_o = 270.0 * ( 1.0 - tanh( G + K * sqrt( 1.0 + h2h ) - L / ( 1.0 + h2h ) ) );
370 
371  delta_Z0_odd = f_o * g_o;
372 
373  return delta_Z0_odd;
374 }
#define G(x, y, z)
Definition: md5_hash.cpp:16

References G.

Referenced by Z0_even_odd().

◆ dielectric_losses()

void C_MICROSTRIP::dielectric_losses ( )
private

Definition at line 540 of file c_microstrip.cpp.

541 {
542  double e_r, e_r_eff_e_0, e_r_eff_o_0;
543  double alpha_d_e, alpha_d_o;
544 
545  e_r = m_parameters[EPSILONR_PRM];
546  e_r_eff_e_0 = er_eff_e_0;
547  e_r_eff_o_0 = er_eff_o_0;
548 
549  alpha_d_e = ( 20.0 * M_PI / log( 10.0 ) ) * ( m_parameters[FREQUENCY_PRM] / C0 )
550  * ( e_r / sqrt( e_r_eff_e_0 ) ) * ( ( e_r_eff_e_0 - 1.0 ) / ( e_r - 1.0 ) )
552  alpha_d_o = ( 20.0 * M_PI / log( 10.0 ) ) * ( m_parameters[FREQUENCY_PRM] / C0 )
553  * ( e_r / sqrt( e_r_eff_o_0 ) ) * ( ( e_r_eff_o_0 - 1.0 ) / ( e_r - 1.0 ) )
555 
558 }
double er_eff_o_0
Definition: c_microstrip.h:58
double atten_dielectric_e
Definition: c_microstrip.h:60
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
double atten_dielectric_o
Definition: c_microstrip.h:62
#define C0
Definition: units.h:62
double er_eff_e_0
Definition: c_microstrip.h:57

References atten_dielectric_e, atten_dielectric_o, C0, EPSILONR_PRM, er_eff_e_0, er_eff_o_0, FREQUENCY_PRM, TRANSLINE::m_parameters, PHYS_LEN_PRM, and TAND_PRM.

Referenced by attenuation().

◆ ellipk()

double TRANSLINE::ellipk ( double  k)
protectedinherited

Definition at line 312 of file transline.cpp.

313 {
314  double r, lost;
315 
316  ellipke( k, r, lost );
317  return r;
318 }
void ellipke(double, double &, double &)
Definition: transline.cpp:251

References TRANSLINE::ellipke().

Referenced by COPLANAR::calcAnalyze().

◆ ellipke()

void TRANSLINE::ellipke ( double  arg,
double &  k,
double &  e 
)
protectedinherited

Definition at line 251 of file transline.cpp.

252 {
253  int iMax = 16;
254 
255  if( arg == 1.0 )
256  {
257  k = INFINITY; // infinite
258  e = 0;
259  }
260  else if( std::isinf( arg ) && arg < 0 )
261  {
262  k = 0;
263  e = INFINITY; // infinite
264  }
265  else
266  {
267  double a, b, c, fr, s, fk = 1, fe = 1, t, da = arg;
268  int i;
269  if( arg < 0 )
270  {
271  fk = 1 / sqrt( 1 - arg );
272  fe = sqrt( 1 - arg );
273  da = -arg / ( 1 - arg );
274  }
275  a = 1;
276  b = sqrt( 1 - da );
277  c = sqrt( da );
278  fr = 0.5;
279  s = fr * c * c;
280  for( i = 0; i < iMax; i++ )
281  {
282  t = ( a + b ) / 2;
283  c = ( a - b ) / 2;
284  b = sqrt( a * b );
285  a = t;
286  fr *= 2;
287  s += fr * c * c;
288  if( c / a < NR_EPSI )
289  break;
290  }
291 
292  if( i >= iMax )
293  {
294  k = 0;
295  e = 0;
296  }
297  else
298  {
299  k = M_PI_2 / a;
300  e = M_PI_2 * ( 1 - s ) / a;
301  if( arg < 0 )
302  {
303  k *= fk;
304  e *= fe;
305  }
306  }
307  }
308 }
#define M_PI_2
Definition: transline.cpp:37
#define NR_EPSI
Definition: transline.cpp:245
#define INFINITY
Definition: transline.cpp:32

References INFINITY, M_PI_2, and NR_EPSI.

Referenced by TRANSLINE::ellipk().

◆ er_eff_freq()

void C_MICROSTRIP::er_eff_freq ( )
private

Definition at line 440 of file c_microstrip.cpp.

441 {
442  double P_1, P_2, P_3, P_4, P_5, P_6, P_7;
443  double P_8, P_9, P_10, P_11, P_12, P_13, P_14, P_15;
444  double F_e, F_o;
445  double er_eff, u, g, f_n;
446 
447  u = m_parameters[PHYS_WIDTH_PRM] / m_parameters[H_PRM]; /* normalize line width */
448  g = m_parameters[PHYS_S_PRM] / m_parameters[H_PRM]; /* normalize line spacing */
449 
450  /* normalized frequency [GHz * mm] */
451  f_n = m_parameters[FREQUENCY_PRM] * m_parameters[H_PRM] / 1e06;
452 
453  er_eff = er_eff_e_0;
454  P_1 = 0.27488 + ( 0.6315 + 0.525 / pow( 1.0 + 0.0157 * f_n, 20.0 ) ) * u
455  - 0.065683 * exp( -8.7513 * u );
456  P_2 = 0.33622 * ( 1.0 - exp( -0.03442 * m_parameters[EPSILONR_PRM] ) );
457  P_3 = 0.0363 * exp( -4.6 * u ) * ( 1.0 - exp( -pow( f_n / 38.7, 4.97 ) ) );
458  P_4 = 1.0 + 2.751 * ( 1.0 - exp( -pow( m_parameters[EPSILONR_PRM] / 15.916, 8.0 ) ) );
459  P_5 = 0.334 * exp( -3.3 * pow( m_parameters[EPSILONR_PRM] / 15.0, 3.0 ) ) + 0.746;
460  P_6 = P_5 * exp( -pow( f_n / 18.0, 0.368 ) );
461  P_7 = 1.0
462  + 4.069 * P_6 * pow( g, 0.479 ) * exp( -1.347 * pow( g, 0.595 ) - 0.17 * pow( g, 2.5 ) );
463 
464  F_e = P_1 * P_2 * pow( ( P_3 * P_4 + 0.1844 * P_7 ) * f_n, 1.5763 );
465  /* even-mode effective dielectric constant */
467 
468  er_eff = er_eff_o_0;
469  P_8 = 0.7168 * ( 1.0 + 1.076 / ( 1.0 + 0.0576 * ( m_parameters[EPSILONR_PRM] - 1.0 ) ) );
470  P_9 = P_8
471  - 0.7913 * ( 1.0 - exp( -pow( f_n / 20.0, 1.424 ) ) )
472  * atan( 2.481 * pow( m_parameters[EPSILONR_PRM] / 8.0, 0.946 ) );
473  P_10 = 0.242 * pow( m_parameters[EPSILONR_PRM] - 1.0, 0.55 );
474  P_11 = 0.6366 * ( exp( -0.3401 * f_n ) - 1.0 ) * atan( 1.263 * pow( u / 3.0, 1.629 ) );
475  P_12 = P_9 + ( 1.0 - P_9 ) / ( 1.0 + 1.183 * pow( u, 1.376 ) );
476  P_13 = 1.695 * P_10 / ( 0.414 + 1.605 * P_10 );
477  P_14 = 0.8928 + 0.1072 * ( 1.0 - exp( -0.42 * pow( f_n / 20.0, 3.215 ) ) );
478  P_15 = fabs( 1.0 - 0.8928 * ( 1.0 + P_11 ) * P_12 * exp( -P_13 * pow( g, 1.092 ) ) / P_14 );
479 
480  F_o = P_1 * P_2 * pow( ( P_3 * P_4 + 0.1844 ) * f_n * P_15, 1.5763 );
481  /* odd-mode effective dielectric constant */
483 }
double er_eff_o
Definition: c_microstrip.h:56
double er_eff_o_0
Definition: c_microstrip.h:58
double er_eff
Definition: transline.h:122
double er_eff_e
Definition: c_microstrip.h:55
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
double er_eff_e_0
Definition: c_microstrip.h:57

References EPSILONR_PRM, TRANSLINE::er_eff, er_eff_e, er_eff_e_0, er_eff_o, er_eff_o_0, FREQUENCY_PRM, H_PRM, TRANSLINE::m_parameters, PHYS_S_PRM, and PHYS_WIDTH_PRM.

Referenced by calcAnalyze().

◆ er_eff_static()

void C_MICROSTRIP::er_eff_static ( )
private

er_eff_static() - compute the static effective dielectric constants

References: Manfred Kirschning and Rolf Jansen, "Accurate Wide-Range Design Equations for the Frequency-Dependent Characteristic of Parallel Coupled Microstrip Lines", IEEE Trans. MTT, vol. 32, no. 1, Jan. 1984

Definition at line 260 of file c_microstrip.cpp.

261 {
262  double u_t_e, u_t_o, g, h2, h2h;
263  double a_o, t_h, q, q_c, q_t, q_inf;
264  double er_eff_single;
265  double er;
266 
268 
269  /* compute zero-thickness single line parameters */
271  er_eff_single = aux_ms->er_eff_0;
272 
273  h2 = m_parameters[H_T_PRM];
274  u_t_e = w_t_e / m_parameters[H_PRM]; /* normalized even_mode line width */
275  u_t_o = w_t_o / m_parameters[H_PRM]; /* normalized odd_mode line width */
276  g = m_parameters[PHYS_S_PRM] / m_parameters[H_PRM]; /* normalized line spacing */
277  h2h = h2 / m_parameters[H_PRM]; /* normalized cover height */
278  t_h = m_parameters[T_PRM] / m_parameters[H_PRM]; /* normalized strip thickness */
279 
280  /* filling factor, computed with thickness corrected width */
281  q_inf = filling_factor_even( u_t_e, g, er );
282  /* cover effect */
283  q_c = delta_q_cover_even( h2h );
284  /* thickness effect */
285  q_t = aux_ms->delta_q_thickness( u_t_e, t_h );
286  /* resultant filling factor */
287  q = ( q_inf - q_t ) * q_c;
288  /* static even-mode effective dielectric constant */
289  er_eff_e_0 = 0.5 * ( er + 1.0 ) + 0.5 * ( er - 1.0 ) * q;
290 
291  /* filling factor, with width corrected for thickness */
292  q_inf = filling_factor_odd( u_t_o, g, er );
293  /* cover effect */
294  q_c = delta_q_cover_odd( h2h );
295  /* thickness effect */
296  q_t = aux_ms->delta_q_thickness( u_t_o, t_h );
297  /* resultant filling factor */
298  q = ( q_inf - q_t ) * q_c;
299 
300  a_o = 0.7287 * ( er_eff_single - 0.5 * ( er + 1.0 ) ) * ( 1.0 - exp( -0.179 * u_t_o ) );
301 
302  /* static odd-mode effective dielectric constant */
303  er_eff_o_0 = ( 0.5 * ( er + 1.0 ) + a_o - er_eff_single ) * q + er_eff_single;
304 }
double delta_q_thickness(double, double)
Definition: microstrip.cpp:130
double er_eff_o_0
Definition: c_microstrip.h:58
double w_t_e
Definition: c_microstrip.h:43
double er_eff_0
Definition: microstrip.h:48
double delta_q_cover_odd(double)
void compute_single_line()
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
double filling_factor_even(double, double, double)
MICROSTRIP * aux_ms
Definition: c_microstrip.h:94
double er_eff_e_0
Definition: c_microstrip.h:57
double filling_factor_odd(double, double, double)
filling_factor_odd() - compute the filling factor for the coupled microstrips odd-mode without cover ...
double delta_q_cover_even(double)
double w_t_o
Definition: c_microstrip.h:44

References aux_ms, compute_single_line(), delta_q_cover_even(), delta_q_cover_odd(), MICROSTRIP::delta_q_thickness(), EPSILONR_PRM, MICROSTRIP::er_eff_0, er_eff_e_0, er_eff_o_0, filling_factor_even(), filling_factor_odd(), H_PRM, H_T_PRM, TRANSLINE::m_parameters, PHYS_S_PRM, T_PRM, w_t_e, and w_t_o.

Referenced by calcAnalyze().

◆ filling_factor_even()

double C_MICROSTRIP::filling_factor_even ( double  u,
double  g,
double  e_r 
)
private

Definition at line 175 of file c_microstrip.cpp.

176 {
177  double v, v3, v4, a_e, b_e, q_inf;
178 
179  v = u * ( 20.0 + g * g ) / ( 10.0 + g * g ) + g * exp( -g );
180  v3 = v * v * v;
181  v4 = v3 * v;
182  a_e = 1.0 + log( ( v4 + v * v / 2704.0 ) / ( v4 + 0.432 ) ) / 49.0
183  + log( 1.0 + v3 / 5929.741 ) / 18.7;
184  b_e = 0.564 * pow( ( ( e_r - 0.9 ) / ( e_r + 3.0 ) ), 0.053 );
185 
186  /* filling factor, with width corrected for thickness */
187  q_inf = pow( ( 1.0 + 10.0 / v ), -a_e * b_e );
188 
189  return q_inf;
190 }

Referenced by er_eff_static().

◆ filling_factor_odd()

double C_MICROSTRIP::filling_factor_odd ( double  u,
double  g,
double  e_r 
)
private

filling_factor_odd() - compute the filling factor for the coupled microstrips odd-mode without cover and zero conductor thickness

Definition at line 197 of file c_microstrip.cpp.

198 {
199  double b_odd = 0.747 * e_r / ( 0.15 + e_r );
200  double c_odd = b_odd - ( b_odd - 0.207 ) * exp( -0.414 * u );
201  double d_odd = 0.593 + 0.694 * exp( -0.562 * u );
202 
203  /* filling factor, with width corrected for thickness */
204  double q_inf = exp( -c_odd * pow( g, d_odd ) );
205 
206  return q_inf;
207 }

Referenced by er_eff_static().

◆ getProperties()

void TRANSLINE::getProperties ( void  )
inherited

@function getProperties

Get all properties from the UI. Computes some extra ones.

Definition at line 144 of file transline.cpp.

145 {
146  int i;
147  for( i = 0; i < DUMMY_PRM; ++i )
148  {
149  m_parameters[i] = getProperty( (PRMS_ID) i );
151  }
155 }
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
PRMS_ID
Definition: transline.h:37
double getProperty(enum PRMS_ID aPrmId)
Definition: transline.cpp:135
#define TRANSLINE_OK
Definition: transline.h:30
double skin_depth()
@function skin_depth calculate skin depth
Definition: transline.cpp:229
void setErrorLevel(PRMS_ID, char)
@function setErrorLevel
Definition: transline.cpp:423

References DUMMY_PRM, EPSILON_EFF_PRM, TRANSLINE::getProperty(), TRANSLINE::m_parameters, RHO_PRM, TRANSLINE::setErrorLevel(), SIGMA_PRM, TRANSLINE::skin_depth(), SKIN_DEPTH_PRM, and TRANSLINE_OK.

Referenced by TRANSLINE::analyze(), and TRANSLINE::synthesize().

◆ getProperty()

double TRANSLINE::getProperty ( enum PRMS_ID  aPrmId)
inherited

◆ Init()

void TRANSLINE::Init ( void  )
inherited

Definition at line 87 of file transline.cpp.

88 {
89  wxColour wxcol = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW );
90  okCol = KIGFX::COLOR4D( wxcol );
91  okCol.r = wxcol.Red() / 255.0;
92  okCol.g = wxcol.Green() / 255.0;
93  okCol.b = wxcol.Blue() / 255.0;
94  int i;
95  // Initialize these variables mainly to avoid warnings from a static analyzer
96  for( i = 0; i < EXTRA_PRMS_COUNT; ++i )
97  {
98  m_parameters[i] = 0;
99  }
100 }
double g
Green component.
Definition: color4d.h:367
double b
Blue component.
Definition: color4d.h:368
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
KIGFX::COLOR4D okCol
Definition: transline.h:117
double r
Red component.
Definition: color4d.h:366
COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:99

References KIGFX::COLOR4D::b, EXTRA_PRMS_COUNT, KIGFX::COLOR4D::g, TRANSLINE::m_parameters, TRANSLINE::okCol, and KIGFX::COLOR4D::r.

Referenced by C_MICROSTRIP(), COAX::COAX(), COPLANAR::COPLANAR(), MICROSTRIP::MICROSTRIP(), RECTWAVEGUIDE::RECTWAVEGUIDE(), STRIPLINE::STRIPLINE(), TRANSLINE::TRANSLINE(), and TWISTEDPAIR::TWISTEDPAIR().

◆ isSelected()

bool TRANSLINE::isSelected ( enum PRMS_ID  aPrmId)
inherited

◆ line_angle()

void C_MICROSTRIP::line_angle ( )
private

Definition at line 576 of file c_microstrip.cpp.

577 {
578  double e_r_eff_e, e_r_eff_o;
579  double v_e, v_o, lambda_g_e, lambda_g_o;
580 
581  e_r_eff_e = er_eff_e;
582  e_r_eff_o = er_eff_o;
583 
584  /* even-mode velocity */
585  v_e = C0 / sqrt( e_r_eff_e );
586  /* odd-mode velocity */
587  v_o = C0 / sqrt( e_r_eff_o );
588  /* even-mode wavelength */
589  lambda_g_e = v_e / m_parameters[FREQUENCY_PRM];
590  /* odd-mode wavelength */
591  lambda_g_o = v_o / m_parameters[FREQUENCY_PRM];
592  /* electrical angles */
593  ang_l_e = 2.0 * M_PI * m_parameters[PHYS_LEN_PRM] / lambda_g_e; /* in radians */
594  ang_l_o = 2.0 * M_PI * m_parameters[PHYS_LEN_PRM] / lambda_g_o; /* in radians */
595 }
double er_eff_o
Definition: c_microstrip.h:56
double er_eff_e
Definition: c_microstrip.h:55
double ang_l_o
Definition: c_microstrip.h:54
double ang_l_e
Definition: c_microstrip.h:53
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
#define C0
Definition: units.h:62

References ang_l_e, ang_l_o, C0, er_eff_e, er_eff_o, FREQUENCY_PRM, TRANSLINE::m_parameters, and PHYS_LEN_PRM.

Referenced by calcAnalyze().

◆ minimizeZ0Error1D()

bool TRANSLINE::minimizeZ0Error1D ( double *  aVar)
protectedinherited

@function minimizeZ0Error1D

Tries to find a parameter that minimizes the error ( on Z0 ). This function only works with a single parameter. Calls calcAnalyze several times until the error is acceptable. While the error is unnacceptable, changes slightly the parameter.

This function does not change Z0 / Angl_L.

Parameters
avarParameter to synthesize
Returns
'true' if error < MAX_ERROR, else 'false'

Definition at line 337 of file transline.cpp.

338 {
339  double Z0_dest, Z0_current, Z0_result, angl_l_dest, increment, slope, error;
340  int iteration;
341 
342  if( !std::isfinite( m_parameters[Z0_PRM] ) )
343  {
344  *aVar = NAN;
345  return false;
346  }
347 
348  if( ( !std::isfinite( *aVar ) ) || ( *aVar == 0 ) )
349  {
350  *aVar = 0.001;
351  }
352 
353  /* required value of Z0 */
354  Z0_dest = m_parameters[Z0_PRM];
355 
356  /* required value of angl_l */
357  angl_l_dest = m_parameters[ANG_L_PRM];
358 
359  /* Newton's method */
360  iteration = 0;
361 
362  /* compute parameters */
363  calcAnalyze();
364  Z0_current = m_parameters[Z0_PRM];
365 
366  error = fabs( Z0_dest - Z0_current );
367 
368  while( error > MAX_ERROR )
369  {
370  iteration++;
371  increment = *aVar / 100.0;
372  *aVar += increment;
373  /* compute parameters */
374  calcAnalyze();
375  Z0_result = m_parameters[Z0_PRM];
376  /* f(w(n)) = Z0 - Z0(w(n)) */
377  /* f'(w(n)) = -f'(Z0(w(n))) */
378  /* f'(Z0(w(n))) = (Z0(w(n)) - Z0(w(n+delw))/delw */
379  /* w(n+1) = w(n) - f(w(n))/f'(w(n)) */
380  slope = ( Z0_result - Z0_current ) / increment;
381  slope = ( Z0_dest - Z0_current ) / slope - increment;
382  *aVar += slope;
383  if( *aVar <= 0.0 )
384  *aVar = increment;
385  /* find new error */
386  /* compute parameters */
387  calcAnalyze();
388  Z0_current = m_parameters[Z0_PRM];
389  error = fabs( Z0_dest - Z0_current );
390 
391  if( iteration > 100 )
392  break;
393  }
394 
395  /* Compute one last time, but with correct length */
396  m_parameters[Z0_PRM] = Z0_dest;
397  m_parameters[ANG_L_PRM] = angl_l_dest;
400  / 2.0 / M_PI; /* in m */
401  calcAnalyze();
402 
403  /* Restore parameters */
404  m_parameters[Z0_PRM] = Z0_dest;
405  m_parameters[ANG_L_PRM] = angl_l_dest;
408  / 2.0 / M_PI; /* in m */
409  return error <= MAX_ERROR;
410 }
virtual void calcAnalyze()
Computation for analysis.
Definition: transline.h:101
#define MAX_ERROR
Definition: transline.cpp:320
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
#define C0
Definition: units.h:62

References ANG_L_PRM, C0, TRANSLINE::calcAnalyze(), EPSILON_EFF_PRM, FREQUENCY_PRM, TRANSLINE::m_parameters, MAX_ERROR, PHYS_LEN_PRM, and Z0_PRM.

Referenced by COPLANAR::calcSynthesize(), TWISTEDPAIR::calcSynthesize(), STRIPLINE::calcSynthesize(), and MICROSTRIP::calcSynthesize().

◆ setErrorLevel()

void TRANSLINE::setErrorLevel ( PRMS_ID  aP,
char  aErrorLevel 
)
protectedinherited

@function setErrorLevel

set an error / warning level for a given parameter.

See also
TRANSLINE_OK
TRANSLINE_WARNING
TRANSLINE_ERROR
Parameters
aPparameter
aErrorLevelError level

Definition at line 423 of file transline.cpp.

424 {
425  switch( aErrorLevel )
426  {
427  case( TRANSLINE_WARNING ):
429  break;
430  case( TRANSLINE_ERROR ):
432  break;
433  default:
435  break;
436  }
437 }
void SetPropertyBgColorInDialog(enum PRMS_ID aPrmId, const KIGFX::COLOR4D *aCol)
Function SetPropertyBgColorInDialog Set the background color of a parameter.
KIGFX::COLOR4D okCol
Definition: transline.h:117
KIGFX::COLOR4D errCol
Definition: transline.h:115
#define TRANSLINE_ERROR
Definition: transline.h:32
KIGFX::COLOR4D warnCol
Definition: transline.h:116
#define TRANSLINE_WARNING
Definition: transline.h:31

References TRANSLINE::errCol, TRANSLINE::okCol, SetPropertyBgColorInDialog(), TRANSLINE_ERROR, TRANSLINE_WARNING, and TRANSLINE::warnCol.

Referenced by TRANSLINE::checkProperties(), TRANSLINE::getProperties(), TWISTEDPAIR::showAnalyze(), COAX::showAnalyze(), STRIPLINE::showAnalyze(), COPLANAR::showAnalyze(), RECTWAVEGUIDE::showAnalyze(), MICROSTRIP::showAnalyze(), showAnalyze(), TWISTEDPAIR::showSynthesize(), STRIPLINE::showSynthesize(), COAX::showSynthesize(), COPLANAR::showSynthesize(), RECTWAVEGUIDE::showSynthesize(), MICROSTRIP::showSynthesize(), and showSynthesize().

◆ setProperty()

◆ setResult() [1/2]

void TRANSLINE::setResult ( int  line,
double  value,
const char *  text 
)
inherited

Definition at line 128 of file transline.cpp.

129 {
130  SetResultInDialog( line, value, text );
131 }
void SetResultInDialog(int line, const char *text)

References SetResultInDialog().

Referenced by TWISTEDPAIR::show_results(), STRIPLINE::show_results(), COAX::show_results(), COPLANAR::show_results(), RECTWAVEGUIDE::show_results(), MICROSTRIP::show_results(), and show_results().

◆ setResult() [2/2]

void TRANSLINE::setResult ( int  line,
const char *  text 
)
inherited

Definition at line 124 of file transline.cpp.

125 {
126  SetResultInDialog( line, text );
127 }
void SetResultInDialog(int line, const char *text)

References SetResultInDialog().

◆ show_results()

void C_MICROSTRIP::show_results ( )
overrideprivatevirtual

Shows results.

Reimplemented from TRANSLINE.

Definition at line 875 of file c_microstrip.cpp.

876 {
877 
878  setResult( 0, er_eff_e, "" );
879  setResult( 1, er_eff_o, "" );
880  setResult( 2, atten_cond_e, "dB" );
881  setResult( 3, atten_cond_o, "dB" );
882  setResult( 4, atten_dielectric_e, "dB" );
883  setResult( 5, atten_dielectric_o, "dB" );
884 
886 }
double er_eff_o
Definition: c_microstrip.h:56
double er_eff_e
Definition: c_microstrip.h:55
void setResult(int, double, const char *)
Definition: transline.cpp:128
double atten_dielectric_e
Definition: c_microstrip.h:60
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
double atten_cond_o
Definition: c_microstrip.h:63
#define UNIT_MICRON
Definition: units_scales.h:33
double atten_dielectric_o
Definition: c_microstrip.h:62
double atten_cond_e
Definition: c_microstrip.h:61

References atten_cond_e, atten_cond_o, atten_dielectric_e, atten_dielectric_o, er_eff_e, er_eff_o, TRANSLINE::m_parameters, TRANSLINE::setResult(), SKIN_DEPTH_PRM, and UNIT_MICRON.

◆ showAnalyze()

void C_MICROSTRIP::showAnalyze ( )
overrideprivatevirtual

Shows synthesis results and checks for errors / warnings.

Reimplemented from TRANSLINE.

Definition at line 821 of file c_microstrip.cpp.

822 {
825  setProperty( ANG_L_PRM, sqrt( ang_l_e * ang_l_o ) );
826 
827  //Check for errors
828  if( !std::isfinite( m_parameters[Z0_O_PRM] ) || m_parameters[Z0_O_PRM] <= 0.0 )
830 
831  if( !std::isfinite( m_parameters[Z0_E_PRM] ) || m_parameters[Z0_E_PRM] <= 0.0 )
833 
834  if( !std::isfinite( m_parameters[ANG_L_PRM] ) || m_parameters[ANG_L_PRM] <= 0.0 )
836 
837  // Check for warnings
838  if( !std::isfinite( m_parameters[PHYS_WIDTH_PRM] ) || m_parameters[PHYS_WIDTH_PRM] <= 0.0 )
840 
841  if( !std::isfinite( m_parameters[PHYS_S_PRM] ) || m_parameters[PHYS_S_PRM] <= 0.0 )
843 
844  if( !std::isfinite( m_parameters[PHYS_LEN_PRM] ) || m_parameters[PHYS_LEN_PRM] <= 0.0 )
846 }
void setProperty(enum PRMS_ID aPrmId, double aValue)
Definition: transline.cpp:106
double ang_l_o
Definition: c_microstrip.h:54
double ang_l_e
Definition: c_microstrip.h:53
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
#define TRANSLINE_ERROR
Definition: transline.h:32
#define TRANSLINE_WARNING
Definition: transline.h:31
void setErrorLevel(PRMS_ID, char)
@function setErrorLevel
Definition: transline.cpp:423

References ang_l_e, ang_l_o, ANG_L_PRM, TRANSLINE::m_parameters, PHYS_LEN_PRM, PHYS_S_PRM, PHYS_WIDTH_PRM, TRANSLINE::setErrorLevel(), TRANSLINE::setProperty(), TRANSLINE_ERROR, TRANSLINE_WARNING, Z0_E_PRM, and Z0_O_PRM.

◆ showSynthesize()

void C_MICROSTRIP::showSynthesize ( )
overrideprivatevirtual

Shows analysis results and checks for errors / warnings.

Reimplemented from TRANSLINE.

Definition at line 848 of file c_microstrip.cpp.

849 {
853 
854  //Check for errors
855  if( !std::isfinite( m_parameters[PHYS_WIDTH_PRM] ) || m_parameters[PHYS_WIDTH_PRM] <= 0.0 )
857 
858  if( !std::isfinite( m_parameters[PHYS_S_PRM] ) || m_parameters[PHYS_S_PRM] <= 0.0 )
860 
861  if( !std::isfinite( m_parameters[PHYS_LEN_PRM] ) || m_parameters[PHYS_LEN_PRM] <= 0.0 )
863 
864  // Check for warnings
865  if( !std::isfinite( m_parameters[Z0_O_PRM] ) || m_parameters[Z0_O_PRM] <= 0.0 )
867 
868  if( !std::isfinite( m_parameters[Z0_E_PRM] ) || m_parameters[Z0_E_PRM] <= 0.0 )
870 
871  if( !std::isfinite( m_parameters[ANG_L_PRM] ) || m_parameters[ANG_L_PRM] <= 0.0 )
873 }
void setProperty(enum PRMS_ID aPrmId, double aValue)
Definition: transline.cpp:106
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
#define TRANSLINE_ERROR
Definition: transline.h:32
#define TRANSLINE_WARNING
Definition: transline.h:31
void setErrorLevel(PRMS_ID, char)
@function setErrorLevel
Definition: transline.cpp:423

References ANG_L_PRM, TRANSLINE::m_parameters, PHYS_LEN_PRM, PHYS_S_PRM, PHYS_WIDTH_PRM, TRANSLINE::setErrorLevel(), TRANSLINE::setProperty(), TRANSLINE_ERROR, TRANSLINE_WARNING, Z0_E_PRM, and Z0_O_PRM.

◆ skin_depth()

double TRANSLINE::skin_depth ( )
protectedinherited

@function skin_depth calculate skin depth

$ \frac{1}{\sqrt{ \pi \cdot f \cdot \mu \cdot \sigma }} $

Definition at line 229 of file transline.cpp.

230 {
231  double depth;
232  depth = 1.0
233  / sqrt( M_PI * m_parameters[FREQUENCY_PRM] * m_parameters[MURC_PRM] * MU0
234  * m_parameters[SIGMA_PRM] );
235  return depth;
236 }
#define MU0
Definition: units.h:61
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120

References FREQUENCY_PRM, TRANSLINE::m_parameters, MU0, MURC_PRM, and SIGMA_PRM.

Referenced by attenuation(), MICROSTRIP::attenuation(), STRIPLINE::calcAnalyze(), COPLANAR::calcAnalyze(), and TRANSLINE::getProperties().

◆ syn_err_fun()

void C_MICROSTRIP::syn_err_fun ( double *  f1,
double *  f2,
double  s_h,
double  w_h,
double  e_r,
double  w_h_se,
double  w_h_so 
)
private

Definition at line 598 of file c_microstrip.cpp.

600 {
601  double g, he;
602 
603  g = cosh( 0.5 * M_PI * s_h );
604  he = cosh( M_PI * w_h + 0.5 * M_PI * s_h );
605 
606  *f1 = ( 2.0 / M_PI ) * acosh( ( 2.0 * he - g + 1.0 ) / ( g + 1.0 ) );
607  *f2 = ( 2.0 / M_PI ) * acosh( ( 2.0 * he - g - 1.0 ) / ( g - 1.0 ) );
608 
609  if( e_r <= 6.0 )
610  {
611  *f2 += ( 4.0 / ( M_PI * ( 1.0 + e_r / 2.0 ) ) ) * acosh( 1.0 + 2.0 * w_h / s_h );
612  }
613  else
614  {
615  *f2 += ( 1.0 / M_PI ) * acosh( 1.0 + 2.0 * w_h / s_h );
616  }
617 
618  *f1 -= w_h_se;
619  *f2 -= w_h_so;
620 }
double acosh(double x)
Definition: units.h:41

References acosh().

Referenced by synth_width().

◆ syn_fun()

void C_MICROSTRIP::syn_fun ( double *  f1,
double *  f2,
double  s_h,
double  w_h,
double  Z0_e,
double  Z0_o 
)
private

Definition at line 889 of file c_microstrip.cpp.

891 {
894 
895  /* compute coupled microstrip parameters */
896  calcAnalyze();
897 
898  *f1 = m_parameters[Z0_E_PRM] - Z0_e;
899  *f2 = m_parameters[Z0_O_PRM] - Z0_o;
900 }
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
void calcAnalyze() override
Computation for analysis.

References calcAnalyze(), H_PRM, TRANSLINE::m_parameters, PHYS_S_PRM, PHYS_WIDTH_PRM, Z0_E_PRM, and Z0_O_PRM.

Referenced by calcSynthesize().

◆ synth_width()

void C_MICROSTRIP::synth_width ( )
private

Definition at line 630 of file c_microstrip.cpp.

631 {
632  double Z0, e_r;
633  double w_h_se, w_h_so, w_h, a, ce, co, s_h;
634  double f1, f2, ft1, ft2, j11, j12, j21, j22, d_s_h, d_w_h, err;
635  double eps = 1e-04;
636 
637  f1 = f2 = 0;
638  e_r = m_parameters[EPSILONR_PRM];
639 
640  Z0 = m_parameters[Z0_E_PRM] / 2.0;
641  /* Wheeler formula for single microstrip synthesis */
642  a = exp( Z0 * sqrt( e_r + 1.0 ) / 42.4 ) - 1.0;
643  w_h_se = 8.0 * sqrt( a * ( ( 7.0 + 4.0 / e_r ) / 11.0 ) + ( ( 1.0 + 1.0 / e_r ) / 0.81 ) ) / a;
644 
645  Z0 = m_parameters[Z0_O_PRM] / 2.0;
646  /* Wheeler formula for single microstrip synthesis */
647  a = exp( Z0 * sqrt( e_r + 1.0 ) / 42.4 ) - 1.0;
648  w_h_so = 8.0 * sqrt( a * ( ( 7.0 + 4.0 / e_r ) / 11.0 ) + ( ( 1.0 + 1.0 / e_r ) / 0.81 ) ) / a;
649 
650  ce = cosh( 0.5 * M_PI * w_h_se );
651  co = cosh( 0.5 * M_PI * w_h_so );
652  /* first guess at m_parameters[PHYS_S_PRM]/h */
653  s_h = ( 2.0 / M_PI ) * acosh( ( ce + co - 2.0 ) / ( co - ce ) );
654  /* first guess at w/h */
655  w_h = acosh( ( ce * co - 1.0 ) / ( co - ce ) ) / M_PI - s_h / 2.0;
656 
659 
660  syn_err_fun( &f1, &f2, s_h, w_h, e_r, w_h_se, w_h_so );
661 
662  /* rather crude Newton-Rhapson; we need this beacuse the estimate of */
663  /* w_h is often quite far from the true value (see Akhtarzad S. et al.) */
664  do
665  {
666  /* compute Jacobian */
667  syn_err_fun( &ft1, &ft2, s_h + eps, w_h, e_r, w_h_se, w_h_so );
668  j11 = ( ft1 - f1 ) / eps;
669  j21 = ( ft2 - f2 ) / eps;
670  syn_err_fun( &ft1, &ft2, s_h, w_h + eps, e_r, w_h_se, w_h_so );
671  j12 = ( ft1 - f1 ) / eps;
672  j22 = ( ft2 - f2 ) / eps;
673 
674  /* compute next step */
675  d_s_h = ( -f1 * j22 + f2 * j12 ) / ( j11 * j22 - j21 * j12 );
676  d_w_h = ( -f2 * j11 + f1 * j21 ) / ( j11 * j22 - j21 * j12 );
677 
678  //g_print("j11 = %e\tj12 = %e\tj21 = %e\tj22 = %e\n", j11, j12, j21, j22);
679  //g_print("det = %e\n", j11*j22 - j21*j22);
680  //g_print("d_s_h = %e\td_w_h = %e\n", d_s_h, d_w_h);
681 
682  s_h += d_s_h;
683  w_h += d_w_h;
684 
685  /* chech the error */
686  syn_err_fun( &f1, &f2, s_h, w_h, e_r, w_h_se, w_h_so );
687 
688  err = sqrt( f1 * f1 + f2 * f2 );
689  /* converged ? */
690  } while( err > 1e-04 );
691 
692 
695 }
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
double acosh(double x)
Definition: units.h:41
void syn_err_fun(double *, double *, double, double, double, double, double)

References acosh(), EPSILONR_PRM, H_PRM, TRANSLINE::m_parameters, PHYS_S_PRM, PHYS_WIDTH_PRM, syn_err_fun(), Z0_E_PRM, and Z0_O_PRM.

Referenced by calcSynthesize().

◆ synthesize()

void TRANSLINE::synthesize ( )
virtualinherited

Definition at line 212 of file transline.cpp.

213 {
214  getProperties();
215  checkProperties();
216  calcSynthesize();
217  showSynthesize();
218  show_results();
219 }
virtual void calcSynthesize()
Computation for synthesis.
Definition: transline.h:104
void checkProperties(void)
@function checkProperties
Definition: transline.cpp:161
virtual void showSynthesize()
Shows analysis results and checks for errors / warnings.
Definition: transline.h:110
virtual void show_results()
Shows results.
Definition: transline.h:113
void getProperties(void)
@function getProperties
Definition: transline.cpp:144

References TRANSLINE::calcSynthesize(), TRANSLINE::checkProperties(), TRANSLINE::getProperties(), TRANSLINE::show_results(), and TRANSLINE::showSynthesize().

Referenced by PCB_CALCULATOR_FRAME::OnTranslineSynthetize().

◆ Z0_dispersion()

void C_MICROSTRIP::Z0_dispersion ( )
private

Definition at line 702 of file c_microstrip.cpp.

703 {
704  double Q_0;
705  double Q_11, Q_12, Q_13, Q_14, Q_15, Q_16, Q_17, Q_18, Q_19, Q_20, Q_21;
706  double Q_22, Q_23, Q_24, Q_25, Q_26, Q_27, Q_28, Q_29;
707  double r_e, q_e, p_e, d_e, C_e;
708  double e_r_eff_o_f, e_r_eff_o_0;
709  double e_r_eff_single_f, e_r_eff_single_0, Z0_single_f;
710  double f_n, g, u, e_r;
711  double R_1, R_2, R_7, R_10, R_11, R_12, R_15, R_16, tmpf;
712 
713  e_r = m_parameters[EPSILONR_PRM];
714 
715  u = m_parameters[PHYS_WIDTH_PRM] / m_parameters[H_PRM]; /* normalize line width */
716  g = m_parameters[PHYS_S_PRM] / m_parameters[H_PRM]; /* normalize line spacing */
717 
718  /* normalized frequency [GHz * mm] */
719  f_n = m_parameters[FREQUENCY_PRM] * m_parameters[H_PRM] / 1e06;
720 
721  e_r_eff_single_f = aux_ms->er_eff;
722  e_r_eff_single_0 = aux_ms->er_eff_0;
723  Z0_single_f = aux_ms->m_parameters[Z0_PRM];
724 
725  e_r_eff_o_f = er_eff_o;
726  e_r_eff_o_0 = er_eff_o_0;
727 
728  Q_11 = 0.893 * ( 1.0 - 0.3 / ( 1.0 + 0.7 * ( e_r - 1.0 ) ) );
729  Q_12 = 2.121 * ( pow( f_n / 20.0, 4.91 ) / ( 1.0 + Q_11 * pow( f_n / 20.0, 4.91 ) ) )
730  * exp( -2.87 * g ) * pow( g, 0.902 );
731  Q_13 = 1.0 + 0.038 * pow( e_r / 8.0, 5.1 );
732  Q_14 = 1.0 + 1.203 * pow( e_r / 15.0, 4.0 ) / ( 1.0 + pow( e_r / 15.0, 4.0 ) );
733  Q_15 = 1.887 * exp( -1.5 * pow( g, 0.84 ) ) * pow( g, Q_14 )
734  / ( 1.0
735  + 0.41 * pow( f_n / 15.0, 3.0 ) * pow( u, 2.0 / Q_13 )
736  / ( 0.125 + pow( u, 1.626 / Q_13 ) ) );
737  Q_16 = ( 1.0 + 9.0 / ( 1.0 + 0.403 * pow( e_r - 1.0, 2 ) ) ) * Q_15;
738  Q_17 = 0.394 * ( 1.0 - exp( -1.47 * pow( u / 7.0, 0.672 ) ) )
739  * ( 1.0 - exp( -4.25 * pow( f_n / 20.0, 1.87 ) ) );
740  Q_18 = 0.61 * ( 1.0 - exp( -2.13 * pow( u / 8.0, 1.593 ) ) ) / ( 1.0 + 6.544 * pow( g, 4.17 ) );
741  Q_19 = 0.21 * g * g * g * g
742  / ( ( 1.0 + 0.18 * pow( g, 4.9 ) ) * ( 1.0 + 0.1 * u * u )
743  * ( 1.0 + pow( f_n / 24.0, 3.0 ) ) );
744  Q_20 = ( 0.09 + 1.0 / ( 1.0 + 0.1 * pow( e_r - 1, 2.7 ) ) ) * Q_19;
745  Q_21 = fabs( 1.0
746  - 42.54 * pow( g, 0.133 ) * exp( -0.812 * g ) * pow( u, 2.5 )
747  / ( 1.0 + 0.033 * pow( u, 2.5 ) ) );
748 
749  r_e = pow( f_n / 28.843, 12 );
750  q_e = 0.016 + pow( 0.0514 * e_r * Q_21, 4.524 );
751  p_e = 4.766 * exp( -3.228 * pow( u, 0.641 ) );
752  d_e = 5.086 * q_e * ( r_e / ( 0.3838 + 0.386 * q_e ) )
753  * ( exp( -22.2 * pow( u, 1.92 ) ) / ( 1.0 + 1.2992 * r_e ) )
754  * ( pow( e_r - 1.0, 6.0 ) / ( 1.0 + 10 * pow( e_r - 1.0, 6.0 ) ) );
755  C_e = 1.0
756  + 1.275
757  * ( 1.0
758  - exp( -0.004625 * p_e * pow( e_r, 1.674 )
759  * pow( f_n / 18.365, 2.745 ) ) )
760  - Q_12 + Q_16 - Q_17 + Q_18 + Q_20;
761 
762 
763  R_1 = 0.03891 * pow( e_r, 1.4 );
764  R_2 = 0.267 * pow( u, 7.0 );
765  R_7 = 1.206 - 0.3144 * exp( -R_1 ) * ( 1.0 - exp( -R_2 ) );
766  R_10 = 0.00044 * pow( e_r, 2.136 ) + 0.0184;
767  tmpf = pow( f_n / 19.47, 6.0 );
768  R_11 = tmpf / ( 1.0 + 0.0962 * tmpf );
769  R_12 = 1.0 / ( 1.0 + 0.00245 * u * u );
770  R_15 = 0.707 * R_10 * pow( f_n / 12.3, 1.097 );
771  R_16 = 1.0 + 0.0503 * e_r * e_r * R_11 * ( 1.0 - exp( -pow( u / 15.0, 6.0 ) ) );
772  Q_0 = R_7 * ( 1.0 - 1.1241 * ( R_12 / R_16 ) * exp( -0.026 * pow( f_n, 1.15656 ) - R_15 ) );
773 
774  /* even-mode frequency-dependent characteristic impedances */
775  m_parameters[Z0_E_PRM] = Z0_e_0 * pow( 0.9408 * pow( e_r_eff_single_f, C_e ) - 0.9603, Q_0 )
776  / pow( ( 0.9408 - d_e ) * pow( e_r_eff_single_0, C_e ) - 0.9603, Q_0 );
777 
778  Q_29 = 15.16 / ( 1.0 + 0.196 * pow( e_r - 1.0, 2.0 ) );
779  tmpf = pow( e_r - 1.0, 3.0 );
780  Q_28 = 0.149 * tmpf / ( 94.5 + 0.038 * tmpf );
781  tmpf = pow( e_r - 1.0, 1.5 );
782  Q_27 = 0.4 * pow( g, 0.84 ) * ( 1.0 + 2.5 * tmpf / ( 5.0 + tmpf ) );
783  tmpf = pow( ( e_r - 1.0 ) / 13.0, 12.0 );
784  Q_26 = 30.0 - 22.2 * ( tmpf / ( 1.0 + 3.0 * tmpf ) ) - Q_29;
785  tmpf = ( e_r - 1.0 ) * ( e_r - 1.0 );
786  Q_25 = ( 0.3 * f_n * f_n / ( 10.0 + f_n * f_n ) ) * ( 1.0 + 2.333 * tmpf / ( 5.0 + tmpf ) );
787  Q_24 = 2.506 * Q_28 * pow( u, 0.894 ) * pow( ( 1.0 + 1.3 * u ) * f_n / 99.25, 4.29 )
788  / ( 3.575 + pow( u, 0.894 ) );
789  Q_23 = 1.0
790  + 0.005 * f_n * Q_27
791  / ( ( 1.0 + 0.812 * pow( f_n / 15.0, 1.9 ) ) * ( 1.0 + 0.025 * u * u ) );
792  Q_22 = 0.925 * pow( f_n / Q_26, 1.536 ) / ( 1.0 + 0.3 * pow( f_n / 30.0, 1.536 ) );
793 
794  /* odd-mode frequency-dependent characteristic impedances */
796  Z0_single_f
797  + ( Z0_o_0 * pow( e_r_eff_o_f / e_r_eff_o_0, Q_22 ) - Z0_single_f * Q_23 )
798  / ( 1.0 + Q_24 + pow( 0.46 * g, 2.2 ) * Q_25 );
799 }
double er_eff_o
Definition: c_microstrip.h:56
double er_eff_o_0
Definition: c_microstrip.h:58
double er_eff_0
Definition: microstrip.h:48
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
MICROSTRIP * aux_ms
Definition: c_microstrip.h:94
double Z0_e_0
Definition: c_microstrip.h:47
double er_eff
Definition: microstrip.h:49
double Z0_o_0
Definition: c_microstrip.h:48

References aux_ms, EPSILONR_PRM, MICROSTRIP::er_eff, MICROSTRIP::er_eff_0, er_eff_o, er_eff_o_0, FREQUENCY_PRM, H_PRM, TRANSLINE::m_parameters, PHYS_S_PRM, PHYS_WIDTH_PRM, Z0_e_0, Z0_E_PRM, Z0_o_0, Z0_O_PRM, and Z0_PRM.

Referenced by calcAnalyze().

◆ Z0_even_odd()

void C_MICROSTRIP::Z0_even_odd ( )
private

Z0_even_odd() - compute the static even- and odd-mode static impedances.

References: Manfred Kirschning and Rolf Jansen, "Accurate Wide-Range Design Equations for the Frequency-Dependent Characteristic of Parallel Coupled Microstrip Lines", IEEE Trans. MTT, vol. 32, no. 1, Jan. 1984

Definition at line 386 of file c_microstrip.cpp.

387 {
388  double er_eff, h2, u_t_e, u_t_o, g, h2h;
389  double Q_1, Q_2, Q_3, Q_4, Q_5, Q_6, Q_7, Q_8, Q_9, Q_10;
390  double delta_Z0_e_0, delta_Z0_o_0, Z0_single, er_eff_single;
391 
392  h2 = m_parameters[H_T_PRM];
393  u_t_e = w_t_e / m_parameters[H_PRM]; /* normalized even-mode line width */
394  u_t_o = w_t_o / m_parameters[H_PRM]; /* normalized odd-mode line width */
395  g = m_parameters[PHYS_S_PRM] / m_parameters[H_PRM]; /* normalized line spacing */
396  h2h = h2 / m_parameters[H_PRM]; /* normalized cover height */
397 
398  Z0_single = aux_ms->Z0_0;
399  er_eff_single = aux_ms->er_eff_0;
400 
401  /* even-mode */
402  er_eff = er_eff_e_0;
403  Q_1 = 0.8695 * pow( u_t_e, 0.194 );
404  Q_2 = 1.0 + 0.7519 * g + 0.189 * pow( g, 2.31 );
405  Q_3 = 0.1975 + pow( ( 16.6 + pow( ( 8.4 / g ), 6.0 ) ), -0.387 )
406  + log( pow( g, 10.0 ) / ( 1.0 + pow( g / 3.4, 10.0 ) ) ) / 241.0;
407  Q_4 = 2.0 * Q_1
408  / ( Q_2 * ( exp( -g ) * pow( u_t_e, Q_3 ) + ( 2.0 - exp( -g ) ) * pow( u_t_e, -Q_3 ) ) );
409  /* static even-mode impedance */
410  Z0_e_0 = Z0_single * sqrt( er_eff_single / er_eff )
411  / ( 1.0 - sqrt( er_eff_single ) * Q_4 * Z0_single / ZF0 );
412  /* correction for cover */
413  delta_Z0_e_0 = delta_Z0_even_cover( g, u_t_e, h2h ) / sqrt( er_eff );
414 
415  Z0_e_0 = Z0_e_0 - delta_Z0_e_0;
416 
417  /* odd-mode */
418  er_eff = er_eff_o_0;
419  Q_5 = 1.794 + 1.14 * log( 1.0 + 0.638 / ( g + 0.517 * pow( g, 2.43 ) ) );
420  Q_6 = 0.2305 + log( pow( g, 10.0 ) / ( 1.0 + pow( g / 5.8, 10.0 ) ) ) / 281.3
421  + log( 1.0 + 0.598 * pow( g, 1.154 ) ) / 5.1;
422  Q_7 = ( 10.0 + 190.0 * g * g ) / ( 1.0 + 82.3 * g * g * g );
423  Q_8 = exp( -6.5 - 0.95 * log( g ) - pow( g / 0.15, 5.0 ) );
424  Q_9 = log( Q_7 ) * ( Q_8 + 1.0 / 16.5 );
425  Q_10 = ( Q_2 * Q_4 - Q_5 * exp( log( u_t_o ) * Q_6 * pow( u_t_o, -Q_9 ) ) ) / Q_2;
426 
427  /* static odd-mode impedance */
428  Z0_o_0 = Z0_single * sqrt( er_eff_single / er_eff )
429  / ( 1.0 - sqrt( er_eff_single ) * Q_10 * Z0_single / ZF0 );
430  /* correction for cover */
431  delta_Z0_o_0 = delta_Z0_odd_cover( g, u_t_o, h2h ) / sqrt( er_eff );
432 
433  Z0_o_0 = Z0_o_0 - delta_Z0_o_0;
434 }
double er_eff_o_0
Definition: c_microstrip.h:58
double w_t_e
Definition: c_microstrip.h:43
double er_eff
Definition: transline.h:122
double Z0_0
Definition: microstrip.h:45
#define ZF0
Definition: units.h:63
double er_eff_0
Definition: microstrip.h:48
double m_parameters[EXTRA_PRMS_COUNT]
Definition: transline.h:120
MICROSTRIP * aux_ms
Definition: c_microstrip.h:94
double delta_Z0_odd_cover(double, double, double)
delta_Z0_odd_cover() - compute the odd-mode impedance correction for a homogeneous microstrip due to ...
double delta_Z0_even_cover(double, double, double)
delta_Z0_even_cover() - compute the even-mode impedance correction for a homogeneous microstrip due t...
double Z0_e_0
Definition: c_microstrip.h:47
double er_eff_e_0
Definition: c_microstrip.h:57
double w_t_o
Definition: c_microstrip.h:44
double Z0_o_0
Definition: c_microstrip.h:48

References aux_ms, delta_Z0_even_cover(), delta_Z0_odd_cover(), TRANSLINE::er_eff, MICROSTRIP::er_eff_0, er_eff_e_0, er_eff_o_0, H_PRM, H_T_PRM, TRANSLINE::m_parameters, PHYS_S_PRM, w_t_e, w_t_o, MICROSTRIP::Z0_0, Z0_e_0, Z0_o_0, and ZF0.

Referenced by calcAnalyze().

Member Data Documentation

◆ ang_l

double TRANSLINE::ang_l
protectedinherited

Definition at line 123 of file transline.h.

Referenced by TRANSLINE::TRANSLINE().

◆ ang_l_e

double C_MICROSTRIP::ang_l_e
private

Definition at line 53 of file c_microstrip.h.

Referenced by calcSynthesize(), line_angle(), and showAnalyze().

◆ ang_l_o

double C_MICROSTRIP::ang_l_o
private

Definition at line 54 of file c_microstrip.h.

Referenced by calcSynthesize(), line_angle(), and showAnalyze().

◆ atten_cond_e

double C_MICROSTRIP::atten_cond_e
private

Definition at line 61 of file c_microstrip.h.

Referenced by conductor_losses(), and show_results().

◆ atten_cond_o

double C_MICROSTRIP::atten_cond_o
private

Definition at line 63 of file c_microstrip.h.

Referenced by conductor_losses(), and show_results().

◆ atten_dielectric_e

double C_MICROSTRIP::atten_dielectric_e
private

Definition at line 60 of file c_microstrip.h.

Referenced by dielectric_losses(), and show_results().

◆ atten_dielectric_o

double C_MICROSTRIP::atten_dielectric_o
private

Definition at line 62 of file c_microstrip.h.

Referenced by dielectric_losses(), and show_results().

◆ aux_ms

MICROSTRIP* C_MICROSTRIP::aux_ms
private

◆ c_e

double C_MICROSTRIP::c_e
private

Definition at line 51 of file c_microstrip.h.

◆ c_o

double C_MICROSTRIP::c_o
private

Definition at line 52 of file c_microstrip.h.

◆ er_eff

double TRANSLINE::er_eff
protectedinherited

Definition at line 122 of file transline.h.

Referenced by er_eff_freq(), TRANSLINE::TRANSLINE(), and Z0_even_odd().

◆ er_eff_e

double C_MICROSTRIP::er_eff_e
private

Definition at line 55 of file c_microstrip.h.

Referenced by calcSynthesize(), er_eff_freq(), line_angle(), and show_results().

◆ er_eff_e_0

double C_MICROSTRIP::er_eff_e_0
private

◆ er_eff_o

double C_MICROSTRIP::er_eff_o
private

Definition at line 56 of file c_microstrip.h.

Referenced by calcSynthesize(), er_eff_freq(), line_angle(), show_results(), and Z0_dispersion().

◆ er_eff_o_0

double C_MICROSTRIP::er_eff_o_0
private

◆ errCol

KIGFX::COLOR4D TRANSLINE::errCol = KIGFX::COLOR4D( 1, 0.63, 0.63, 1 )
inherited

Definition at line 115 of file transline.h.

Referenced by TRANSLINE::setErrorLevel().

◆ h

double C_MICROSTRIP::h
private

Definition at line 38 of file c_microstrip.h.

◆ ht

double C_MICROSTRIP::ht
private

Definition at line 39 of file c_microstrip.h.

◆ l

double C_MICROSTRIP::l
private

Definition at line 45 of file c_microstrip.h.

◆ len

double TRANSLINE::len
protectedinherited

Definition at line 121 of file transline.h.

Referenced by TRANSLINE::TRANSLINE().

◆ m_Name

◆ m_parameters

double TRANSLINE::m_parameters[EXTRA_PRMS_COUNT]
protectedinherited

Definition at line 120 of file transline.h.

Referenced by RECTWAVEGUIDE::alphac(), COAX::alphac_coax(), RECTWAVEGUIDE::alphad(), COAX::alphad_coax(), attenuation(), MICROSTRIP::attenuation(), TWISTEDPAIR::calcAnalyze(), COAX::calcAnalyze(), STRIPLINE::calcAnalyze(), COPLANAR::calcAnalyze(), RECTWAVEGUIDE::calcAnalyze(), TWISTEDPAIR::calcSynthesize(), COPLANAR::calcSynthesize(), COAX::calcSynthesize(), STRIPLINE::calcSynthesize(), RECTWAVEGUIDE::calcSynthesize(), calcSynthesize(), MICROSTRIP::calcSynthesize(), TRANSLINE::checkProperties(), compute_single_line(), MICROSTRIP::conductor_losses(), conductor_losses(), delta_u_thickness(), MICROSTRIP::dielectric_losses(), dielectric_losses(), MICROSTRIP::dispersion(), er_eff_freq(), er_eff_static(), RECTWAVEGUIDE::fc(), RECTWAVEGUIDE::get_rectwaveguide_comp(), RECTWAVEGUIDE::get_rectwaveguide_elec(), RECTWAVEGUIDE::get_rectwaveguide_phys(), RECTWAVEGUIDE::get_rectwaveguide_sub(), TRANSLINE::getProperties(), TRANSLINE::Init(), RECTWAVEGUIDE::kc_square(), RECTWAVEGUIDE::kval_square(), line_angle(), MICROSTRIP::line_angle(), STRIPLINE::lineImpedance(), MICROSTRIP::microstrip_Z0(), TRANSLINE::minimizeZ0Error1D(), MICROSTRIP::mur_eff_ms(), TWISTEDPAIR::show_results(), STRIPLINE::show_results(), COAX::show_results(), COPLANAR::show_results(), RECTWAVEGUIDE::show_results(), MICROSTRIP::show_results(), show_results(), TWISTEDPAIR::showAnalyze(), COAX::showAnalyze(), STRIPLINE::showAnalyze(), COPLANAR::showAnalyze(), RECTWAVEGUIDE::showAnalyze(), MICROSTRIP::showAnalyze(), showAnalyze(), STRIPLINE::showSynthesize(), TWISTEDPAIR::showSynthesize(), COAX::showSynthesize(), COPLANAR::showSynthesize(), RECTWAVEGUIDE::showSynthesize(), MICROSTRIP::showSynthesize(), showSynthesize(), TRANSLINE::skin_depth(), syn_fun(), MICROSTRIP::synth_width(), synth_width(), TRANSLINE::TRANSLINE(), Z0_dispersion(), and Z0_even_odd().

◆ okCol

KIGFX::COLOR4D TRANSLINE::okCol = KIGFX::COLOR4D( 1, 1, 1, 1 )
inherited

Definition at line 117 of file transline.h.

Referenced by TRANSLINE::Init(), and TRANSLINE::setErrorLevel().

◆ rough

double C_MICROSTRIP::rough
private

Definition at line 41 of file c_microstrip.h.

◆ s

double C_MICROSTRIP::s
private

Definition at line 46 of file c_microstrip.h.

◆ t

double C_MICROSTRIP::t
private

Definition at line 40 of file c_microstrip.h.

◆ w

double C_MICROSTRIP::w
private

Definition at line 42 of file c_microstrip.h.

◆ w_eff

double C_MICROSTRIP::w_eff
private

Definition at line 59 of file c_microstrip.h.

◆ w_t_e

double C_MICROSTRIP::w_t_e
private

Definition at line 43 of file c_microstrip.h.

Referenced by delta_u_thickness(), er_eff_static(), and Z0_even_odd().

◆ w_t_o

double C_MICROSTRIP::w_t_o
private

Definition at line 44 of file c_microstrip.h.

Referenced by delta_u_thickness(), er_eff_static(), and Z0_even_odd().

◆ warnCol

KIGFX::COLOR4D TRANSLINE::warnCol = KIGFX::COLOR4D( 1, 1, 0.57, 1 )
inherited

Definition at line 116 of file transline.h.

Referenced by TRANSLINE::setErrorLevel().

◆ Z0_e_0

double C_MICROSTRIP::Z0_e_0
private

Definition at line 47 of file c_microstrip.h.

Referenced by conductor_losses(), Z0_dispersion(), and Z0_even_odd().

◆ Z0_o_0

double C_MICROSTRIP::Z0_o_0
private

Definition at line 48 of file c_microstrip.h.

Referenced by conductor_losses(), Z0_dispersion(), and Z0_even_odd().

◆ Z0e

double C_MICROSTRIP::Z0e
private

Definition at line 49 of file c_microstrip.h.

◆ Z0o

double C_MICROSTRIP::Z0o
private

Definition at line 50 of file c_microstrip.h.


The documentation for this class was generated from the following files: