1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
/*
* This file is part of the bladeRF project:
* http://www.github.com/nuand/bladeRF
*
* Copyright (C) 2023 Nuand LLC
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef BLADERF2_CALIBRATION_H_
#define BLADERF2_CALIBRATION_H_
#include <stdint.h>
#include "libbladeRF.h"
/**
* @brief Converts gain calibration CSV data to a binary format.
*
* This function reads frequency and gain data from a CSV file and writes it
* to a binary file.
*
* @param csv_path Path to the input CSV file.
* @param binary_path Path to the output binary file.
* @param ch bladeRF channel
* @return 0 on success, BLADERF_ERR_* code on failure.
*/
int gain_cal_csv_to_bin(struct bladerf *dev, const char *csv_path, const char *binary_path, bladerf_channel ch);
/**
* @brief Loads gain calibration data from a binary file into a bladeRF device.
*
* This function reads frequency and gain calibration data from a binary file and
* loads it into the specified bladeRF device.
*
* @param dev Pointer to the bladeRF device structure.
* @param ch Channel for which the gain calibration data is loaded.
* @param binary_path Path to the binary file containing frequency-gain data.
* @return 0 on success, BLADERF_ERR_* code on failure.
*/
int load_gain_calibration(struct bladerf *dev, bladerf_channel ch, const char *binary_path);
/**
* @brief Retrieve the gain correction gain delta between the current frequency and the target frequency.
*
* This function determines the gain correction difference between two frequencies,
* using the calibration table associated with the specified channel.
* The result is based on the gain correction values retrieved from the calibration table entries.
*
* @param dev Pointer to the bladeRF device structure.
* @param freq The target frequency for which the gain correction gain is to be determined.
* @param ch The bladeRF channel to use when fetching the gain calibration table.
* @param compensated_gain The gain correction result
*
* @return 0 on success, BLADERF_ERR_* code on failure.
*/
int get_gain_correction(struct bladerf *dev,
bladerf_frequency freq,
bladerf_channel ch,
bladerf_gain *compensated_gain);
/**
* Retrieves a gain calibration entry for a specified frequency by interpolating
* between the nearest lower and higher frequency calibration entries in the given
* calibration table.
*
* @param[in] tbl Pointer to the gain calibration table containing pre-calculated
* gain correction values across various frequencies.
* @param[in] freq The frequency for which the gain calibration entry is requested.
* @param[out] result Pointer to a `struct bladerf_gain_cal_entry` that will be filled
* with the interpolated gain calibration entry for the specified frequency.
* This structure must be allocated by the caller.
*
* The function first identifies the calibration entries immediately below and above the
* requested frequency. If the requested frequency matches a calibration point exactly,
* that entry is directly copied into `result`. If the requested frequency falls between
* two calibration points, a linear interpolation is performed to compute the gain
* correction value for the requested frequency, and the result is stored in `result`.
*
* @note This function assumes that the calibration table is sorted by frequency.
*
* @return 0 on success, indicating that `result` has been populated with the interpolated
* gain correction value. If the function fails, a negative error code is returned:
* - BLADERF_ERR_INVAL if the `result` pointer is NULL,
* - BLADERF_ERR_UNEXPECTED if suitable floor and ceiling entries cannot be found
* in the calibration table.
*/
int get_gain_cal_entry(const struct bladerf_gain_cal_tbl *tbl,
bladerf_frequency freq,
struct bladerf_gain_cal_entry *result);
/**
* Applies compensated gain given the current gain target and center frequency
*
* @param dev The bladeRF device structure pointer.
* @param ch The bladeRF channel to use.
* @param frequency The target frequency.
*/
int apply_gain_correction(struct bladerf *dev, bladerf_channel ch, bladerf_frequency frequency);
/**
* @brief Frees the resources of a gain calibration table and resets its fields.
*
* This function frees the dynamically allocated memory for the 'entries' and 'file_path'
* fields of the bladerf_gain_cal_tbl structure. After freeing these resources, it resets all fields
* of the structure to their default values, ensuring the structure is clean and can be
* reused or safely deallocated. The function logs a verbose message upon starting the
* freeing process.
*
* @param tbl Pointer to the bladerf_gain_cal_tbl structure. If this pointer is NULL,
* the function returns immediately without performing any operations.
* It is assumed that the caller ensures the validity of this pointer.
*/
void gain_cal_tbl_free(struct bladerf_gain_cal_tbl *tbl);
#endif
|