68 ComponentType_SPAR type;
71 QMap<QString, double> value;
72 QMap<QString, Complex> Zvalue;
73 vector<vector<Complex>> Smatrix;
76 QMap<QString, QList<double>> freqDepData;
80 double referenceImpedance;
82 Component_SPAR(ComponentType_SPAR t,
const string& n,
const vector<int>& nds,
83 const vector<vector<Complex>>& S,
int rfPorts,
85 : type(t), name(n), nodes(nds), Smatrix(S), frequency(0.0),
86 numRFPorts(rfPorts), referenceImpedance(Z0) {}
88 Component_SPAR(ComponentType_SPAR t,
const string& n,
const vector<int>& nds,
89 QMap<QString, QList<double>> freqData,
int rfPorts,
91 : type(t), name(n), nodes(nds), frequency(0.0), freqDepData(freqData),
92 numRFPorts(rfPorts), referenceImpedance(Z0) {}
94 Component_SPAR(ComponentType_SPAR t,
const string& n,
const vector<int>& nds,
95 QMap<QString, double> val);
97 ComponentType_SPAR t,
const string& n,
const vector<int>& nds,
98 QMap<QString, Complex> zval);
99 Component_SPAR(ComponentType_SPAR t,
const string& n,
const vector<int>& nds,
100 const vector<vector<Complex>>& S)
101 : type(t), name(n), nodes(nds), Smatrix(S), frequency(0.0) {
105 Component_SPAR(ComponentType_SPAR t,
const string& n,
const vector<int>& nds,
106 QMap<QString, QList<double>> freqData)
107 : type(t), name(n), nodes(nds), frequency(0.0), freqDepData(freqData) {}
120 vector<Component_SPAR> components;
124 QString currentNetlist;
127 vector<vector<Complex>> createMatrix(
int rows,
int cols);
128 vector<vector<Complex>> invertMatrix(
const vector<vector<Complex>>& matrix);
130 vector<vector<Complex>> buildAdmittanceMatrix();
133 void addCoupledLineToAdmittance(vector<vector<Complex>>& Y,
135 vector<vector<Complex>> calculateCoupledLineYMatrix(
double Z0e,
double Z0o,
140 void addIdealCouplerToAdmittance(vector<vector<Complex>>& Y,
142 vector<vector<Complex>>
143 calculateIdealCouplerYMatrix(
double k,
double phase_deg,
double Z0);
146 void addTransmissionLineToAdmittance(vector<vector<Complex>>& Y,
150 vector<vector<Complex>>
151 interpolateFrequencyDependentSMatrix(
const Component_SPAR& comp,
double freq);
152 vector<vector<Complex>> extractSMatrixAtIndex(
const Component_SPAR& comp,
154 void addFrequencyDependentSParamBlockToAdmittance(vector<vector<Complex>>& Y,
156 vector<vector<Complex>> parseInlineSMatrix(
const QString& matrixStr,
158 void addOnePortSParamToAdmittance(vector<vector<Complex>>& Y,
160 void addTwoPortSParamToAdmittance(vector<vector<Complex>>& Y,
162 void addSParameterDevice(
const string& name,
const vector<int>& nodes,
163 const vector<vector<Complex>>& Smatrix,
164 int numRFPorts,
double Z0);
168 void addMicrostripLineToAdmittance(vector<vector<Complex>>& Y,
170 void calcMicrostripPropagation(
double W,
double h,
double er,
171 double t,
double tand,
double rho,
172 double frequency,
double& alpha,
double& beta,
173 double& zl,
double& ereff);
174 void analyseQuasiStatic(
double W,
double h,
double t,
double er,
175 const string& Model,
double& ZlEff,
double& ErEff,
177 void analyseDispersion(
double W,
double h,
double er,
double ZlEff,
178 double ErEff,
double frequency,
const string& Model,
179 double& ZlEffFreq,
double& ErEffFreq);
180 void analyseLoss(
double W,
double t,
double er,
double rho,
double D,
181 double tand,
double ZlEff1,
double ZlEff2,
double ErEff,
182 double frequency,
const string& Model,
double& ac,
186 void Hammerstad_ab(
double u,
double er,
double& a,
double& b);
187 void Hammerstad_er(
double u,
double er,
double a,
double b,
double& e);
188 void Hammerstad_zl(
double u,
double& zl);
189 void Kirschning_er(
double u,
double fn,
double er,
double ErEff,
double& ErEffFreq);
190 void Kirschning_zl(
double ErEff,
double ErEffFreq,
double ZlEff,
double& r17,
double& ZlEffFreq);
191 void Getsinger_disp(
double h,
double er,
double ErEff,
double ZlEff,
192 double frequency,
double& e,
double& z);
197 void addMicrostripStepToAdmittance(vector<vector<Complex>>& Y,
199 void calcMicrostripStepZ(
double W1,
double W2,
double h,
double er,
double t,
200 double frequency,
const string& SModel,
201 const string& DModel, Complex& z11, Complex& z12,
202 Complex& z21, Complex& z22);
207 void addMicrostripOpenToAdmittance(vector<vector<Complex>>& Y,
209 Complex calcMicrostripOpenY(
double W,
double h,
double er,
double t,
210 double frequency,
const string& Model,
211 const string& SModel,
const string& DModel);
212 double calcMicrostripOpenCend(
double W,
double h,
double er,
double t,
213 double frequency,
const string& Model,
214 const string& SModel,
const string& DModel);
219 void addMicrostripViaToAdmittance(vector<vector<Complex>>& Y,
221 Complex calcMicrostripViaImpedance(
double D,
double h,
double t,
double rho,
223 double calcMicrostripViaResistance(
double D,
double h,
double t,
double rho);
228 void addMicrostripCoupledLinesToAdmittance(vector<vector<Complex>>& Y,
230 void calcMicrostripCoupledPropagation(
double W,
double S,
double h,
231 double er,
double t,
double tand,
232 double rho,
double frequency,
233 double& alpha_e,
double& beta_e,
234 double& zl_e,
double& ereff_e,
235 double& alpha_o,
double& beta_o,
236 double& zl_o,
double& ereff_o);
238 void analyseQuasiStaticCoupled(
double W,
double h,
double s,
double t,
239 double er,
const string& Model,
double& Zle,
240 double& Zlo,
double& ErEffe,
double& ErEffo);
242 void analyseDispersionCoupled(
double W,
double h,
double s,
double t,
243 double er,
double Zle,
double Zlo,
244 double ErEffe,
double ErEffo,
double frequency,
245 const string& DModel,
double& ZleFreq,
246 double& ZloFreq,
double& ErEffeFreq,
249 void analyseLossCoupled(
double W,
double S,
double t,
double er,
double rho,
250 double D,
double tand,
double ZlEff1,
double ZlEff2,
251 double ErEff,
double frequency,
const string& Model,
252 bool evenMode,
double& ac,
double& ad);
256 double f_start = 1e6;
261 std::vector<std::vector<std::vector<Complex>>> sweepResults;
262 QMap<QString, QList<double>> data;
264 double parseScaledValue(
const QString& input,
265 QString unit_type = QString(
""));
272 bool setNetlist(
const QString& netlist);
275 const QString& getNetlist()
const {
return currentNetlist; }
278 void addComponent(ComponentType_SPAR type,
const string& name,
279 const vector<int>& nodes, QMap<QString, double> value);
280 void addComponent(ComponentType_SPAR type,
const string& name,
281 const vector<int>& nodes, QMap<QString, Complex> Zvalue);
283 void addComponent(ComponentType_SPAR type,
const string& name,
284 const vector<int>& nodes,
285 QMap<QString, QList<double>> freqDepData);
288 void addPort(
int node,
double impedance = 50.0);
291 vector<vector<Complex>> calculateSParameters();
294 vector<vector<Complex>> convertS2Y(
const vector<vector<Complex>>& S,
296 void addSParamBlockToAdmittance(vector<vector<Complex>>& Y,
298 void addSParameterBlock(
const string& name,
const vector<int>& nodes,
299 const vector<vector<Complex>>& Smatrix);
302 void printSParameters(
const vector<vector<Complex>>& S);
305 void exportTouchstone(
const QString& filename,
306 const vector<vector<Complex>>& S);
312 int getNumNodes()
const {
return numNodes; }
313 size_t getNumComponents()
const {
return components.size(); }
314 size_t getNumPorts()
const {
return ports.size(); }
315 double getFrequency()
const {
return frequency; }
316 void setFrequency(
double freq) { frequency = freq; }
319 void setFrequencySweep(
double start,
double stop,
int points);
322 void calculateSParameterSweep();
325 void printSParameterSweep()
const;
328 void exportSweepTouchstone(
const QString& filename)
const;
329 QMap<QString, QList<double>> getData();