From b6f26eb6dce15e20bf8ddc72e796f129f5c46919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Wed, 26 Feb 2025 08:54:45 +0100 Subject: [PATCH] Interpolate calibration with magnitude/phase instead of real/imag --- .../LibreVNA-GUI/Calibration/calibration.cpp | 12 ++++++------ .../PC_Application/LibreVNA-GUI/Util/util.cpp | 18 ++++++++++++++++++ .../PC_Application/LibreVNA-GUI/Util/util.h | 3 +++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Software/PC_Application/LibreVNA-GUI/Calibration/calibration.cpp b/Software/PC_Application/LibreVNA-GUI/Calibration/calibration.cpp index 7872e07..b922c16 100644 --- a/Software/PC_Application/LibreVNA-GUI/Calibration/calibration.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Calibration/calibration.cpp @@ -1971,35 +1971,35 @@ Calibration::Point Calibration::Point::interpolate(const Calibration::Point &to, ret.frequency = frequency * (1.0-alpha) + to.frequency * alpha; ret.D.resize(D.size(), 0.0); for(unsigned int i=0;i Util::interpolateMagPhase(const std::complex &from, const std::complex &to, double alpha) +{ + auto magFrom = abs(from); + auto magTo = abs(to); + auto phaseFrom = arg(from); + auto phaseTo = arg(to); + // unwrap phase + if(phaseTo - phaseFrom > M_PI) { + phaseTo -= 2*M_PI; + } else if(phaseTo - phaseFrom < -M_PI) { + phaseTo += 2*M_PI; + } + auto magInterp = magFrom * (1.0 - alpha) + magTo * alpha; + auto phaseInterp = phaseFrom * (1.0 - alpha) + phaseTo * alpha; + + return std::polar(magInterp, phaseInterp); +} diff --git a/Software/PC_Application/LibreVNA-GUI/Util/util.h b/Software/PC_Application/LibreVNA-GUI/Util/util.h index de83dc9..6b5b32c 100644 --- a/Software/PC_Application/LibreVNA-GUI/Util/util.h +++ b/Software/PC_Application/LibreVNA-GUI/Util/util.h @@ -117,6 +117,9 @@ namespace Util { } return ret; } + + std::complex interpolateMagPhase(const std::complex &from, const std::complex &to, double alpha); + void unwrapPhase(std::vector &phase, unsigned int start_index = 0); // input values are Y coordinates, assumes evenly spaced linear X values from 0 to input.size() - 1