Create a proper third-order upsampler matrix
This is just an identity matrix for now, since with third-order mixing, it results in a matrix being multiplied with it's inverse.master
parent
1482f0b23d
commit
df33746571
|
@ -115,13 +115,72 @@ auto CalcSecondOrderUp()
|
|||
return res;
|
||||
}
|
||||
|
||||
/* TODO: When fourth-order is properly supported, fill this out. */
|
||||
|
||||
constexpr std::array<std::array<float,16>,20> ThirdOrderDecoder{{
|
||||
{{ 5.000000000e-02f, 3.090169944e-02f, 8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, 6.454972244e-02f, 9.045084972e-02f, 0.000000000e+00f, -1.232790000e-02f, -1.256118221e-01f, 0.000000000e+00f, 1.126112056e-01f, 7.944389175e-02f, 0.000000000e+00f, 2.421151497e-02f, 0.000000000e+00f, }},
|
||||
{{ 5.000000000e-02f, -3.090169944e-02f, 8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -6.454972244e-02f, 9.045084972e-02f, 0.000000000e+00f, -1.232790000e-02f, 1.256118221e-01f, 0.000000000e+00f, -1.126112056e-01f, 7.944389175e-02f, 0.000000000e+00f, 2.421151497e-02f, 0.000000000e+00f, }},
|
||||
{{ 5.000000000e-02f, 3.090169944e-02f, -8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -6.454972244e-02f, 9.045084972e-02f, 0.000000000e+00f, -1.232790000e-02f, -1.256118221e-01f, 0.000000000e+00f, 1.126112056e-01f, -7.944389175e-02f, 0.000000000e+00f, -2.421151497e-02f, 0.000000000e+00f, }},
|
||||
{{ 5.000000000e-02f, -3.090169944e-02f, -8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, 6.454972244e-02f, 9.045084972e-02f, 0.000000000e+00f, -1.232790000e-02f, 1.256118221e-01f, 0.000000000e+00f, -1.126112056e-01f, -7.944389175e-02f, 0.000000000e+00f, -2.421151497e-02f, 0.000000000e+00f, }},
|
||||
{{ 5.000000000e-02f, 8.090169944e-02f, 0.000000000e+00f, 3.090169944e-02f, 6.454972244e-02f, 0.000000000e+00f, -5.590169944e-02f, 0.000000000e+00f, -7.216878365e-02f, -7.763237543e-02f, 0.000000000e+00f, -2.950836627e-02f, 0.000000000e+00f, -1.497759251e-01f, 0.000000000e+00f, -7.763237543e-02f, }},
|
||||
{{ 5.000000000e-02f, 8.090169944e-02f, 0.000000000e+00f, -3.090169944e-02f, -6.454972244e-02f, 0.000000000e+00f, -5.590169944e-02f, 0.000000000e+00f, -7.216878365e-02f, -7.763237543e-02f, 0.000000000e+00f, -2.950836627e-02f, 0.000000000e+00f, 1.497759251e-01f, 0.000000000e+00f, 7.763237543e-02f, }},
|
||||
{{ 5.000000000e-02f, -8.090169944e-02f, 0.000000000e+00f, 3.090169944e-02f, -6.454972244e-02f, 0.000000000e+00f, -5.590169944e-02f, 0.000000000e+00f, -7.216878365e-02f, 7.763237543e-02f, 0.000000000e+00f, 2.950836627e-02f, 0.000000000e+00f, -1.497759251e-01f, 0.000000000e+00f, -7.763237543e-02f, }},
|
||||
{{ 5.000000000e-02f, -8.090169944e-02f, 0.000000000e+00f, -3.090169944e-02f, 6.454972244e-02f, 0.000000000e+00f, -5.590169944e-02f, 0.000000000e+00f, -7.216878365e-02f, 7.763237543e-02f, 0.000000000e+00f, 2.950836627e-02f, 0.000000000e+00f, 1.497759251e-01f, 0.000000000e+00f, 7.763237543e-02f, }},
|
||||
{{ 5.000000000e-02f, 0.000000000e+00f, 3.090169944e-02f, 8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -3.454915028e-02f, 6.454972244e-02f, 8.449668365e-02f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, 3.034486645e-02f, -6.779013272e-02f, 1.659481923e-01f, 4.797944664e-02f, }},
|
||||
{{ 5.000000000e-02f, 0.000000000e+00f, 3.090169944e-02f, -8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -3.454915028e-02f, -6.454972244e-02f, 8.449668365e-02f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, 3.034486645e-02f, 6.779013272e-02f, 1.659481923e-01f, -4.797944664e-02f, }},
|
||||
{{ 5.000000000e-02f, 0.000000000e+00f, -3.090169944e-02f, 8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -3.454915028e-02f, -6.454972244e-02f, 8.449668365e-02f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, -3.034486645e-02f, -6.779013272e-02f, -1.659481923e-01f, 4.797944664e-02f, }},
|
||||
{{ 5.000000000e-02f, 0.000000000e+00f, -3.090169944e-02f, -8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -3.454915028e-02f, 6.454972244e-02f, 8.449668365e-02f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, -3.034486645e-02f, 6.779013272e-02f, -1.659481923e-01f, -4.797944664e-02f, }},
|
||||
{{ 5.000000000e-02f, 5.000000000e-02f, 5.000000000e-02f, 5.000000000e-02f, 6.454972244e-02f, 6.454972244e-02f, 0.000000000e+00f, 6.454972244e-02f, 0.000000000e+00f, 1.016220987e-01f, 6.338656910e-02f, -1.092600649e-02f, -7.364853795e-02f, 1.011266756e-01f, -7.086833869e-02f, -1.482646439e-02f, }},
|
||||
{{ 5.000000000e-02f, 5.000000000e-02f, 5.000000000e-02f, -5.000000000e-02f, -6.454972244e-02f, 6.454972244e-02f, 0.000000000e+00f, -6.454972244e-02f, 0.000000000e+00f, 1.016220987e-01f, -6.338656910e-02f, -1.092600649e-02f, -7.364853795e-02f, -1.011266756e-01f, -7.086833869e-02f, 1.482646439e-02f, }},
|
||||
{{ 5.000000000e-02f, -5.000000000e-02f, 5.000000000e-02f, 5.000000000e-02f, -6.454972244e-02f, -6.454972244e-02f, 0.000000000e+00f, 6.454972244e-02f, 0.000000000e+00f, -1.016220987e-01f, -6.338656910e-02f, 1.092600649e-02f, -7.364853795e-02f, 1.011266756e-01f, -7.086833869e-02f, -1.482646439e-02f, }},
|
||||
{{ 5.000000000e-02f, -5.000000000e-02f, 5.000000000e-02f, -5.000000000e-02f, 6.454972244e-02f, -6.454972244e-02f, 0.000000000e+00f, -6.454972244e-02f, 0.000000000e+00f, -1.016220987e-01f, 6.338656910e-02f, 1.092600649e-02f, -7.364853795e-02f, -1.011266756e-01f, -7.086833869e-02f, 1.482646439e-02f, }},
|
||||
{{ 5.000000000e-02f, 5.000000000e-02f, -5.000000000e-02f, 5.000000000e-02f, 6.454972244e-02f, -6.454972244e-02f, 0.000000000e+00f, -6.454972244e-02f, 0.000000000e+00f, 1.016220987e-01f, -6.338656910e-02f, -1.092600649e-02f, 7.364853795e-02f, 1.011266756e-01f, 7.086833869e-02f, -1.482646439e-02f, }},
|
||||
{{ 5.000000000e-02f, 5.000000000e-02f, -5.000000000e-02f, -5.000000000e-02f, -6.454972244e-02f, -6.454972244e-02f, 0.000000000e+00f, 6.454972244e-02f, 0.000000000e+00f, 1.016220987e-01f, 6.338656910e-02f, -1.092600649e-02f, 7.364853795e-02f, -1.011266756e-01f, 7.086833869e-02f, 1.482646439e-02f, }},
|
||||
{{ 5.000000000e-02f, -5.000000000e-02f, -5.000000000e-02f, 5.000000000e-02f, -6.454972244e-02f, 6.454972244e-02f, 0.000000000e+00f, -6.454972244e-02f, 0.000000000e+00f, -1.016220987e-01f, 6.338656910e-02f, 1.092600649e-02f, 7.364853795e-02f, 1.011266756e-01f, 7.086833869e-02f, -1.482646439e-02f, }},
|
||||
{{ 5.000000000e-02f, -5.000000000e-02f, -5.000000000e-02f, -5.000000000e-02f, 6.454972244e-02f, 6.454972244e-02f, 0.000000000e+00f, 6.454972244e-02f, 0.000000000e+00f, -1.016220987e-01f, -6.338656910e-02f, 1.092600649e-02f, 7.364853795e-02f, -1.011266756e-01f, 7.086833869e-02f, 1.482646439e-02f, }},
|
||||
}};
|
||||
|
||||
constexpr std::array<AmbiChannelFloatArray,20> ThirdOrderEncoder{{
|
||||
CalcAmbiCoeffs( 0.35682208976f, 0.93417235897f, 0.00000000000f),
|
||||
CalcAmbiCoeffs(-0.35682208976f, 0.93417235897f, 0.00000000000f),
|
||||
CalcAmbiCoeffs( 0.35682208976f, -0.93417235897f, 0.00000000000f),
|
||||
CalcAmbiCoeffs(-0.35682208976f, -0.93417235897f, 0.00000000000f),
|
||||
CalcAmbiCoeffs( 0.93417235897f, 0.00000000000f, 0.35682208976f),
|
||||
CalcAmbiCoeffs( 0.93417235897f, 0.00000000000f, -0.35682208976f),
|
||||
CalcAmbiCoeffs(-0.93417235897f, 0.00000000000f, 0.35682208976f),
|
||||
CalcAmbiCoeffs(-0.93417235897f, 0.00000000000f, -0.35682208976f),
|
||||
CalcAmbiCoeffs( 0.00000000000f, 0.35682208976f, 0.93417235897f),
|
||||
CalcAmbiCoeffs( 0.00000000000f, 0.35682208976f, -0.93417235897f),
|
||||
CalcAmbiCoeffs( 0.00000000000f, -0.35682208976f, 0.93417235897f),
|
||||
CalcAmbiCoeffs( 0.00000000000f, -0.35682208976f, -0.93417235897f),
|
||||
CalcAmbiCoeffs( 0.57735026919f, 0.57735026919f, 0.57735026919f),
|
||||
CalcAmbiCoeffs( 0.57735026919f, 0.57735026919f, -0.57735026919f),
|
||||
CalcAmbiCoeffs(-0.57735026919f, 0.57735026919f, 0.57735026919f),
|
||||
CalcAmbiCoeffs(-0.57735026919f, 0.57735026919f, -0.57735026919f),
|
||||
CalcAmbiCoeffs( 0.57735026919f, -0.57735026919f, 0.57735026919f),
|
||||
CalcAmbiCoeffs( 0.57735026919f, -0.57735026919f, -0.57735026919f),
|
||||
CalcAmbiCoeffs(-0.57735026919f, -0.57735026919f, 0.57735026919f),
|
||||
CalcAmbiCoeffs(-0.57735026919f, -0.57735026919f, -0.57735026919f),
|
||||
}};
|
||||
static_assert(ThirdOrderDecoder.size() == ThirdOrderEncoder.size(), "Third-order mismatch");
|
||||
|
||||
/* This calculates a third-order "upsampler" matrix. Same as the first-order
|
||||
* matrix, just using a more dense speaker array suitable for third-order
|
||||
* content.
|
||||
*/
|
||||
auto CalcThirdOrderUp()
|
||||
{
|
||||
std::array<AmbiChannelFloatArray,16> res{};
|
||||
|
||||
for(size_t i{0};i < res.size();++i)
|
||||
res[i][i] = 1.0f;
|
||||
for(size_t i{0};i < ThirdOrderDecoder[0].size();++i)
|
||||
{
|
||||
for(size_t j{0};j < ThirdOrderEncoder[0].size();++j)
|
||||
{
|
||||
double sum{0.0};
|
||||
for(size_t k{0};k < ThirdOrderDecoder.size();++k)
|
||||
sum += double{ThirdOrderDecoder[k][i]} * ThirdOrderEncoder[k][j];
|
||||
res[i][j] = static_cast<float>(sum);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -138,7 +197,6 @@ const std::array<float,MaxAmbiOrder+1> AmbiScale::DecoderHFScale10{{
|
|||
const std::array<float,MaxAmbiOrder+1> AmbiScale::DecoderHFScale2O{{
|
||||
1.972026594e+00f, 1.527525232e+00f, 7.888106377e-01f
|
||||
}};
|
||||
/* TODO: Set properly when making the third-order upsampler decoder. */
|
||||
const std::array<float,MaxAmbiOrder+1> AmbiScale::DecoderHFScale3O{{
|
||||
1.000000000e+00f, 1.000000000e+00f, 1.000000000e+00f, 1.000000000e+00f
|
||||
1.865086714e+00f, 1.606093894e+00f, 1.142055301e+00f, 5.683795528e-01f
|
||||
}};
|
||||
|
|
Loading…
Reference in New Issue