16
16
using namespace std ;
17
17
using namespace xaxaxa ;
18
18
19
+ const vector < array < double ,3 > > NetworkView ::defaultGraphLimits = {
20
+ {-1000 ,-999 , 12 },
21
+ {-80 , 30 , 11 }, //TYPE_MAG=1
22
+ {-180 , 180 , 12 }, //TYPE_PHASE
23
+ {0 , 50 , 10 }, //TYPE_GRPDELAY
24
+ {1 , 11 , 10 }, //TYPE_SWR
25
+ {0 , 200 , 10 }, //TYPE_Z_RE
26
+ {-200 , 200 , 10 }, //TYPE_Z_IM
27
+ {0 , 200 , 10 }, //TYPE_Z_MAG
28
+ {0 , 1000 , 10 }, //TYPE_Z_CAP
29
+ {0 , 1000 , 10 }, //TYPE_Z_IND
30
+ {0 , 1000 , 10 }, //TYPE_Y_RE
31
+ {-1000 , 1000 , 10 }, //TYPE_Y_IM
32
+ {0 , 1000 , 10 }, //TYPE_Y_MAG
33
+ {0 , 1000 , 10 }, //TYPE_Y_CAP
34
+ {0 , 1000 , 10 }, //TYPE_Y_IND
35
+ {-1000 ,-999 , 10 } //TYPE_COMPLEX
36
+ };
37
+
19
38
NetworkView ::NetworkView () {
20
39
xAxisValueStr = [](double val ) {
21
40
return to_string (val );
22
41
};
23
- graphLimits = {
24
- {-1000 ,-999 , 12 },
25
- {-80 , 30 , 11 }, //TYPE_MAG=1
26
- {-180 , 180 , 12 }, //TYPE_PHASE
27
- {0 , 50 , 10 }, //TYPE_GRPDELAY
28
- {1 , 11 , 10 }, //TYPE_SWR
29
- {-1000 ,-999 , 10 } //TYPE_COMPLEX
30
- };
42
+ graphLimits = NetworkView ::defaultGraphLimits ;
31
43
}
32
44
33
45
void NetworkView ::init (QLayout * sliderContainer ) {
@@ -55,12 +67,30 @@ GraphPanel* NetworkView::createGraphView(bool freqDomain, bool tr) {
55
67
case SParamViewSource ::TYPE_MAG : name = "mag" ; break ;
56
68
case SParamViewSource ::TYPE_PHASE : name = "arg" ; break ;
57
69
case SParamViewSource ::TYPE_SWR : name = "swr" ; break ;
70
+ case SParamViewSource ::TYPE_Z_RE : name = "Z_re" ; break ;
71
+ case SParamViewSource ::TYPE_Z_IM : name = "Z_im" ; break ;
72
+ case SParamViewSource ::TYPE_Z_MAG : name = "|Z|" ; break ;
73
+ case SParamViewSource ::TYPE_Z_CAP : name = "Cseries" ; break ;
74
+ case SParamViewSource ::TYPE_Z_IND : name = "Lseries" ; break ;
75
+ case SParamViewSource ::TYPE_Y_RE : name = "Y_re" ; break ;
76
+ case SParamViewSource ::TYPE_Y_IM : name = "Y_im" ; break ;
77
+ case SParamViewSource ::TYPE_Y_MAG : name = "|Y|" ; break ;
78
+ case SParamViewSource ::TYPE_Y_CAP : name = "Cparallel" ; break ;
79
+ case SParamViewSource ::TYPE_Y_IND : name = "Lparallel" ; break ;
58
80
}
59
81
for (int row = 0 ;row < 2 ;row ++ )
60
82
for (int col = 0 ;col < 2 ;col ++ ) {
61
83
if (tr && col == 1 ) continue ;
84
+
62
85
// group delay only makes sense in frequency domain view
63
86
if (!freqDomain && i == SParamViewSource ::TYPE_GRPDELAY ) continue ;
87
+
88
+ // impedance parameters only make sense for Snn, not Snm,
89
+ // and also only in frequency domain.
90
+ if (i >= SParamViewSource ::TYPE_Z_RE && i <= SParamViewSource ::TYPE_Y_IND ) {
91
+ if (row != col ) continue ;
92
+ if (!freqDomain ) continue ;
93
+ }
64
94
string desc = name + "(S" + to_string (row + 1 ) + to_string (col + 1 ) + ")" ;
65
95
graphTraces .push_back (desc );
66
96
graphSources .push_back ({row , col , SParamViewSource ::Types (i )});
@@ -116,6 +146,16 @@ void NetworkView::updateXAxis(double start, double step, int cnt) {
116
146
case SParamViewSource ::TYPE_SWR :
117
147
case SParamViewSource ::TYPE_PHASE :
118
148
case SParamViewSource ::TYPE_GRPDELAY :
149
+ case SParamViewSource ::TYPE_Z_RE :
150
+ case SParamViewSource ::TYPE_Z_IM :
151
+ case SParamViewSource ::TYPE_Z_MAG :
152
+ case SParamViewSource ::TYPE_Z_CAP :
153
+ case SParamViewSource ::TYPE_Z_IND :
154
+ case SParamViewSource ::TYPE_Y_RE :
155
+ case SParamViewSource ::TYPE_Y_IM :
156
+ case SParamViewSource ::TYPE_Y_MAG :
157
+ case SParamViewSource ::TYPE_Y_CAP :
158
+ case SParamViewSource ::TYPE_Y_IND :
119
159
{
120
160
auto* series = dynamic_cast < QLineSeries * > (tmp .view );
121
161
series -> clear ();
@@ -160,17 +200,19 @@ void NetworkView::updateView(int viewIndex, int freqIndex) {
160
200
}
161
201
return ;
162
202
}
203
+ double freqHz = xAxisAt (freqIndex )* 1e6 ; // only meaningful in frequency domain
163
204
SParamView tmp = this -> views .at (viewIndex );
164
205
165
206
VNACalibratedValue val = this -> values .at (freqIndex );
166
207
complex < double > entry = val (tmp .src .row ,tmp .src .col );
208
+ double z0 = 50 ;
209
+ complex < double > Z = - z0 * (entry + 1. )/(entry - 1. );
210
+ complex < double > Y = - (entry - 1. )/(z0 * (entry + 1. ));
167
211
168
- switch (tmp .src .type ) {
169
- case SParamViewSource ::TYPE_MAG :
170
- case SParamViewSource ::TYPE_SWR :
171
- case SParamViewSource ::TYPE_PHASE :
172
- case SParamViewSource ::TYPE_GRPDELAY :
173
- {
212
+ if (tmp .src .type == SParamViewSource ::TYPE_COMPLEX ) {
213
+ auto* view = dynamic_cast < PolarView * > (tmp .view );
214
+ view -> points .at (freqIndex ) = entry ;
215
+ } else {
174
216
auto* series = dynamic_cast < QLineSeries * > (tmp .view );
175
217
double y = 0 ;
176
218
switch (tmp .src .type ) {
@@ -183,6 +225,36 @@ void NetworkView::updateView(int viewIndex, int freqIndex) {
183
225
case SParamViewSource ::TYPE_PHASE :
184
226
y = arg (entry )* 180. /M_PI ;
185
227
break ;
228
+ case SParamViewSource ::TYPE_Z_RE :
229
+ y = Z .real ();
230
+ break ;
231
+ case SParamViewSource ::TYPE_Z_IM :
232
+ y = Z .imag ();
233
+ break ;
234
+ case SParamViewSource ::TYPE_Z_MAG :
235
+ y = abs (Z );
236
+ break ;
237
+ case SParamViewSource ::TYPE_Z_CAP : // capacitance in pF
238
+ y = - capacitance_inductance (freqHz , Z .imag ()) * 1e12 ;
239
+ break ;
240
+ case SParamViewSource ::TYPE_Z_IND : // inductance in nH
241
+ y = capacitance_inductance (freqHz , Z .imag ()) * 1e9 ;
242
+ break ;
243
+ case SParamViewSource ::TYPE_Y_RE :
244
+ y = Y .real () * 1000 ;
245
+ break ;
246
+ case SParamViewSource ::TYPE_Y_IM :
247
+ y = Y .imag () * 1000 ;
248
+ break ;
249
+ case SParamViewSource ::TYPE_Y_MAG :
250
+ y = abs (Y ) * 1000 ;
251
+ break ;
252
+ case SParamViewSource ::TYPE_Y_CAP : // capacitance in pF
253
+ y = - capacitance_inductance_Y (freqHz , Y .imag ()) * 1e12 ;
254
+ break ;
255
+ case SParamViewSource ::TYPE_Y_IND : // inductance in nH
256
+ y = capacitance_inductance_Y (freqHz , Y .imag ()) * 1e9 ;
257
+ break ;
186
258
case SParamViewSource ::TYPE_GRPDELAY :
187
259
{
188
260
if (freqIndex > 0 ) {
@@ -197,16 +269,26 @@ void NetworkView::updateView(int viewIndex, int freqIndex) {
197
269
}
198
270
default : assert (false);
199
271
}
272
+
273
+ // clamp values to avoid enlarging labels
274
+ switch (tmp .src .type ) {
275
+ case SParamViewSource ::TYPE_Z_CAP :
276
+ case SParamViewSource ::TYPE_Z_IND :
277
+ case SParamViewSource ::TYPE_Y_CAP :
278
+ case SParamViewSource ::TYPE_Y_IND :
279
+ if (y < 0 ) y = 0 ;
280
+ if (y > 999 ) y = 999 ;
281
+ break ;
282
+ case SParamViewSource ::TYPE_Z_RE :
283
+ case SParamViewSource ::TYPE_Z_IM :
284
+ case SParamViewSource ::TYPE_Z_MAG :
285
+ if (y < -999 ) y = -999 ;
286
+ if (y > 999 ) y = 999 ;
287
+ break ;
288
+ default : break ;
289
+ }
290
+
200
291
series -> replace (freqIndex ,series -> at (freqIndex ).x (), y );
201
- break ;
202
- }
203
- case SParamViewSource ::TYPE_COMPLEX :
204
- {
205
- auto* view = dynamic_cast < PolarView * > (tmp .view );
206
- view -> points .at (freqIndex ) = entry ;
207
- break ;
208
- }
209
- default : assert (false);
210
292
}
211
293
}
212
294
@@ -262,6 +344,16 @@ void NetworkView::updateBottomLabels(int marker) {
262
344
case SParamViewSource ::TYPE_SWR : fmt = "%.2lf:1" ; break ;
263
345
case SParamViewSource ::TYPE_PHASE : fmt = "%.1lf °" ; break ;
264
346
case SParamViewSource ::TYPE_GRPDELAY : fmt = "%.2lf ns" ; break ;
347
+ case SParamViewSource ::TYPE_Z_RE : fmt = "%.1lf Ω" ; break ;
348
+ case SParamViewSource ::TYPE_Z_IM : fmt = "%.1lf Ω" ; break ;
349
+ case SParamViewSource ::TYPE_Z_MAG : fmt = "%.1lf Ω" ; break ;
350
+ case SParamViewSource ::TYPE_Z_CAP : fmt = "%.1lf pF" ; break ;
351
+ case SParamViewSource ::TYPE_Z_IND : fmt = "%.2lf nH" ; break ;
352
+ case SParamViewSource ::TYPE_Y_RE : fmt = "%.1lf mS" ; break ;
353
+ case SParamViewSource ::TYPE_Y_IM : fmt = "%.1lf mS" ; break ;
354
+ case SParamViewSource ::TYPE_Y_MAG : fmt = "%.1lf mS" ; break ;
355
+ case SParamViewSource ::TYPE_Y_CAP : fmt = "%.1lf pF" ; break ;
356
+ case SParamViewSource ::TYPE_Y_IND : fmt = "%.2lf nH" ; break ;
265
357
default : fmt = "%.2lf" ;
266
358
}
267
359
marker .ms -> setLabelText (j , ssprintf (32 , fmt , series -> at (marker .freqIndex ).y ()));
0 commit comments