[PATCH v3 01/11] ipa: helpers: Add Unsigned Q(m, n) helpers
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Nov 12 09:00:56 CET 2024
Hi Dan,
Thank you for the patch.
On Thu, Nov 07, 2024 at 11:48:09AM +0000, Daniel Scally wrote:
> Add functions to convert a double to or from an unsigned Q(m,n)
> format. As the format is unsigned this most resembles the UQ variant
> of the TI implementation detailed on Wikipedia:
>
> https://en.wikipedia.org/wiki/Q_(number_format)
Time to move src/ipa/rkisp1/utils.{h,cpp} to libipa ? I would then call
it math.h, fixedpoint.h or something similar.
> Signed-off-by: Daniel Scally <dan.scally at ideasonboard.com>
> ---
> Changes in v3:
>
> - New patch
>
> src/ipa/libipa/helpers.cpp | 29 +++++++++++++++++++++++++++++
> src/ipa/libipa/helpers.h | 2 ++
> 2 files changed, 31 insertions(+)
>
> diff --git a/src/ipa/libipa/helpers.cpp b/src/ipa/libipa/helpers.cpp
> index 6c038895..908c6e93 100644
> --- a/src/ipa/libipa/helpers.cpp
> +++ b/src/ipa/libipa/helpers.cpp
> @@ -72,6 +72,35 @@ uint32_t estimateCCT(double red, double green, double blue)
> return 449 * n * n * n + 3525 * n * n + 6823.3 * n + 5520.33;
> }
>
> +/**
> + * \brief Convert double to Q(m.n) format
> + * \param[in] value The value to convert
> + * \param[in] m The number of bits used to represent the integer part
> + * \param[in] n The number of bits used to represent the fraction part
> + *
> + * This function converts a double into an unsigned fractional Q format,
> + * clamping at the largest possible value given m and n. As these formats are
> + * unsigned the m figure does not include a sign bit.
> + */
> +unsigned int toUnsignedQFormat(double value, unsigned int m, unsigned int n)
> +{
> + double maxVal = (std::pow(2, m + n) - 1) / std::pow(2, n);
> +
> + return std::clamp(value, 0.0, maxVal) * std::pow(2, n);
> +}
> +
> +/**
> + * \brief Convert Q(m.n) formatted number to double
> + * \param[in] value The value to convert
> + * \param[in] n The number of bits used to represent the fraction part
> + *
> + * This function converts an unsigned Q formatted value into a double.
> + */
> +double fromUnsignedQFormat(unsigned int value, unsigned int n)
> +{
> + return value / std::pow(2, n);
> +}
> +
> } /* namespace ipa */
>
> } /* namespace libcamera */
> diff --git a/src/ipa/libipa/helpers.h b/src/ipa/libipa/helpers.h
> index 51c74a36..1f26e768 100644
> --- a/src/ipa/libipa/helpers.h
> +++ b/src/ipa/libipa/helpers.h
> @@ -15,6 +15,8 @@ namespace ipa {
>
> double rec601LuminanceFromRGB(unsigned int r, unsigned int g, unsigned int b);
> uint32_t estimateCCT(double red, double green, double blue);
> +unsigned int toUnsignedQFormat(double value, unsigned int m, unsigned int n);
> +double fromUnsignedQFormat(unsigned int value, unsigned int n);
>
> } /* namespace ipa */
>
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list