[PATCH] libcamera: utils: Add a helper to convert floating-point to fixed-point
Paul Elder
paul.elder at ideasonboard.com
Mon Apr 15 11:00:23 CEST 2024
On Wed, Mar 27, 2024 at 05:57:00PM +0900, Paul Elder wrote:
> Add a helper function to convert floating-point numbers to fixed-point
> numbers.
>
> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> ---
> I originally needed this for rkisp1 crosstalk but then I realized it's
> more efficient to just have the tuning tool output fixed-point and have
> the IPA simply copy those values instead of calculating them on-the-fly.
> Still, I made this helper so if people think it's useful...
Turns out we do need it now! So that we can have human-readable (or
make-sensable) CCMs in the tuning file for rkisp1.
Paul
> ---
> include/libcamera/base/utils.h | 27 +++++++++++++++++++++++++++
> src/libcamera/base/utils.cpp | 10 ++++++++++
> 2 files changed, 37 insertions(+)
>
> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
> index 37d9af60..ab421cc7 100644
> --- a/include/libcamera/base/utils.h
> +++ b/include/libcamera/base/utils.h
> @@ -369,6 +369,33 @@ decltype(auto) abs_diff(const T &a, const T &b)
>
> double strtod(const char *__restrict nptr, char **__restrict endptr);
>
> +#ifndef __DOXYGEN__
> +template<unsigned int I, unsigned int F, typename R, typename T,
> + std::enable_if_t<std::is_integral_v<R> &&
> + std::is_floating_point_v<T>> * = nullptr>
> +#else
> +template<unsigned int I, unsigned int F, typename R, typename T>
> +#endif
> +constexpr R floatingToFixedPoint(T number)
> +{
> + static_assert(I + F <= sizeof(R) * 8);
> +
> + R integer = static_cast<R>(number);
> + T fractional = number - integer;
> +
> + R mask = (1 << I) - 1;
> + R whole = (integer >= 0 ? integer : ~integer + 1) & mask;
> +
> + R frac = 0;
> + for (unsigned int i = 0; i < F; i++) {
> + fractional *= 2;
> + frac <<= 1;
> + frac |= (static_cast<R>(fractional) & 0x1);
> + }
> +
> + return (whole << F) | frac;
> +}
> +
> } /* namespace utils */
>
> #ifndef __DOXYGEN__
> diff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp
> index 3b73b442..38bee317 100644
> --- a/src/libcamera/base/utils.cpp
> +++ b/src/libcamera/base/utils.cpp
> @@ -521,6 +521,16 @@ double strtod(const char *__restrict nptr, char **__restrict endptr)
> #endif
> }
>
> +/**
> + * \fn R floatingToFixedPoint(T number)
> + * \brief Convert a floating point number to a fixed-point representation
> + * \tparam I Bit width of the integer part of the fixed-point
> + * \tparam F Bit width of the fractional part of the fixed-point
> + * \tparam R Return type of the fixed-point representation
> + * \tparam T Input type of the floating point representation
> + * \return The converted value
> + */
> +
> } /* namespace utils */
>
> #ifndef __DOXYGEN__
> --
> 2.39.2
>
More information about the libcamera-devel
mailing list