#ifndef CALIBRATION_H #define CALIBRATION_H #include "Device/device.h" #include #include #include #include #include #include "calkit.h" #include "Traces/tracemodel.h" #include #include "calkit.h" class Calibration { public: Calibration(); enum class Measurement { Port1Open, Port1Short, Port1Load, Port2Open, Port2Short, Port2Load, Isolation, Through, Line, Last, }; enum class Standard { Open, Short, Load, Through, Any, }; static Standard getPort1Standard(Measurement m); static Standard getPort2Standard(Measurement m); void clearMeasurements(); void clearMeasurements(std::set types); void clearMeasurement(Measurement type); void addMeasurement(Measurement type, Protocol::Datapoint &d); void addMeasurements(std::set types, Protocol::Datapoint &d); enum class Type { Port1SOL, Port2SOL, FullSOLT, TransmissionNormalization, TRL, None, Last, }; bool calculationPossible(Type type); bool constructErrorTerms(Type type); void resetErrorTerms(); void correctMeasurement(Protocol::Datapoint &d); void correctTraces(Trace &S11, Trace &S12, Trace &S21, Trace &S22); enum class InterpolationType { Unchanged, // Nothing has changed, settings and calibration points match Exact, // Every frequency point in settings has an exact calibration point (but there are more calibration points outside of the sweep) Interpolate, // Every point in the sweep can be interpolated between two calibration points Extrapolate, // At least one point in sweep is outside of the calibration and has to be extrapolated NoCalibration, // No calibration available }; InterpolationType getInterpolation(double f_start, double f_stop, int points); static Measurement MeasurementFromString(QString s); static QString MeasurementToString(Measurement m); static Type TypeFromString(QString s); static QString TypeToString(Type t); class MeasurementInfo { public: QString name, prerequisites; double fmin, fmax; unsigned int points; QDateTime timestamp; }; static const std::vector Types(); const std::vector Measurements(Type type = Type::None, bool optional_included = true); MeasurementInfo getMeasurementInfo(Measurement m); friend std::ostream& operator<<(std::ostream& os, const Calibration& c); friend std::istream& operator >> (std::istream &in, Calibration& c); int nPoints() { return points.size(); } std::vector getErrorTermTraces(); std::vector getMeasurementTraces(); bool openFromFile(QString filename = QString()); bool saveToFile(QString filename = QString()); Type getType() const; Calkit& getCalibrationKit(); void setCalibrationKit(const Calkit &value); private: void construct12TermPoints(); void constructPort1SOL(); void constructPort2SOL(); void constructTransmissionNormalization(); void constructTRL(); bool SanityCheckSamples(const std::vector &requiredMeasurements); class Point { public: double frequency; // Forward error terms std::complex fe00, fe11, fe10e01, fe10e32, fe22, fe30; // Reverse error terms std::complex re33, re11, re23e32, re23e01, re22, re03; }; Point getCalibrationPoint(Protocol::Datapoint &d); /* * Constructs directivity, match and tracking correction factors from measurements of three distinct impedances * Normally, an open, short and load are used (with ideal reflection coefficients of 1, -1 and 0 respectively). * The actual reflection coefficients can be passed on as optional arguments to take into account the non-ideal * calibration kit. */ void computeSOL(std::complex s_m, std::complex o_m, std::complex l_m, std::complex &directivity, std::complex &match, std::complex &tracking, std::complex o_c = std::complex(1.0, 0), std::complex s_c = std::complex(-1.0, 0), std::complex l_c = std::complex(0, 0)); std::complex correctSOL(std::complex measured, std::complex directivity, std::complex match, std::complex tracking); class MeasurementData { public: QDateTime timestamp; std::vector datapoints; }; Type type; std::map measurements; double minFreq, maxFreq; std::vector points; Calkit kit; QString descriptiveCalName(); private: QString currentCalFile; public: QString getCurrentCalibrationFile(); double getMinFreq(); double getMaxFreq(); int getNumPoints(); }; #endif // CALIBRATION_H