From 0931f1b5886f6bcc02f8f7a656399996eef74393 Mon Sep 17 00:00:00 2001 From: Silvano Seva Date: Fri, 4 Dec 2020 18:13:24 +0100 Subject: [PATCH] Utility for interpolation of calibration parameters --- openrtx/include/calibration/calibUtils.h | 45 +++++++++++++++++++++ openrtx/src/calibUtils.c | 51 ++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 openrtx/include/calibration/calibUtils.h create mode 100644 openrtx/src/calibUtils.c diff --git a/openrtx/include/calibration/calibUtils.h b/openrtx/include/calibration/calibUtils.h new file mode 100644 index 00000000..1e746ef1 --- /dev/null +++ b/openrtx/include/calibration/calibUtils.h @@ -0,0 +1,45 @@ +/*************************************************************************** + * Copyright (C) 2020 by Federico Amedeo Izzo IU2NUO, * + * Niccolò Izzo IU2KIN, * + * Silvano Seva IU2KWO * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, see * + ***************************************************************************/ + +#ifndef CALIB_UTILS_H +#define CALIB_UTILS_H + +#include +#include + +/** + * This function allows to obtain the value of a given calibration parameter for + * frequencies outside the calibration points. It works by searching the two + * calibration points containing the target frequency and then by linearly + * interpolating the calibration parameter among these two points. + * @param freq: target frequency for which a calibration value has to be + * computed. + * @param calPoints: pointer to the vector containing the frequencies of the + * calibration points. + * @param param: pointer to the vector containing the values for the calibration + * parameter, it must have the same length of the one containing the frequencies + * of calibration points. + * @param elems: number of elements of both the vectors for calibration parameter + * and frequencies. + * @return value for the calibration parameter at the given frequency point. + */ +uint8_t interpCalParameter(freq_t freq, freq_t *calPoints, uint8_t *param, + uint8_t elems); + +#endif /* CALIB_UTILS_H */ diff --git a/openrtx/src/calibUtils.c b/openrtx/src/calibUtils.c new file mode 100644 index 00000000..f9ce2083 --- /dev/null +++ b/openrtx/src/calibUtils.c @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (C) 2020 by Federico Amedeo Izzo IU2NUO, * + * Niccolò Izzo IU2KIN, * + * Silvano Seva IU2KWO * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, see * + ***************************************************************************/ + +#include + +uint8_t interpCalParameter(freq_t freq, freq_t *calPoints, uint8_t *param, + uint8_t elems) +{ + + if(freq <= calPoints[0]) return param[0]; + if(freq >= calPoints[elems - 1]) return param[elems - 1]; + + /* Find calibration point nearest to target frequency */ + uint8_t pos = 0; + for(; pos < elems; pos++) + { + if(calPoints[pos] >= freq) break; + } + + uint8_t interpValue = 0; + freq_t delta = calPoints[pos] - calPoints[pos - 1]; + + if(param[pos - 1] < param[pos]) + { + interpValue = param[pos - 1] + ((freq - calPoints[pos - 1]) * + (param[pos] - param[pos - 1]))/delta; + } + else + { + interpValue = param[pos - 1] - ((freq - calPoints[pos - 1]) * + (param[pos - 1] - param[pos]))/delta; + } + + return interpValue; +}