aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/ambidefs.cpp44
-rw-r--r--core/ambidefs.h4
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 {