From bfe766cd574985465fe1a9f4cffa388ca9ca1f9b Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 5 May 2023 13:37:50 -0700 Subject: Use some more standard functions --- common/alnumeric.h | 6 ------ 1 file changed, 6 deletions(-) (limited to 'common/alnumeric.h') diff --git a/common/alnumeric.h b/common/alnumeric.h index d6919e40..8220d3e5 100644 --- a/common/alnumeric.h +++ b/common/alnumeric.h @@ -283,12 +283,6 @@ inline float fast_roundf(float f) noexcept } -template -constexpr const T& clamp(const T& value, const T& min_value, const T& max_value) noexcept -{ - return std::min(std::max(value, min_value), max_value); -} - // Converts level (mB) to gain. inline float level_mb_to_gain(float x) { -- cgit v1.2.3 From ca3bc1bd80fdff511e83d563a4ee94d6cd885473 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 25 Aug 2023 11:28:05 -0700 Subject: Use a bit_cast instead of a union for type-punning --- common/alnumeric.h | 47 ++++++++++++++++------------------------------- 1 file changed, 16 insertions(+), 31 deletions(-) (limited to 'common/alnumeric.h') diff --git a/common/alnumeric.h b/common/alnumeric.h index 8220d3e5..620a9bcb 100644 --- a/common/alnumeric.h +++ b/common/alnumeric.h @@ -12,6 +12,7 @@ #include #endif +#include "albit.h" #include "altraits.h" #include "opthelpers.h" @@ -159,21 +160,16 @@ inline int float2int(float f) noexcept #elif (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP == 0) \ || ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) \ && !defined(__SSE_MATH__)) - int sign, shift, mant; - union { - float f; - int i; - } conv; + const int conv_i{al::bit_cast(f)}; - conv.f = f; - sign = (conv.i>>31) | 1; - shift = ((conv.i>>23)&0xff) - (127+23); + const int sign{(conv_i>>31) | 1}; + const int shift{((conv_i>>23)&0xff) - (127+23)}; /* Over/underflow */ if(shift >= 31 || shift < -23) UNLIKELY return 0; - mant = (conv.i&0x7fffff) | 0x800000; + const int mant{(conv_i&0x7fffff) | 0x800000}; if(shift < 0) LIKELY return (mant >> -shift) * sign; return (mant << shift) * sign; @@ -195,25 +191,19 @@ inline int double2int(double d) noexcept #elif (defined(_MSC_VER) && defined(_M_IX86_FP) && _M_IX86_FP < 2) \ || ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) \ && !defined(__SSE2_MATH__)) - int sign, shift; - int64_t mant; - union { - double d; - int64_t i64; - } conv; + const int64_t conv_i64{al::bit_cast(d)}; - conv.d = d; - sign = (conv.i64 >> 63) | 1; - shift = ((conv.i64 >> 52) & 0x7ff) - (1023 + 52); + const int sign{static_cast(conv_i64 >> 63) | 1}; + const int shift{(static_cast(conv_i64 >> 52) & 0x7ff) - (1023 + 52)}; /* Over/underflow */ if(shift >= 63 || shift < -52) UNLIKELY return 0; - mant = (conv.i64 & 0xfffffffffffff_i64) | 0x10000000000000_i64; + const int64_t mant{(conv_i64 & 0xfffffffffffff_i64) | 0x10000000000000_i64}; if(shift < 0) LIKELY - return (int)(mant >> -shift) * sign; - return (int)(mant << shift) * sign; + return static_cast(mant >> -shift) * sign; + return static_cast(mant << shift) * sign; #else @@ -246,19 +236,14 @@ inline float fast_roundf(float f) noexcept /* Integral limit, where sub-integral precision is not available for * floats. */ - static const float ilim[2]{ + static constexpr float ilim[2]{ 8388608.0f /* 0x1.0p+23 */, -8388608.0f /* -0x1.0p+23 */ }; - unsigned int sign, expo; - union { - float f; - unsigned int i; - } conv; - - conv.f = f; - sign = (conv.i>>31)&0x01; - expo = (conv.i>>23)&0xff; + const unsigned int conv_i{al::bit_cast(f)}; + + const unsigned int sign{(conv_i>>31)&0x01}; + const unsigned int expo{(conv_i>>23)&0xff}; if(expo >= 150/*+23*/) UNLIKELY { -- cgit v1.2.3 From bc5b58464ce52097efdb53c8019ba048e7ee3ba8 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 22 Sep 2023 12:47:29 -0700 Subject: Shift the appropriate type --- common/alcomplex.cpp | 8 ++++---- common/alnumeric.h | 10 ++++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) (limited to 'common/alnumeric.h') diff --git a/common/alcomplex.cpp b/common/alcomplex.cpp index ee990a39..dad62d0a 100644 --- a/common/alcomplex.cpp +++ b/common/alcomplex.cpp @@ -127,8 +127,8 @@ complex_fft(const al::span> buffer, const al::type_identity_t /* Iterative form of Danielson-Lanczos lemma */ for(size_t i{0};i < log2_size;++i) { - const size_t step2{1u << i}; - const size_t step{2u << i}; + const size_t step2{1_uz << i}; + const size_t step{2_uz << i}; /* The first iteration of the inner loop would have u=1, which we * can simplify to remove a number of complex multiplies. */ @@ -172,8 +172,8 @@ complex_fft(const al::span> buffer, const al::type_identity_t const Real pi{al::numbers::pi_v * sign}; for(size_t i{0};i < log2_size;++i) { - const size_t step2{1u << i}; - const size_t step{2u << i}; + const size_t step2{1_uz << i}; + const size_t step{2_uz << i}; for(size_t k{0};k < fftsize;k+=step) { std::complex temp{buffer[k+step2]}; diff --git a/common/alnumeric.h b/common/alnumeric.h index 620a9bcb..759dbc12 100644 --- a/common/alnumeric.h +++ b/common/alnumeric.h @@ -5,6 +5,7 @@ #include #include #include +#include #ifdef HAVE_INTRIN_H #include #endif @@ -17,8 +18,13 @@ #include "opthelpers.h" -inline constexpr int64_t operator "" _i64(unsigned long long int n) noexcept { return static_cast(n); } -inline constexpr uint64_t operator "" _u64(unsigned long long int n) noexcept { return static_cast(n); } +constexpr auto operator "" _i64(unsigned long long n) noexcept { return static_cast(n); } +constexpr auto operator "" _u64(unsigned long long n) noexcept { return static_cast(n); } + +constexpr auto operator "" _z(unsigned long long n) noexcept +{ return static_cast>(n); } +constexpr auto operator "" _uz(unsigned long long n) noexcept { return static_cast(n); } +constexpr auto operator "" _zu(unsigned long long n) noexcept { return static_cast(n); } constexpr inline float minf(float a, float b) noexcept -- cgit v1.2.3 From 34cde4b55f87d775e79c1f4cbd6b14d129b1a949 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 2 Nov 2023 10:55:28 -0700 Subject: Remove an unnecessary struct member --- common/alnumeric.h | 3 +++ core/bsinc_tables.cpp | 9 ++++----- 2 files changed, 7 insertions(+), 5 deletions(-) (limited to 'common/alnumeric.h') diff --git a/common/alnumeric.h b/common/alnumeric.h index 759dbc12..6281b012 100644 --- a/common/alnumeric.h +++ b/common/alnumeric.h @@ -89,6 +89,9 @@ constexpr inline float cubic(float val1, float val2, float val3, float val4, flo return val1*a0 + val2*a1 + val3*a2 + val4*a3; } +constexpr inline double lerpd(double val1, double val2, double mu) noexcept +{ return val1 + (val2-val1)*mu; } + /** Find the next power-of-2 for non-power-of-2 numbers. */ inline uint32_t NextPowerOf2(uint32_t value) noexcept diff --git a/core/bsinc_tables.cpp b/core/bsinc_tables.cpp index 1b3f5784..c734b0e9 100644 --- a/core/bsinc_tables.cpp +++ b/core/bsinc_tables.cpp @@ -10,6 +10,7 @@ #include #include "alnumbers.h" +#include "alnumeric.h" #include "bsinc_defs.h" #include "resampler_limits.h" @@ -108,7 +109,6 @@ struct BSincHeader { double width{}; double beta{}; double scaleBase{}; - double scaleRange{}; double besseli_0_beta{}; uint a[BSincScaleCount]{}; @@ -119,13 +119,12 @@ struct BSincHeader { width = CalcKaiserWidth(Rejection, Order); beta = CalcKaiserBeta(Rejection); scaleBase = width / 2.0; - scaleRange = 1.0 - scaleBase; besseli_0_beta = BesselI_0(beta); uint num_points{Order+1}; for(uint si{0};si < BSincScaleCount;++si) { - const double scale{scaleBase + (scaleRange * (si+1) / BSincScaleCount)}; + const double scale{lerpd(scaleBase, 1.0, (si+1) / double{BSincScaleCount})}; const uint a_{std::min(static_cast(num_points / 2.0 / scale), num_points)}; const uint m{2 * a_}; @@ -162,7 +161,7 @@ struct BSincFilterArray { { const uint m{hdr.a[si] * 2}; const size_t o{(BSincPointsMax-m) / 2}; - const double scale{hdr.scaleBase + (hdr.scaleRange * (si+1) / BSincScaleCount)}; + const double scale{lerpd(hdr.scaleBase, 1.0, (si+1) / double{BSincScaleCount})}; const double cutoff{scale - (hdr.scaleBase * std::max(1.0, scale*2.0))}; const auto a = static_cast(hdr.a[si]); const double l{a - 1.0/BSincPhaseCount}; @@ -255,7 +254,7 @@ constexpr BSincTable GenerateBSincTable(const T &filter) BSincTable ret{}; const BSincHeader &hdr = filter.getHeader(); ret.scaleBase = static_cast(hdr.scaleBase); - ret.scaleRange = static_cast(1.0 / hdr.scaleRange); + ret.scaleRange = static_cast(1.0 / (1.0 - hdr.scaleBase)); for(size_t i{0};i < BSincScaleCount;++i) ret.m[i] = ((hdr.a[i]*2) + 3) & ~3u; ret.filterOffset[0] = 0; -- cgit v1.2.3