add unit tests for lin/log calibration detection

This commit is contained in:
Jan Käberich 2025-07-19 13:38:49 +02:00
parent 8e917faed4
commit 2f256117db
5 changed files with 160 additions and 1 deletions

View file

@ -14,6 +14,7 @@ class Calibration : public QObject, public Savable, public SCPINode
Q_OBJECT Q_OBJECT
friend class LibreCALDialog; friend class LibreCALDialog;
friend class CalibrationTests;
public: public:
Calibration(); Calibration();
@ -130,7 +131,7 @@ private:
void createDefaultMeasurements(DefaultMeasurements dm); void createDefaultMeasurements(DefaultMeasurements dm);
void deleteMeasurements(); void deleteMeasurements();
bool hasFrequencyOverlap(std::vector<CalibrationMeasurement::Base*> m, double *startFreq = nullptr, double *stopFreq = nullptr, int *points = nullptr, bool *isLog = nullptr); static bool hasFrequencyOverlap(std::vector<CalibrationMeasurement::Base*> m, double *startFreq = nullptr, double *stopFreq = nullptr, int *points = nullptr, bool *isLog = nullptr);
// returns all measurements that match the paramaters // returns all measurements that match the paramaters
std::vector<CalibrationMeasurement::Base*> findMeasurements(CalibrationMeasurement::Base::Type type, int port1 = 0, int port2 = 0); std::vector<CalibrationMeasurement::Base*> findMeasurements(CalibrationMeasurement::Base::Type type, int port1 = 0, int port2 = 0);
// returns the first measurement in the list that matches the parameters // returns the first measurement in the list that matches the parameters

View file

@ -154,6 +154,7 @@ SOURCES += \
../LibreVNA-GUI/streamingserver.cpp \ ../LibreVNA-GUI/streamingserver.cpp \
../LibreVNA-GUI/touchstone.cpp \ ../LibreVNA-GUI/touchstone.cpp \
../LibreVNA-GUI/unit.cpp \ ../LibreVNA-GUI/unit.cpp \
calibrationtests.cpp \
ffttests.cpp \ ffttests.cpp \
impedancerenormalizationtests.cpp \ impedancerenormalizationtests.cpp \
main.cpp \ main.cpp \
@ -352,6 +353,7 @@ HEADERS += \
../LibreVNA-GUI/streamingserver.h \ ../LibreVNA-GUI/streamingserver.h \
../LibreVNA-GUI/touchstone.h \ ../LibreVNA-GUI/touchstone.h \
../LibreVNA-GUI/unit.h \ ../LibreVNA-GUI/unit.h \
calibrationtests.h \
ffttests.h \ ffttests.h \
impedancerenormalizationtests.h \ impedancerenormalizationtests.h \
parametertests.h \ parametertests.h \

View file

