diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/ambidefs.cpp | 44 | ||||
-rw-r--r-- | core/ambidefs.h | 4 |
2 files changed, 48 insertions, 0 deletions
diff --git a/core/ambidefs.cpp b/core/ambidefs.cpp new file mode 100644 index 00000000..2725748e --- /dev/null +++ b/core/ambidefs.cpp @@ -0,0 +1,44 @@ + +#include "config.h" + +#include "ambidefs.h" + +#include <cassert> + + +namespace { + +constexpr std::array<float,MaxAmbiOrder+1> Ambi3DDecoderHFScale{{ + 1.00000000e+00f, 1.00000000e+00f +}}; +constexpr std::array<float,MaxAmbiOrder+1> Ambi3DDecoderHFScale2O{{ + 7.45355990e-01f, 1.00000000e+00f, 1.00000000e+00f +}}; +constexpr std::array<float,MaxAmbiOrder+1> Ambi3DDecoderHFScale3O{{ + 5.89792205e-01f, 8.79693856e-01f, 1.00000000e+00f, 1.00000000e+00f +}}; + +inline auto& GetDecoderHFScales(uint order) noexcept +{ + if(order >= 3) return Ambi3DDecoderHFScale3O; + if(order == 2) return Ambi3DDecoderHFScale2O; + return Ambi3DDecoderHFScale; +} + +} // namespace + +auto AmbiScale::GetHFOrderScales(const uint in_order, const uint out_order) noexcept + -> std::array<float,MaxAmbiOrder+1> +{ + std::array<float,MaxAmbiOrder+1> ret{}; + + assert(out_order >= in_order); + + const auto &target = GetDecoderHFScales(out_order); + const auto &input = GetDecoderHFScales(in_order); + + for(size_t i{0};i < in_order+1;++i) + ret[i] = input[i] / target[i]; + + return ret; +} diff --git a/core/ambidefs.h b/core/ambidefs.h index a72f7b78..22739359 100644 --- a/core/ambidefs.h +++ b/core/ambidefs.h @@ -97,6 +97,10 @@ struct AmbiScale { }}; return ret; } + + /* Retrieves per-order HF scaling factors for "upsampling" ambisonic data. */ + static std::array<float,MaxAmbiOrder+1> GetHFOrderScales(const uint in_order, + const uint out_order) noexcept; }; struct AmbiIndex { |