USRP Hardware Driver and Device Manual Version: 4.11.0.0-0-unknown
UHD and USRP Manual
Loading...
Searching...
No Matches
math.hpp
Go to the documentation of this file.
1//
2// Copyright 2014-2015 Ettus Research LLC
3// Copyright 2018 Ettus Research, a National Instruments Company
4//
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
7
8#pragma once
9
10#include <uhd/config.hpp>
11#include <cmath>
12
13
14namespace uhd {
15
20namespace math {
21
22static const double PI = 3.14159265358979323846;
23
40static const float SINGLE_PRECISION_EPSILON = 1.19e-7f;
41static const double DOUBLE_PRECISION_EPSILON = 2.22e-16;
42
52static constexpr double FREQ_COMPARE_EPSILON = 1e-12;
53
54namespace fp_compare {
55
69template <typename float_t>
71{
72public:
74 UHD_INLINE fp_compare_epsilon(float_t value, float_t epsilon);
77 UHD_INLINE void operator=(const fp_compare_epsilon& copy);
78
79 float_t _value;
80 float_t _epsilon;
81};
82
83/* A Note on Floating Point Equality with Epsilons
84 *
85 * There are obviously a lot of strategies for defining floating point
86 * equality, and in the end it all comes down to the domain at hand. UHD's
87 * floating-point-with-epsilon comparison algorithm is based on the method
88 * presented in Knuth's "The Art of Computer Science" called "close enough
89 * with tolerance epsilon".
90 *
91 * [(|u - v| / |u|) <= e] || [(|u - v| / |v|) <= e]
92 *
93 * UHD's modification to this algorithm is using the denominator's epsilon
94 * value (since each float_t object has its own epsilon) for each
95 * comparison.
96 */
97
98template <typename float_t>
101template <typename float_t>
104template <typename float_t>
107template <typename float_t>
110template <typename float_t>
113template <typename float_t>
116
117/* If these operators are used with floats, we rely on type promotion to
118 * double. */
119template <typename float_t>
121template <typename float_t>
123template <typename float_t>
125template <typename float_t>
127template <typename float_t>
129template <typename float_t>
131
132template <typename float_t>
134template <typename float_t>
136template <typename float_t>
138template <typename float_t>
140template <typename float_t>
142template <typename float_t>
144
147{
148public:
150 : fp_compare_epsilon<double>(value, FREQ_COMPARE_EPSILON)
151 {
152 }
153
155 : fp_compare_epsilon<double>(copy)
156 {
157 }
158};
159
160
161} // namespace fp_compare
162
163
170static const float SINGLE_PRECISION_DELTA = 1e-3f;
171static const double DOUBLE_PRECISION_DELTA = 1e-5;
172
174static const double FREQ_COMPARISON_DELTA_HZ = 0.1;
175
176
177namespace fp_compare {
178
192template <typename float_t>
194{
195public:
197 UHD_INLINE fp_compare_delta(float_t value, float_t delta);
200 UHD_INLINE void operator=(const fp_compare_delta& copy);
201
202 float_t _value;
203 float_t _delta;
204};
205
206template <typename float_t>
208template <typename float_t>
210template <typename float_t>
212template <typename float_t>
214template <typename float_t>
216template <typename float_t>
218
219/* If these operators are used with floats, we rely on type promotion to
220 * double. */
221template <typename float_t>
223template <typename float_t>
225template <typename float_t>
227template <typename float_t>
229template <typename float_t>
231template <typename float_t>
233
234template <typename float_t>
236template <typename float_t>
238template <typename float_t>
240template <typename float_t>
242template <typename float_t>
244template <typename float_t>
246
247} // namespace fp_compare
248
249UHD_INLINE bool frequencies_are_equal(double lhs, double rhs)
250{
251 return (fp_compare::fp_compare_delta<double>(lhs, FREQ_COMPARISON_DELTA_HZ)
252 == fp_compare::fp_compare_delta<double>(rhs, FREQ_COMPARISON_DELTA_HZ));
253}
254
255inline double dB_to_lin(const double dB_val)
256{
257 return std::pow(10, (dB_val) / 10.0);
258}
259
260inline double lin_to_dB(const double val)
261{
262 return 10 * std::log10(val);
263}
264
265
274template <typename T>
275inline constexpr int sign(T x)
276{
277 // Note: If T is unsigned, then this will compile with a warning. Should
278 // we need that, expand the template logic.
279 return (T(0) < x) - (x < T(0));
280}
281
293inline double wrap_frequency(const double requested_freq, const double rate)
294{
295 double freq = std::fmod(requested_freq, rate);
296 if (std::abs(freq) > rate / 2.0)
297 freq -= uhd::math::sign(freq) * rate;
298 return freq;
299}
300
301} // namespace math
302} // namespace uhd
303
UHD_INLINE fp_compare_delta(float_t value)
float_t _delta
Definition math.hpp:203
UHD_INLINE void operator=(const fp_compare_delta &copy)
Definition fp_compare_delta.ipp:56
float_t _value
Definition math.hpp:202
float_t _epsilon
Definition math.hpp:80
UHD_INLINE void operator=(const fp_compare_epsilon &copy)
Definition fp_compare_epsilon.ipp:51
float_t _value
Definition math.hpp:79
UHD_INLINE fp_compare_epsilon(float_t value)
UHD_INLINE fp_compare_epsilon(float value)
Definition fp_compare_epsilon.ipp:19
UHD_INLINE freq_compare_epsilon(const freq_compare_epsilon &copy)
Definition math.hpp:154
UHD_INLINE freq_compare_epsilon(double value)
Definition math.hpp:149
#define UHD_INLINE
Definition config.h:65
Definition fp_compare_delta.ipp:15
UHD_INLINE bool operator!=(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:71
UHD_INLINE bool operator<=(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:84
UHD_INLINE bool operator==(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:64
UHD_INLINE bool operator<(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:77
UHD_INLINE bool operator>(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:90
UHD_INLINE bool operator>=(fp_compare_delta< float_t > lhs, fp_compare_delta< float_t > rhs)
Definition fp_compare_delta.ipp:97
Definition fp_compare_delta.ipp:15
UHD_INLINE bool frequencies_are_equal(double lhs, double rhs)
Definition math.hpp:249
double dB_to_lin(const double dB_val)
Definition math.hpp:255
constexpr int sign(T x)
Returns the sign of x.
Definition math.hpp:275
double lin_to_dB(const double val)
Definition math.hpp:260
double wrap_frequency(const double requested_freq, const double rate)
Return a wrapped frequency that is the equivalent frequency in the first Nyquist zone.
Definition math.hpp:293
Definition build_info.hpp:12