@ -0,0 +1,136 @@
#include "calibrationtests.h"
#include "calibration.h"
CalibrationTests::CalibrationTests() {}
void CalibrationTests::LinearDetection()
{
// create some measurements
std::vector<CalibrationMeasurement::Base*> m;
double startFreq = 100000;
double stopFreq = 6000000000;
int points = 1001;
Calibration cal;
cal.getKit().setIdealDefault();
auto open = new CalibrationMeasurement::Open(&cal);
open->setPort(1);
m.push_back(open);
auto _short = new CalibrationMeasurement::Short(&cal);
_short->setPort(1);
m.push_back(_short);
auto load = new CalibrationMeasurement::Load(&cal);
load->setPort(1);
m.push_back(load);
for(int i=0;i<points;i++) {
double f = startFreq + (stopFreq - startFreq) * i / (points-1);
DeviceDriver::VNAMeasurement meas;
meas.frequency = f;
meas.measurements["S11"] = 0.0;
m[0]->addPoint(meas);
m[1]->addPoint(meas);
m[2]->addPoint(meas);
}
// verify correct detection
double detectedStart;
double detectedStop;
int detectedPoints;
bool detectedLog;
Calibration::hasFrequencyOverlap(m, &detectedStart, &detectedStop, &detectedPoints, &detectedLog);
QVERIFY(qFuzzyCompare(detectedStart, startFreq));
QVERIFY(qFuzzyCompare(detectedStop, stopFreq));
QVERIFY(detectedPoints == points);
QVERIFY(detectedLog == false);
}
void CalibrationTests::LogDetection()
{
// create some measurements
std::vector<CalibrationMeasurement::Base*> m;
double startFreq = 100000;
double stopFreq = 6000000000;
int points = 1001;
Calibration cal;
cal.getKit().setIdealDefault();
auto open = new CalibrationMeasurement::Open(&cal);
open->setPort(1);
m.push_back(open);
auto _short = new CalibrationMeasurement::Short(&cal);
_short->setPort(1);
m.push_back(_short);
auto load = new CalibrationMeasurement::Load(&cal);
load->setPort(1);
m.push_back(load);
for(int i=0;i<points;i++) {
double f = startFreq * pow(10.0, i * log10(stopFreq / startFreq) / (points - 1));
DeviceDriver::VNAMeasurement meas;
meas.frequency = f;
meas.measurements["S11"] = 0.0;
m[0]->addPoint(meas);
m[1]->addPoint(meas);
m[2]->addPoint(meas);
}
// verify correct detection
double detectedStart;
double detectedStop;
int detectedPoints;
bool detectedLog;
Calibration::hasFrequencyOverlap(m, &detectedStart, &detectedStop, &detectedPoints, &detectedLog);
QVERIFY(qFuzzyCompare(detectedStart, startFreq));
QVERIFY(qFuzzyCompare(detectedStop, stopFreq));
QVERIFY(detectedPoints == points);
QVERIFY(detectedLog == true);
}
void CalibrationTests::MixedDetection()
{
// create some measurements
std::vector<CalibrationMeasurement::Base*> m;
double startFreq = 100000;
double stopFreq = 6000000000;
int points = 1001;
Calibration cal;
cal.getKit().setIdealDefault();
auto open = new CalibrationMeasurement::Open(&cal);
open->setPort(1);
m.push_back(open);
auto _short = new CalibrationMeasurement::Short(&cal);
_short->setPort(1);
m.push_back(_short);
auto load = new CalibrationMeasurement::Load(&cal);
load->setPort(1);
m.push_back(load);
for(int i=0;i<points;i++) {
// one linear measurement, two log measurement
double flin = startFreq + (stopFreq - startFreq) * i / (points-1);
double flog = startFreq * pow(10.0, i * log10(stopFreq / startFreq) / (points - 1));
DeviceDriver::VNAMeasurement measlin;
measlin.frequency = flin;
measlin.measurements["S11"] = 0.0;
DeviceDriver::VNAMeasurement measlog;
measlog.frequency = flog;
measlog.measurements["S11"] = 0.0;
m[0]->addPoint(measlin);
m[1]->addPoint(measlog);
m[2]->addPoint(measlog);
}
// verify correct detection
double detectedStart;
double detectedStop;
int detectedPoints;
bool detectedLog;
Calibration::hasFrequencyOverlap(m, &detectedStart, &detectedStop, &detectedPoints, &detectedLog);
QVERIFY(qFuzzyCompare(detectedStart, startFreq));
QVERIFY(qFuzzyCompare(detectedStop, stopFreq));
QVERIFY(detectedPoints == points);
QVERIFY(detectedLog == true);
}

View file

@ -0,0 +1,18 @@
#ifndef CALIBRATIONTESTS_H
#define CALIBRATIONTESTS_H
#include <QtTest>
class CalibrationTests : public QObject
{
Q_OBJECT
public:
CalibrationTests();
private slots:
void LinearDetection();
void LogDetection();
void MixedDetection();
};
#endif // CALIBRATIONTESTS_H

View file

@ -3,6 +3,7 @@
#include "parametertests.h" #include "parametertests.h"
#include "ffttests.h" #include "ffttests.h"
#include "impedancerenormalizationtests.h" #include "impedancerenormalizationtests.h"
#include "calibrationtests.h"
#include <QtTest> #include <QtTest>
@ -16,6 +17,7 @@ int main(int argc, char *argv[])
status |= QTest::qExec(new ParameterTests, argc, argv); status |= QTest::qExec(new ParameterTests, argc, argv);
status |= QTest::qExec(new fftTests, argc, argv); status |= QTest::qExec(new fftTests, argc, argv);
status |= QTest::qExec(new ImpedanceRenormalizationTests, argc, argv); status |= QTest::qExec(new ImpedanceRenormalizationTests, argc, argv);
status |= QTest::qExec(new CalibrationTests, argc, argv);
return status; return status;
} }