8#ifndef SPARAMETERCALCULATOR_H
9#define SPARAMETERCALCULATOR_H
14#include <QRegularExpression>
33using Complex = complex<double>;
50 FREQUENCY_DEPENDENT_SPAR_BLOCK,
55 MICROSTRIP_COUPLED_LINES
75 const vector<vector<Complex>>& S,
int rfPorts,
82 QMap<QString, QList<double>> freqData,
int rfPorts,
89 QMap<QString, double> val)
94 QMap<QString, Complex> zval)
99 const vector<vector<Complex>>& S)
104 QMap<QString, QList<double>> freqData)
131 vector<Component_SPAR> components;
135 QString currentNetlist;
143 vector<vector<Complex>> createMatrix(
int rows,
int cols) {
144 return vector<vector<Complex>>(rows, vector<Complex>(cols, Complex(0, 0)));
152 vector<vector<Complex>> invertMatrix(
const vector<vector<Complex>>& matrix);
162 vector<vector<Complex>> buildAdmittanceMatrix();
167 void addCoupledLineToAdmittance(vector<vector<Complex>>& Y,
176 vector<vector<Complex>> calculateCoupledLineYMatrix(
double Z0e,
double Z0o,
183 void addIdealCouplerToAdmittance(vector<vector<Complex>>& Y,
191 vector<vector<Complex>>
192 calculateIdealCouplerYMatrix(
double k,
double phase_deg,
double Z0);
198 void addTransmissionLineToAdmittance(vector<vector<Complex>>& Y,
206 vector<vector<Complex>>
207 interpolateFrequencyDependentSMatrix(
const Component_SPAR& comp,
double freq);
215 vector<vector<Complex>> extractSMatrixAtIndex(
const Component_SPAR& comp,
223 void addFrequencyDependentSParamBlockToAdmittance(vector<vector<Complex>>& Y,
230 vector<vector<Complex>> parseInlineSMatrix(
const QString& matrixStr,
236 void addOnePortSParamToAdmittance(vector<vector<Complex>>& Y,
242 void addTwoPortSParamToAdmittance(vector<vector<Complex>>& Y,
251 void addSParameterDevice(
const string& name,
const vector<int>& nodes,
252 const vector<vector<Complex>>& Smatrix,
253 int numRFPorts,
double Z0);
261 void addMicrostripLineToAdmittance(vector<vector<Complex>>& Y,
276 void calcMicrostripPropagation(
double W,
double h,
double er,
277 double t,
double tand,
double rho,
278 double frequency,
double& alpha,
double& beta,
279 double& zl,
double& ereff);
290 void analyseQuasiStatic(
double W,
double h,
double t,
double er,
291 const string& Model,
double& ZlEff,
double& ErEff,
304 void analyseDispersion(
double W,
double h,
double er,
double ZlEff,
305 double ErEff,
double frequency,
const string& Model,
306 double& ZlEffFreq,
double& ErEffFreq);
322 void analyseLoss(
double W,
double t,
double er,
double rho,
double D,
323 double tand,
double ZlEff1,
double ZlEff2,
double ErEff,
324 double frequency,
const string& Model,
double& ac,
333 void Hammerstad_ab(
double u,
double er,
double& a,
double& b);
341 void Hammerstad_er(
double u,
double er,
double a,
double b,
double& e);
346 void Hammerstad_zl(
double u,
double& zl);
354 void Kirschning_er(
double u,
double fn,
double er,
double ErEff,
double& ErEffFreq);
362 void Kirschning_zl(
double ErEff,
double ErEffFreq,
double ZlEff,
double& r17,
double& ZlEffFreq);
371 void addMicrostripStepToAdmittance(vector<vector<Complex>>& Y,
373 void calcMicrostripStepZ(
double W1,
double W2,
double h,
double er,
double t,
374 double frequency,
const string& SModel,
375 const string& DModel, Complex& z11, Complex& z12,
376 Complex& z21, Complex& z22);
384 void addMicrostripOpenToAdmittance(vector<vector<Complex>>& Y,
397 Complex calcMicrostripOpenY(
double W,
double h,
double er,
double t,
398 double frequency,
const string& Model,
399 const string& SModel,
const string& DModel);
411 double calcMicrostripOpenCend(
double W,
double h,
double er,
double t,
412 double frequency,
const string& Model,
413 const string& SModel,
const string& DModel);
421 void addMicrostripViaToAdmittance(vector<vector<Complex>>& Y,
431 Complex calcMicrostripViaImpedance(
double D,
double h,
double t,
double rho,
440 double calcMicrostripViaResistance(
double D,
double h,
double t,
double rho);
448 void addMicrostripCoupledLinesToAdmittance(vector<vector<Complex>>& Y,
468 void calcMicrostripCoupledPropagation(
double W,
double S,
double h,
469 double er,
double t,
double tand,
470 double rho,
double frequency,
471 double& alpha_e,
double& beta_e,
472 double& zl_e,
double& ereff_e,
473 double& alpha_o,
double& beta_o,
474 double& zl_o,
double& ereff_o);
487 void analyseQuasiStaticCoupled(
double W,
double h,
double s,
double t,
488 double er,
const string& Model,
double& Zle,
489 double& Zlo,
double& ErEffe,
double& ErEffo);
507 void analyseDispersionCoupled(
double W,
double h,
double s,
double t,
508 double er,
double Zle,
double Zlo,
509 double ErEffe,
double ErEffo,
double frequency,
510 const string& DModel,
double& ZleFreq,
511 double& ZloFreq,
double& ErEffeFreq,
529 void analyseLossCoupled(
double W,
double t,
double er,
double rho,
530 double D,
double tand,
double ZlEff1,
double ZlEff2,
531 double ErEff,
double frequency,
const string& Model,
532 bool evenMode,
double& ac,
double& ad);
536 double f_start = 1e6;
541 std::vector<std::vector<std::vector<Complex>>> sweepResults;
542 QMap<QString, QList<double>> data;
548 double parseScaledValue(
const QString& input,
549 QString unit_type = QString(
""));
559 currentNetlist = netlist;
560 return parseNetlist();
568 const vector<int>& nodes, QMap<QString, double> value);
572 const vector<int>& nodes, QMap<QString, Complex> Zvalue);
576 const vector<int>& nodes,
577 QMap<QString, QList<double>> freqDepData);
582 void addPort(
int node,
double impedance = 50.0);
590 vector<vector<Complex>>
convertS2Y(
const vector<vector<Complex>>& S,
600 const vector<vector<Complex>>& Smatrix);
607 const vector<vector<Complex>>& S);
630 QMap<QString, QList<double>>
getData() {
return data; }
ComponentType_SPAR
Circuit component types supported in S-parameter analysis.
Definition SParameterCalculator.h:37
Calculates S-parameters using nodal analysis.
Definition SParameterCalculator.h:129
vector< vector< Complex > > calculateSParameters()
Calculates S-parameters at current frequency.
Definition SParameterCalculator.cpp:177
void exportSweepTouchstone(const QString &filename) const
Exports frequency sweep to Touchstone file.
Definition output.cpp:44
void addComponent(ComponentType_SPAR type, const string &name, const vector< int > &nodes, QMap< QString, double > value)
Adds lumped component with real-valued parameters.
Definition SParameterCalculator.cpp:159
void printSParameterSweep() const
Prints all S-parameters from stored sweep.
Definition output.cpp:102
void addPort(int node, double impedance=50.0)
Adds port to circuit.
Definition SParameterCalculator.cpp:173
void exportTouchstone(const QString &filename, const vector< vector< Complex > > &S)
Exports S-parameters to Touchstone file format.
Definition output.cpp:11
void printSParameters(const vector< vector< Complex > > &S)
Prints S-parameters in readable format to console.
Definition output.cpp:84
vector< vector< Complex > > convertS2Y(const vector< vector< Complex > > &S, double Z0)
Converts S-parameters to Y-parameters.
Definition SP_Component.cpp:12
size_t getNumComponents() const
Returns number of components in circuit.
Definition SParameterCalculator.h:621
QMap< QString, QList< double > > getData()
Returns formatted sweep data.
Definition SParameterCalculator.h:630
void addSParameterBlock(const string &name, const vector< int > &nodes, const vector< vector< Complex > > &Smatrix)
Adds S-parameter block component.
Definition SP_Component.cpp:215
SParameterCalculator()
Constructor.
Definition SParameterCalculator.h:553
void setFrequencySweep(double start, double stop, int points)
Configures frequency sweep parameters.
Definition SParameterCalculator.cpp:250
bool setNetlist(const QString &netlist)
Sets netlist and parses components.
Definition SParameterCalculator.h:558
const QString & getNetlist() const
Returns current netlist string.
Definition SParameterCalculator.h:564
size_t getNumPorts() const
Returns number of ports defined.
Definition SParameterCalculator.h:624
void calculateSParameterSweep()
Performs S-parameter calculation over frequency sweep.
Definition SParameterCalculator.cpp:257
void addSParamBlockToAdmittance(vector< vector< Complex > > &Y, const Component_SPAR &comp)
Adds S-parameter block to admittance matrix.
Definition SP_Component.cpp:45
double getFrequency() const
Returns current analysis frequency.
Definition SParameterCalculator.h:627
void setFrequency(double freq)
Sets current analysis frequency.
Definition SParameterCalculator.h:634
int getNumNodes() const
Returns total number of circuit nodes.
Definition SParameterCalculator.h:618
void clear()
Clears all components and ports.
Definition SParameterCalculator.h:610
Utility functions needed across the whole project.
Circuit component structure.
Definition SParameterCalculator.h:61
Component_SPAR(ComponentType_SPAR t, const string &n, const vector< int > &nds, QMap< QString, QList< double > > freqData)
Constructor for frequency-dependent impedance.
Definition SParameterCalculator.h:103
Component_SPAR(ComponentType_SPAR t, const string &n, const vector< int > &nds, const vector< vector< Complex > > &S, int rfPorts, double Z0=50.0)
Constructor for S-parameter network block with matrix.
Definition SParameterCalculator.h:74
int numRFPorts
Number of RF ports for network blocks.
Definition SParameterCalculator.h:70
QMap< QString, QList< double > > freqDepData
Frequency-dependent data tables.
Definition SParameterCalculator.h:69
Component_SPAR(ComponentType_SPAR t, const string &n, const vector< int > &nds, QMap< QString, double > val)
Constructor for lumped components with real parameters.
Definition SParameterCalculator.h:88
QMap< QString, Complex > Zvalue
Complex impedance values.
Definition SParameterCalculator.h:67
string name
Component name/label.
Definition SParameterCalculator.h:63
Component_SPAR(ComponentType_SPAR t, const string &n, const vector< int > &nds, QMap< QString, QList< double > > freqData, int rfPorts, double Z0=50.0)
Constructor for frequency-dependent S-parameter block.
Definition SParameterCalculator.h:81
double frequency
Operating frequency for frequency-dependent components.
Definition SParameterCalculator.h:65
ComponentType_SPAR type
Component type identifier.
Definition SParameterCalculator.h:62
double referenceImpedance
Reference impedance (typically 50Ω)
Definition SParameterCalculator.h:71
vector< vector< Complex > > Smatrix
S-parameter matrix for network blocks.
Definition SParameterCalculator.h:68
Component_SPAR(ComponentType_SPAR t, const string &n, const vector< int > &nds, QMap< QString, Complex > zval)
Constructor for complex impedance components.
Definition SParameterCalculator.h:93
Component_SPAR(ComponentType_SPAR t, const string &n, const vector< int > &nds, const vector< vector< Complex > > &S)
Constructor for S-parameter device without port count.
Definition SParameterCalculator.h:98
vector< int > nodes
Node connectivity list.
Definition SParameterCalculator.h:64
QMap< QString, double > value
Real-valued parameters (R, L, C, etc.)
Definition SParameterCalculator.h:66
Network port definition with node and impedance.
Definition SParameterCalculator.h:110
double impedance
Port characteristic impedance (typically 50Ω)
Definition SParameterCalculator.h:112
int node
Node number where port is connected.
Definition SParameterCalculator.h:111
Port(int n, double z=50.0)
Constructor with default 50Ω impedance.
Definition SParameterCalculator.h:117