LibreVNA/Software/PC_Application/Calibration/calstandard.h

148 lines
3.3 KiB
C++

#ifndef CALSTANDARD_H
#define CALSTANDARD_H
#include "savable.h"
#include "touchstone.h"
#include "Tools/parameters.h"
#include <complex>
namespace CalStandard
{
class Virtual : public Savable
{
public:
Virtual() :
minFreq(std::numeric_limits<double>::lowest()),
maxFreq(std::numeric_limits<double>::max()){}
enum class Type {
Open,
Short,
Load,
Through,
Line,
Last
};
static Virtual* create(Type type);
static QString TypeToString(Type type);
static Type TypeFromString(QString s);
virtual Type getType() = 0;
double minFrequency() {return minFreq;}
double maxFrequency() {return maxFreq;}
virtual void edit() = 0;
virtual QString getDescription();
virtual nlohmann::json toJSON() override;
virtual void fromJSON(nlohmann::json j) override;
protected:
QString name;
double minFreq;
double maxFreq;
};
class OnePort : public Virtual
{
public:
OnePort() :
touchstone(nullptr){}
virtual std::complex<double> toS11(double freq) = 0;
void setMeasurement(const Touchstone &ts, int port = 0);
void clearMeasurement();
virtual nlohmann::json toJSON() override;
virtual void fromJSON(nlohmann::json j) override;
protected:
std::complex<double> addTransmissionLine(std::complex<double> termination_reflection,
double offset_impedance, double offset_delay,
double offset_loss, double frequency);
Touchstone *touchstone;
};
class Open : public OnePort
{
public:
Open();
virtual std::complex<double> toS11(double freq) override;
virtual void edit() override;
virtual Type getType() override {return Type::Open;}
virtual nlohmann::json toJSON() override;
virtual void fromJSON(nlohmann::json j) override;
private:
double Z0, delay, loss, C0, C1, C2, C3;
};
class Short : public OnePort
{
public:
Short();
virtual std::complex<double> toS11(double freq) override;
virtual void edit() override;
virtual Type getType() override {return Type::Short;}
virtual nlohmann::json toJSON() override;
virtual void fromJSON(nlohmann::json j) override;
private:
double Z0, delay, loss, L0, L1, L2, L3;
};
class Load : public OnePort
{
public:
Load();
virtual std::complex<double> toS11(double freq) override;
virtual void edit() override;
virtual Type getType() override {return Type::Load;}
virtual nlohmann::json toJSON() override;
virtual void fromJSON(nlohmann::json j) override;
private:
double Z0, delay, resistance, Cparallel, Lseries;
bool Cfirst;
};
class TwoPort : public Virtual
{
public:
TwoPort() :
touchstone(nullptr){}
virtual Sparam toSparam(double freq) = 0;
void setMeasurement(const Touchstone &ts, int port1 = 0, int port2 = 1);
void clearMeasurement();
virtual nlohmann::json toJSON() override;
virtual void fromJSON(nlohmann::json j) override;
protected:
Touchstone *touchstone;
};
class Through : public TwoPort
{
public:
Through();
virtual Sparam toSparam(double freq) override;
virtual Type getType() override {return Type::Through;}
virtual nlohmann::json toJSON() override;
virtual void fromJSON(nlohmann::json j) override;
private:
double Z0, delay, loss;
};
}
#endif // CALSTANDARD_H