summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2022-05-25 16:33:27 +0200
committerLars Knoll <lars.knoll@qt.io>2022-05-31 11:31:29 +0200
commitbfec5416903d664a9143d4c0fe7145702ffc3f38 (patch)
treec19e831126d5ab5661b2c84c9fa81799721ef0b4
parent0199157dbcbe71ef6af195114b9330d7e0520cb6 (diff)
Fix the data to decode ambisonic to surround speaker arrays
Use the correct channel order and normalization of the ambisonic channels. Resonance Audio expects Ambix compatible ordering (ie. ACN channel order) and normalization (SN3D). Specify that we want that ordering in the script generating the speaker data and normalize the factors correctly to SN3D. Add hand coded handling for Mono, Stereo, 2Dot1, 3Dot0 and 3Dot1 speaker configurations as those do not cover the area behind the listener and thus don't really qualify as a surround configuration. Change-Id: I905ddaa81938df918a460a7dea0526444836cdff Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
-rw-r--r--src/multimedia/audio/qaudioformat.cpp2
-rw-r--r--src/multimedia/audio/qaudioformat.h2
-rw-r--r--src/multimedia/spatial/qambisonicdecoder.cpp123
-rw-r--r--src/multimedia/spatial/qambisonicdecoder_p.h6
-rw-r--r--src/multimedia/spatial/qambisonicdecoderdata_p.h396
-rw-r--r--util/adt_generate_qt.m52
6 files changed, 266 insertions, 315 deletions
diff --git a/src/multimedia/audio/qaudioformat.cpp b/src/multimedia/audio/qaudioformat.cpp
index ecc1de1ff..6be912988 100644
--- a/src/multimedia/audio/qaudioformat.cpp
+++ b/src/multimedia/audio/qaudioformat.cpp
@@ -185,6 +185,8 @@ QT_BEGIN_NAMESPACE
\value ChannelConfigMono The audio has one Center channel
\value ChannelConfigStereo The audio has two channels, Left and Right
\value ChannelConfig2Dot1 The audio has three channels, Left, Right and LFE (low frequency effect)
+ \value ChannelConfig3Dot0 The audio has three channels, Left, Right and Center
+ \value ChannelConfig3Dot1 The audio has four channels, Left, Right, Center and LFE (low frequency effect)
\value ChannelConfigSurround5Dot0 The audio has five channels, Left, Right, Center, BackLeft, BackRight
\value ChannelConfigSurround5Dot1 The audio has 6 channels, Left, Right, Center, LFE, BackLeft and BackRight
\value ChannelConfigSurround7Dot0 The audio has 7 channels, Left, Right, Center, BackLeft, BackRight, SideLeft and SideRight
diff --git a/src/multimedia/audio/qaudioformat.h b/src/multimedia/audio/qaudioformat.h
index b4cbb6428..0a21aad7e 100644
--- a/src/multimedia/audio/qaudioformat.h
+++ b/src/multimedia/audio/qaudioformat.h
@@ -104,6 +104,8 @@ public:
ChannelConfigMono = QtPrivate::channelConfig(FrontCenter),
ChannelConfigStereo = QtPrivate::channelConfig(FrontLeft, FrontRight),
ChannelConfig2Dot1 = QtPrivate::channelConfig(FrontLeft, FrontRight, LFE),
+ ChannelConfig3Dot0 = QtPrivate::channelConfig(FrontLeft, FrontRight, FrontCenter),
+ ChannelConfig3Dot1 = QtPrivate::channelConfig(FrontLeft, FrontRight, FrontCenter, LFE),
ChannelConfigSurround5Dot0 = QtPrivate::channelConfig(FrontLeft, FrontRight, FrontCenter, BackLeft, BackRight),
ChannelConfigSurround5Dot1 = QtPrivate::channelConfig(FrontLeft, FrontRight, FrontCenter, LFE, BackLeft, BackRight),
ChannelConfigSurround7Dot0 = QtPrivate::channelConfig(FrontLeft, FrontRight, FrontCenter, BackLeft, BackRight, SideLeft, SideRight),
diff --git a/src/multimedia/spatial/qambisonicdecoder.cpp b/src/multimedia/spatial/qambisonicdecoder.cpp
index a25754ef0..6a4081194 100644
--- a/src/multimedia/spatial/qambisonicdecoder.cpp
+++ b/src/multimedia/spatial/qambisonicdecoder.cpp
@@ -40,6 +40,7 @@
#include "qambisonicdecoderdata_p.h"
#include <cmath>
+#include <qdebug.h>
QT_BEGIN_NAMESPACE
@@ -50,7 +51,10 @@ QT_BEGIN_NAMESPACE
//
// We are currently not using a near field compensation filter, something that could potentially
// improve sound quality further.
-
+//
+// For mono and stereo decoding, we use a simpler algorithm to avoid artificially dampening signals
+// coming from the back, as we do not have any speakers in that direction and the calculations
+// through matlab would give us audible 'holes'.
struct QAmbisonicDecoderData
{
@@ -61,18 +65,6 @@ struct QAmbisonicDecoderData
static const QAmbisonicDecoderData decoderMap[] =
{
- { QAudioFormat::ChannelConfigMono,
- { decoderMatrix_mono_1_lf, decoderMatrix_mono_2_lf, decoderMatrix_mono_3_lf },
- { decoderMatrix_mono_1_hf, decoderMatrix_mono_2_hf, decoderMatrix_mono_3_hf }
- },
- { QAudioFormat::ChannelConfigStereo,
- { decoderMatrix_stereo_1_lf, decoderMatrix_stereo_2_lf, decoderMatrix_stereo_3_lf },
- { decoderMatrix_stereo_1_hf, decoderMatrix_stereo_2_hf, decoderMatrix_stereo_3_hf }
- },
- { QAudioFormat::ChannelConfig2Dot1,
- { decoderMatrix_2dot1_1_lf, decoderMatrix_2dot1_2_lf, decoderMatrix_2dot1_3_lf },
- { decoderMatrix_2dot1_1_hf, decoderMatrix_2dot1_2_hf, decoderMatrix_2dot1_3_hf }
- },
{ QAudioFormat::ChannelConfigSurround5Dot0,
{ decoderMatrix_5dot0_1_lf, decoderMatrix_5dot0_2_lf, decoderMatrix_5dot0_3_lf },
{ decoderMatrix_5dot0_1_hf, decoderMatrix_5dot0_2_hf, decoderMatrix_5dot0_3_hf }
@@ -91,7 +83,6 @@ static const QAmbisonicDecoderData decoderMap[] =
}
};
-
// Implements a split second order IIR filter
// The audio data is split into a phase synced low and high frequency part
// This allows us to apply different factors to both parts for better sound
@@ -161,41 +152,99 @@ private:
QAmbisonicDecoder::QAmbisonicDecoder(AmbisonicLevel ambisonicLevel, const QAudioFormat &format)
: level(ambisonicLevel)
{
- auto outputConfiguration = format.channelConfig();
- if (outputConfiguration == QAudioFormat::ChannelConfigUnknown)
- outputConfiguration = format.defaultChannelConfigForChannelCount(format.channelCount());
- for (const auto &d : decoderMap) {
- if (d.config == outputConfiguration) {
+ Q_ASSERT(level > 0 && level <= 3);
+ inputChannels = (level+1)*(level+1);
+ outputChannels = format.channelCount();
+
+ channelConfig = format.channelConfig();
+ if (channelConfig == QAudioFormat::ChannelConfigUnknown)
+ channelConfig = format.defaultChannelConfigForChannelCount(format.channelCount());
+
+ if (channelConfig == QAudioFormat::ChannelConfigMono ||
+ channelConfig == QAudioFormat::ChannelConfigStereo ||
+ channelConfig == QAudioFormat::ChannelConfig2Dot1 ||
+ channelConfig == QAudioFormat::ChannelConfig3Dot0 ||
+ channelConfig == QAudioFormat::ChannelConfig3Dot1) {
+ // these are non surround configs and handled manually to avoid
+ // audible holes for sounds coming from behing
+ //
+ // We use a simpler decoding process here, only taking first order
+ // ambisonics into account
+ //
+ // Left and right channels get 50% W and 50% X
+ // Center gets 50% W and 50% Y
+ // LFE gets 50% W
+ simpleDecoderFactors = new float[4*outputChannels];
+ float *f = simpleDecoderFactors;
+ if (channelConfig & QAudioFormat::channelConfig(QAudioFormat::FrontLeft)) {
+ f[0] = 0.5f; f[1] = 0.5f; f[2] = 0.; f[3] = 0.f;
+ f += 4;
+ }
+ if (channelConfig & QAudioFormat::channelConfig(QAudioFormat::FrontRight)) {
+ f[0] = 0.5f; f[1] = -0.5f; f[2] = 0.; f[3] = 0.f;
+ f += 4;
+ }
+ if (channelConfig & QAudioFormat::channelConfig(QAudioFormat::FrontCenter)) {
+ f[0] = 0.5f; f[1] = -0.f; f[2] = 0.; f[3] = 0.5f;
+ f += 4;
+ }
+ if (channelConfig & QAudioFormat::channelConfig(QAudioFormat::LFE)) {
+ f[0] = 0.5f; f[1] = -0.f; f[2] = 0.; f[3] = 0.0f;
+ f += 4;
+ }
+ Q_UNUSED(f);
+ Q_ASSERT((f - simpleDecoderFactors) == 4*outputChannels);
+
+ return;
+ }
+
+ for (const auto &d : decoderMap) {
+ if (d.config == channelConfig) {
decoderData = &d;
break;
}
}
if (!decoderData) {
- // ### FIXME: use a stereo config, fill other channels with 0
+ // can't handle this,
+ outputChannels = 0;
+ return;
}
- inputChannels = (level+1)*(level+1);
- outputChannels = format.channelCount();
-
filters = new QAmbisonicDecoderFilter[inputChannels];
for (int i = 0; i < inputChannels; ++i)
filters[i].configure(format.sampleRate());
}
+QAmbisonicDecoder::~QAmbisonicDecoder()
+{
+ delete simpleDecoderFactors;
+}
+
void QAmbisonicDecoder::processBuffer(const float *input[], float *output, int nSamples)
{
float *o = output;
memset(o, 0, nSamples*outputChannels*sizeof(float));
- const float *matrix_hi = decoderData->hf[level];
- const float *matrix_lo = decoderData->hf[level];
+ if (simpleDecoderFactors) {
+ for (int i = 0; i < nSamples; ++i) {
+ for (int j = 0; j < 4; ++j) {
+ for (int k = 0; k < outputChannels; ++k)
+ o[k] += simpleDecoderFactors[k*4 + j]*input[j][i];
+ }
+ o += outputChannels;
+ }
+ return;
+ }
+
+ const float *matrix_hi = decoderData->hf[level - 1];
+ const float *matrix_lo = decoderData->lf[level - 1];
for (int i = 0; i < nSamples; ++i) {
QAmbisonicDecoderFilter::Output buf[maxAmbisonicChannels];
for (int j = 0; j < inputChannels; ++j)
buf[j] = filters[j].next(input[j][i]);
for (int j = 0; j < inputChannels; ++j) {
for (int k = 0; k < outputChannels; ++k)
- o[k] += matrix_lo[k*outputChannels + j]*buf[j].lf + matrix_hi[k*outputChannels + j]*buf[j].hf;
+ o[k] += matrix_lo[k*inputChannels + j]*buf[j].lf + matrix_hi[k*inputChannels + j]*buf[j].hf;
}
o += outputChannels;
}
@@ -203,21 +252,31 @@ void QAmbisonicDecoder::processBuffer(const float *input[], float *output, int n
void QAmbisonicDecoder::processBuffer(const float *input[], short *output, int nSamples)
{
- if (level == 0) {
- // ### copy W data
+ if (simpleDecoderFactors) {
+ for (int i = 0; i < nSamples; ++i) {
+ float o[4] = {};
+ for (int k = 0; k < outputChannels; ++k) {
+ for (int j = 0; j < 4; ++j)
+ o[k] += simpleDecoderFactors[k*4 + j]*input[j][i];
+ }
+ for (int k = 0; k < outputChannels; ++k)
+ output[k] = static_cast<short>(o[k]*32768.);
+ output += outputChannels;
+ }
return;
}
+
+ // qDebug() << "XXX" << inputChannels << outputChannels;
const float *matrix_hi = decoderData->hf[level - 1];
- const float *matrix_lo = decoderData->hf[level - 1];
+ const float *matrix_lo = decoderData->lf[level - 1];
for (int i = 0; i < nSamples; ++i) {
QAmbisonicDecoderFilter::Output buf[maxAmbisonicChannels];
for (int j = 0; j < inputChannels; ++j)
buf[j] = filters[j].next(input[j][i]);
- float o[32]; // we can't support more than 32 channels from our API
- memset(o, 0, 32*sizeof(short));
+ float o[32] = {}; // we can't support more than 32 channels from our API
for (int j = 0; j < inputChannels; ++j) {
for (int k = 0; k < outputChannels; ++k)
- o[k] += matrix_lo[k*outputChannels + j]*buf[j].lf + matrix_hi[k*outputChannels + j]*buf[j].hf;
+ o[k] += matrix_lo[k*inputChannels + j]*buf[j].lf + matrix_hi[k*inputChannels + j]*buf[j].hf;
}
for (int k = 0; k < outputChannels; ++k)
output[k] = static_cast<short>(o[k]*32768.);
diff --git a/src/multimedia/spatial/qambisonicdecoder_p.h b/src/multimedia/spatial/qambisonicdecoder_p.h
index 3c6d87b60..e52419f2d 100644
--- a/src/multimedia/spatial/qambisonicdecoder_p.h
+++ b/src/multimedia/spatial/qambisonicdecoder_p.h
@@ -71,6 +71,9 @@ public:
HighQuality = AmbisonicLevel3
};
QAmbisonicDecoder(AmbisonicLevel ambisonicLevel, const QAudioFormat &format);
+ ~QAmbisonicDecoder();
+
+ bool hasValidConfig() const { return outputChannels > 0; }
int nInputChannels() const { return inputChannels; }
int nOutputChannels() const { return outputChannels; }
@@ -84,12 +87,13 @@ public:
static constexpr int maxAmbisonicChannels = 16;
static constexpr int maxAmbisonicLevel = 3;
private:
- QAudioFormat format;
+ QAudioFormat::ChannelConfig channelConfig;
AmbisonicLevel level = AmbisonicLevel1;
int inputChannels = 0;
int outputChannels = 0;
const QAmbisonicDecoderData *decoderData = nullptr;
QAmbisonicDecoderFilter *filters = nullptr;
+ float *simpleDecoderFactors = nullptr;
};
diff --git a/src/multimedia/spatial/qambisonicdecoderdata_p.h b/src/multimedia/spatial/qambisonicdecoderdata_p.h
index fa7b462f4..1428efb03 100644
--- a/src/multimedia/spatial/qambisonicdecoderdata_p.h
+++ b/src/multimedia/spatial/qambisonicdecoderdata_p.h
@@ -57,364 +57,256 @@
QT_BEGIN_NAMESPACE
-// Decoder matrix for mono, ambisonic level 1
-static constexpr float decoderMatrix_mono_1_lf[1*4] = {
-0.471409f, 0.619827f, 0.000000f, 0.000000f, // C
-};
-
-// Decoder matrix for mono, ambisonic level 1
-static constexpr float decoderMatrix_mono_1_hf[1*4] = {
-0.666673f, 0.506086f, 0.000000f, 0.000000f, // C
-};
-
-// Decoder matrix for mono, ambisonic level 2
-static constexpr float decoderMatrix_mono_2_lf[1*9] = {
-0.471409f, 0.619827f, 0.000000f, 0.000000f, -0.138903f, 0.000000f, 0.000000f, 0.208318f, 0.000000f, // C
-};
-
-// Decoder matrix for mono, ambisonic level 2
-static constexpr float decoderMatrix_mono_2_hf[1*9] = {
-0.745364f, 0.759129f, 0.000000f, 0.000000f, -0.087850f, 0.000000f, 0.000000f, 0.131752f, 0.000000f, // C
-};
-
-// Decoder matrix for mono, ambisonic level 3
-static constexpr float decoderMatrix_mono_3_lf[1*16] = {
-0.471409f, 0.619827f, 0.000000f, 0.000000f, -0.138903f, 0.000000f, 0.000000f, 0.208318f, 0.000000f, 0.000000f, 0.080888f, 0.000000f, 0.000000f, 0.000000f, -0.097901f, 0.000000f, // C
-};
-
-// Decoder matrix for mono, ambisonic level 3
-static constexpr float decoderMatrix_mono_3_hf[1*16] = {
-0.786398f, 0.890402f, 0.000000f, 0.000000f, -0.141888f, 0.000000f, 0.000000f, 0.212793f, 0.000000f, 0.000000f, 0.041121f, 0.000000f, 0.000000f, 0.000000f, -0.049771f, 0.000000f, // C
-};
-
-// Decoder matrix for stereo, ambisonic level 1
-static constexpr float decoderMatrix_stereo_1_lf[2*4] = {
-0.280670f, 0.372187f, 0.240963f, 0.000000f, // L
-0.280656f, 0.372181f, -0.240980f, 0.000000f, // R
-};
-
-// Decoder matrix for stereo, ambisonic level 1
-static constexpr float decoderMatrix_stereo_1_hf[2*4] = {
-0.396928f, 0.303889f, 0.196746f, 0.000000f, // L
-0.396908f, 0.303884f, -0.196759f, 0.000000f, // R
-};
-
-// Decoder matrix for stereo, ambisonic level 2
-static constexpr float decoderMatrix_stereo_2_lf[2*9] = {
-0.280670f, 0.372187f, 0.240963f, 0.000000f, -0.085490f, 0.000000f, 0.000000f, 0.135154f, 0.311013f, // L
-0.280656f, 0.372181f, -0.240980f, 0.000000f, -0.085579f, 0.000000f, 0.000000f, 0.135130f, -0.311015f, // R
-};
-
-// Decoder matrix for stereo, ambisonic level 2
-static constexpr float decoderMatrix_stereo_2_hf[2*9] = {
-0.443779f, 0.455834f, 0.295119f, 0.000000f, -0.054068f, 0.000000f, 0.000000f, 0.085479f, 0.196702f, // L
-0.443757f, 0.455826f, -0.295139f, 0.000000f, -0.054125f, 0.000000f, 0.000000f, 0.085464f, -0.196703f, // R
-};
-
-// Decoder matrix for stereo, ambisonic level 3
-static constexpr float decoderMatrix_stereo_3_lf[2*16] = {
-0.280670f, 0.372187f, 0.240963f, 0.000000f, -0.085490f, 0.000000f, 0.000000f, 0.135154f, 0.311013f, 0.000000f, 0.045437f, 0.021103f, 0.000000f, 0.000000f, -0.035873f, 0.169918f, // L
-0.280656f, 0.372181f, -0.240980f, 0.000000f, -0.085579f, 0.000000f, 0.000000f, 0.135130f, -0.311015f, 0.000000f, 0.045414f, -0.021065f, 0.000000f, 0.000000f, -0.035873f, -0.169892f, // R
-};
-
-// Decoder matrix for stereo, ambisonic level 3
-static constexpr float decoderMatrix_stereo_3_hf[2*16] = {
-0.468210f, 0.534659f, 0.346152f, 0.000000f, -0.087326f, 0.000000f, 0.000000f, 0.138058f, 0.317696f, 0.000000f, 0.023099f, 0.010728f, 0.000000f, 0.000000f, -0.018237f, 0.086382f, // L
-0.468186f, 0.534650f, -0.346176f, 0.000000f, -0.087418f, 0.000000f, 0.000000f, 0.138033f, -0.317697f, 0.000000f, 0.023087f, -0.010709f, 0.000000f, 0.000000f, -0.018237f, -0.086369f, // R
-};
-
-// Decoder matrix for 2dot1, ambisonic level 1
-static constexpr float decoderMatrix_2dot1_1_lf[3*4] = {
-0.280670f, 0.372187f, 0.240963f, 0.000000f, // L
-0.280656f, 0.372181f, -0.240980f, 0.000000f, // R
-0.5f, 0.0f, 0.0f, 0.0f, // LFE
-};
-
-// Decoder matrix for 2dot1, ambisonic level 1
-static constexpr float decoderMatrix_2dot1_1_hf[3*4] = {
-0.396928f, 0.303889f, 0.196746f, 0.000000f, // L
-0.396908f, 0.303884f, -0.196759f, 0.000000f, // R
-0.0f, 0.0f, 0.0f, 0.0f, // LFE
-};
-
-// Decoder matrix for 2dot1, ambisonic level 2
-static constexpr float decoderMatrix_2dot1_2_lf[3*9] = {
-0.280670f, 0.372187f, 0.240963f, 0.000000f, -0.085490f, 0.000000f, 0.000000f, 0.135154f, 0.311013f, // L
-0.280656f, 0.372181f, -0.240980f, 0.000000f, -0.085579f, 0.000000f, 0.000000f, 0.135130f, -0.311015f, // R
-0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-};
-
-// Decoder matrix for 2dot1, ambisonic level 2
-static constexpr float decoderMatrix_2dot1_2_hf[3*9] = {
-0.443779f, 0.455834f, 0.295119f, 0.000000f, -0.054068f, 0.000000f, 0.000000f, 0.085479f, 0.196702f, // L
-0.443757f, 0.455826f, -0.295139f, 0.000000f, -0.054125f, 0.000000f, 0.000000f, 0.085464f, -0.196703f, // R
-0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-};
-
-// Decoder matrix for 2dot1, ambisonic level 3
-static constexpr float decoderMatrix_2dot1_3_lf[3*16] = {
-0.280670f, 0.372187f, 0.240963f, 0.000000f, -0.085490f, 0.000000f, 0.000000f, 0.135154f, 0.311013f, 0.000000f, 0.045437f, 0.021103f, 0.000000f, 0.000000f, -0.035873f, 0.169918f, // L
-0.280656f, 0.372181f, -0.240980f, 0.000000f, -0.085579f, 0.000000f, 0.000000f, 0.135130f, -0.311015f, 0.000000f, 0.045414f, -0.021065f, 0.000000f, 0.000000f, -0.035873f, -0.169892f, // R
-0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-};
-
-// Decoder matrix for 2dot1, ambisonic level 3
-static constexpr float decoderMatrix_2dot1_3_hf[3*16] = {
-0.468210f, 0.534659f, 0.346152f, 0.000000f, -0.087326f, 0.000000f, 0.000000f, 0.138058f, 0.317696f, 0.000000f, 0.023099f, 0.010728f, 0.000000f, 0.000000f, -0.018237f, 0.086382f, // L
-0.468186f, 0.534650f, -0.346176f, 0.000000f, -0.087418f, 0.000000f, 0.000000f, 0.138033f, -0.317697f, 0.000000f, 0.023087f, -0.010709f, 0.000000f, 0.000000f, -0.018237f, -0.086369f, // R
-0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-};
-
// Decoder matrix for 5dot0, ambisonic level 1
static constexpr float decoderMatrix_5dot0_1_lf[5*4] = {
-0.240964f, 0.257639f, 0.287251f, 0.000000f, // L
-0.240957f, 0.257633f, -0.287251f, 0.000000f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, // C
-0.520591f, -0.419052f, 0.415955f, 0.000000f, // Ls
-0.520596f, -0.419047f, -0.415960f, 0.000000f, // Rs
+0.170387f, 0.287251f, 0.000000f, 0.257639f, // L
+0.170382f, -0.287251f, 0.000000f, 0.257633f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, // C
+0.368113f, 0.415955f, 0.000000f, -0.419052f, // Ls
+0.368117f, -0.415960f, 0.000000f, -0.419047f, // Rs
};
// Decoder matrix for 5dot0, ambisonic level 1
static constexpr float decoderMatrix_5dot0_1_hf[5*4] = {
-0.340774f, 0.210361f, 0.234540f, 0.000000f, // L
-0.340764f, 0.210357f, -0.234540f, 0.000000f, // R
-0.180812f, 0.179246f, 0.000000f, 0.000000f, // C
-0.736226f, -0.342155f, 0.339626f, 0.000000f, // Ls
-0.736233f, -0.342151f, -0.339630f, 0.000000f, // Rs
+0.240964f, 0.234540f, 0.000000f, 0.210361f, // L
+0.240957f, -0.234540f, 0.000000f, 0.210357f, // R
+0.127854f, 0.000000f, 0.000000f, 0.179246f, // C
+0.520591f, 0.339626f, 0.000000f, -0.342155f, // Ls
+0.520596f, -0.339630f, 0.000000f, -0.342151f, // Rs
};
// Decoder matrix for 5dot0, ambisonic level 2
static constexpr float decoderMatrix_5dot0_2_lf[5*9] = {
-0.240964f, 0.257639f, 0.287251f, 0.000000f, -0.063536f, 0.000000f, 0.000000f, -0.026015f, 0.315018f, // L
-0.240957f, 0.257633f, -0.287251f, 0.000000f, -0.063562f, 0.000000f, 0.000000f, -0.026018f, -0.315014f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.000000f, 0.222021f, 0.000000f, // C
-0.520591f, -0.419052f, 0.415955f, 0.000000f, -0.092715f, 0.000000f, 0.000000f, -0.061595f, -0.083957f, // Ls
-0.520596f, -0.419047f, -0.415960f, 0.000000f, -0.092693f, 0.000000f, 0.000000f, -0.061591f, 0.083957f, // Rs
+0.170387f, 0.287251f, 0.000000f, 0.257639f, 0.105006f, 0.000000f, -0.063536f, 0.000000f, -0.008672f, // L
+0.170382f, -0.287251f, 0.000000f, 0.257633f, -0.105005f, 0.000000f, -0.063562f, 0.000000f, -0.008673f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.074007f, // C
+0.368113f, 0.415955f, 0.000000f, -0.419052f, -0.027986f, 0.000000f, -0.092715f, 0.000000f, -0.020532f, // Ls
+0.368117f, -0.415960f, 0.000000f, -0.419047f, 0.027986f, 0.000000f, -0.092693f, 0.000000f, -0.020530f, // Rs
};
// Decoder matrix for 5dot0, ambisonic level 2
static constexpr float decoderMatrix_5dot0_2_hf[5*9] = {
-0.380997f, 0.315542f, 0.351810f, 0.000000f, -0.040184f, 0.000000f, 0.000000f, -0.016453f, 0.199235f, // L
-0.380986f, 0.315535f, -0.351809f, 0.000000f, -0.040200f, 0.000000f, 0.000000f, -0.016455f, -0.199232f, // R
-0.202154f, 0.268870f, 0.000000f, 0.000000f, -0.023656f, 0.000000f, 0.000000f, 0.140418f, 0.000000f, // C
-0.823126f, -0.513232f, 0.509439f, 0.000000f, -0.058638f, 0.000000f, 0.000000f, -0.038956f, -0.053099f, // Ls
-0.823134f, -0.513226f, -0.509444f, 0.000000f, -0.058624f, 0.000000f, 0.000000f, -0.038954f, 0.053099f, // Rs
+0.269405f, 0.351810f, 0.000000f, 0.315542f, 0.066412f, 0.000000f, -0.040184f, 0.000000f, -0.005484f, // L
+0.269398f, -0.351809f, 0.000000f, 0.315535f, -0.066411f, 0.000000f, -0.040200f, 0.000000f, -0.005485f, // R
+0.142945f, 0.000000f, 0.000000f, 0.268870f, 0.000000f, 0.000000f, -0.023656f, 0.000000f, 0.046806f, // C
+0.582038f, 0.509439f, 0.000000f, -0.513232f, -0.017700f, 0.000000f, -0.058638f, 0.000000f, -0.012985f, // Ls
+0.582043f, -0.509444f, 0.000000f, -0.513226f, 0.017700f, 0.000000f, -0.058624f, 0.000000f, -0.012985f, // Rs
};
// Decoder matrix for 5dot0, ambisonic level 3
static constexpr float decoderMatrix_5dot0_3_lf[5*16] = {
-0.240964f, 0.257639f, 0.287251f, 0.000000f, -0.063536f, 0.000000f, 0.000000f, -0.026015f, 0.315018f, 0.000000f, 0.035335f, 0.041639f, 0.000000f, 0.000000f, -0.142145f, 0.134220f, // L
-0.240957f, 0.257633f, -0.287251f, 0.000000f, -0.063562f, 0.000000f, 0.000000f, -0.026018f, -0.315014f, 0.000000f, 0.035320f, -0.041624f, 0.000000f, 0.000000f, -0.142141f, -0.134218f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.000000f, 0.222021f, 0.000000f, 0.000000f, 0.026162f, 0.000000f, 0.000000f, 0.000000f, 0.204779f, 0.000000f, // C
-0.520591f, -0.419052f, 0.415955f, 0.000000f, -0.092715f, 0.000000f, 0.000000f, -0.061595f, -0.083957f, 0.000000f, -0.101526f, 0.068569f, 0.000000f, 0.000000f, -0.017680f, -0.126417f, // Ls
-0.520596f, -0.419047f, -0.415960f, 0.000000f, -0.092693f, 0.000000f, 0.000000f, -0.061591f, 0.083957f, 0.000000f, -0.101519f, -0.068568f, 0.000000f, 0.000000f, -0.017687f, 0.126417f, // Rs
+0.170387f, 0.287251f, 0.000000f, 0.257639f, 0.105006f, 0.000000f, -0.063536f, 0.000000f, -0.008672f, 0.008948f, 0.000000f, 0.020158f, 0.000000f, 0.017107f, 0.000000f, -0.009476f, // L
+0.170382f, -0.287251f, 0.000000f, 0.257633f, -0.105005f, 0.000000f, -0.063562f, 0.000000f, -0.008673f, -0.008948f, 0.000000f, -0.020151f, 0.000000f, 0.017099f, 0.000000f, -0.009476f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.074007f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.012666f, 0.000000f, 0.013652f, // C
+0.368113f, 0.415955f, 0.000000f, -0.419052f, -0.027986f, 0.000000f, -0.092715f, 0.000000f, -0.020532f, -0.008428f, 0.000000f, 0.033196f, 0.000000f, -0.049151f, 0.000000f, -0.001179f, // Ls
+0.368117f, -0.415960f, 0.000000f, -0.419047f, 0.027986f, 0.000000f, -0.092693f, 0.000000f, -0.020530f, 0.008428f, 0.000000f, -0.033195f, 0.000000f, -0.049148f, 0.000000f, -0.001179f, // Rs
};
// Decoder matrix for 5dot0, ambisonic level 3
static constexpr float decoderMatrix_5dot0_3_hf[5*16] = {
-0.401972f, 0.370107f, 0.412646f, 0.000000f, -0.064901f, 0.000000f, 0.000000f, -0.026574f, 0.321786f, 0.000000f, 0.017964f, 0.021168f, 0.000000f, 0.000000f, -0.072263f, 0.068234f, // L
-0.401960f, 0.370099f, -0.412646f, 0.000000f, -0.064928f, 0.000000f, 0.000000f, -0.026577f, -0.321782f, 0.000000f, 0.017956f, -0.021161f, 0.000000f, 0.000000f, -0.072261f, -0.068233f, // R
-0.213283f, 0.315364f, 0.000000f, 0.000000f, -0.038207f, 0.000000f, 0.000000f, 0.226791f, 0.000000f, 0.000000f, 0.013300f, 0.000000f, 0.000000f, 0.000000f, 0.104104f, 0.000000f, // C
-0.868441f, -0.601983f, 0.597533f, 0.000000f, -0.094707f, 0.000000f, 0.000000f, -0.062919f, -0.085760f, 0.000000f, -0.051613f, 0.034859f, 0.000000f, 0.000000f, -0.008988f, -0.064267f, // Ls
-0.868449f, -0.601975f, -0.597540f, 0.000000f, -0.094684f, 0.000000f, 0.000000f, -0.062915f, 0.085761f, 0.000000f, -0.051609f, -0.034858f, 0.000000f, 0.000000f, -0.008992f, 0.064267f, // Rs
+0.284237f, 0.412646f, 0.000000f, 0.370107f, 0.107262f, 0.000000f, -0.064901f, 0.000000f, -0.008858f, 0.004549f, 0.000000f, 0.010248f, 0.000000f, 0.008697f, 0.000000f, -0.004818f, // L
+0.284229f, -0.412646f, 0.000000f, 0.370099f, -0.107261f, 0.000000f, -0.064928f, 0.000000f, -0.008859f, -0.004549f, 0.000000f, -0.010244f, 0.000000f, 0.008693f, 0.000000f, -0.004817f, // R
+0.150814f, 0.000000f, 0.000000f, 0.315364f, 0.000000f, 0.000000f, -0.038207f, 0.000000f, 0.075597f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.006439f, 0.000000f, 0.006940f, // C
+0.614081f, 0.597533f, 0.000000f, -0.601983f, -0.028587f, 0.000000f, -0.094707f, 0.000000f, -0.020973f, -0.004284f, 0.000000f, 0.016876f, 0.000000f, -0.024987f, 0.000000f, -0.000599f, // Ls
+0.614086f, -0.597540f, 0.000000f, -0.601975f, 0.028587f, 0.000000f, -0.094684f, 0.000000f, -0.020972f, 0.004284f, 0.000000f, -0.016876f, 0.000000f, -0.024985f, 0.000000f, -0.000599f, // Rs
};
// Decoder matrix for 5dot1, ambisonic level 1
static constexpr float decoderMatrix_5dot1_1_lf[6*4] = {
-0.240964f, 0.257639f, 0.287251f, 0.000000f, // L
-0.240957f, 0.257633f, -0.287251f, 0.000000f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, // C
+0.170387f, 0.287251f, 0.000000f, 0.257639f, // L
+0.170382f, -0.287251f, 0.000000f, 0.257633f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, // C
0.5f, 0.0f, 0.0f, 0.0f, // LFE
-0.520591f, -0.419052f, 0.415955f, 0.000000f, // Ls
-0.520596f, -0.419047f, -0.415960f, 0.000000f, // Rs
+0.368113f, 0.415955f, 0.000000f, -0.419052f, // Ls
+0.368117f, -0.415960f, 0.000000f, -0.419047f, // Rs
};
// Decoder matrix for 5dot1, ambisonic level 1
static constexpr float decoderMatrix_5dot1_1_hf[6*4] = {
-0.340774f, 0.210361f, 0.234540f, 0.000000f, // L
-0.340764f, 0.210357f, -0.234540f, 0.000000f, // R
-0.180812f, 0.179246f, 0.000000f, 0.000000f, // C
+0.240964f, 0.234540f, 0.000000f, 0.210361f, // L
+0.240957f, -0.234540f, 0.000000f, 0.210357f, // R
+0.127854f, 0.000000f, 0.000000f, 0.179246f, // C
0.0f, 0.0f, 0.0f, 0.0f, // LFE
-0.736226f, -0.342155f, 0.339626f, 0.000000f, // Ls
-0.736233f, -0.342151f, -0.339630f, 0.000000f, // Rs
+0.520591f, 0.339626f, 0.000000f, -0.342155f, // Ls
+0.520596f, -0.339630f, 0.000000f, -0.342151f, // Rs
};
// Decoder matrix for 5dot1, ambisonic level 2
static constexpr float decoderMatrix_5dot1_2_lf[6*9] = {
-0.240964f, 0.257639f, 0.287251f, 0.000000f, -0.063536f, 0.000000f, 0.000000f, -0.026015f, 0.315018f, // L
-0.240957f, 0.257633f, -0.287251f, 0.000000f, -0.063562f, 0.000000f, 0.000000f, -0.026018f, -0.315014f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.000000f, 0.222021f, 0.000000f, // C
+0.170387f, 0.287251f, 0.000000f, 0.257639f, 0.105006f, 0.000000f, -0.063536f, 0.000000f, -0.008672f, // L
+0.170382f, -0.287251f, 0.000000f, 0.257633f, -0.105005f, 0.000000f, -0.063562f, 0.000000f, -0.008673f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.074007f, // C
0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-0.520591f, -0.419052f, 0.415955f, 0.000000f, -0.092715f, 0.000000f, 0.000000f, -0.061595f, -0.083957f, // Ls
-0.520596f, -0.419047f, -0.415960f, 0.000000f, -0.092693f, 0.000000f, 0.000000f, -0.061591f, 0.083957f, // Rs
+0.368113f, 0.415955f, 0.000000f, -0.419052f, -0.027986f, 0.000000f, -0.092715f, 0.000000f, -0.020532f, // Ls
+0.368117f, -0.415960f, 0.000000f, -0.419047f, 0.027986f, 0.000000f, -0.092693f, 0.000000f, -0.020530f, // Rs
};
// Decoder matrix for 5dot1, ambisonic level 2
static constexpr float decoderMatrix_5dot1_2_hf[6*9] = {
-0.380997f, 0.315542f, 0.351810f, 0.000000f, -0.040184f, 0.000000f, 0.000000f, -0.016453f, 0.199235f, // L
-0.380986f, 0.315535f, -0.351809f, 0.000000f, -0.040200f, 0.000000f, 0.000000f, -0.016455f, -0.199232f, // R
-0.202154f, 0.268870f, 0.000000f, 0.000000f, -0.023656f, 0.000000f, 0.000000f, 0.140418f, 0.000000f, // C
+0.269405f, 0.351810f, 0.000000f, 0.315542f, 0.066412f, 0.000000f, -0.040184f, 0.000000f, -0.005484f, // L
+0.269398f, -0.351809f, 0.000000f, 0.315535f, -0.066411f, 0.000000f, -0.040200f, 0.000000f, -0.005485f, // R
+0.142945f, 0.000000f, 0.000000f, 0.268870f, 0.000000f, 0.000000f, -0.023656f, 0.000000f, 0.046806f, // C
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-0.823126f, -0.513232f, 0.509439f, 0.000000f, -0.058638f, 0.000000f, 0.000000f, -0.038956f, -0.053099f, // Ls
-0.823134f, -0.513226f, -0.509444f, 0.000000f, -0.058624f, 0.000000f, 0.000000f, -0.038954f, 0.053099f, // Rs
+0.582038f, 0.509439f, 0.000000f, -0.513232f, -0.017700f, 0.000000f, -0.058638f, 0.000000f, -0.012985f, // Ls
+0.582043f, -0.509444f, 0.000000f, -0.513226f, 0.017700f, 0.000000f, -0.058624f, 0.000000f, -0.012985f, // Rs
};
// Decoder matrix for 5dot1, ambisonic level 3
static constexpr float decoderMatrix_5dot1_3_lf[6*16] = {
-0.240964f, 0.257639f, 0.287251f, 0.000000f, -0.063536f, 0.000000f, 0.000000f, -0.026015f, 0.315018f, 0.000000f, 0.035335f, 0.041639f, 0.000000f, 0.000000f, -0.142145f, 0.134220f, // L
-0.240957f, 0.257633f, -0.287251f, 0.000000f, -0.063562f, 0.000000f, 0.000000f, -0.026018f, -0.315014f, 0.000000f, 0.035320f, -0.041624f, 0.000000f, 0.000000f, -0.142141f, -0.134218f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.000000f, 0.222021f, 0.000000f, 0.000000f, 0.026162f, 0.000000f, 0.000000f, 0.000000f, 0.204779f, 0.000000f, // C
+0.170387f, 0.287251f, 0.000000f, 0.257639f, 0.105006f, 0.000000f, -0.063536f, 0.000000f, -0.008672f, 0.008948f, 0.000000f, 0.020158f, 0.000000f, 0.017107f, 0.000000f, -0.009476f, // L
+0.170382f, -0.287251f, 0.000000f, 0.257633f, -0.105005f, 0.000000f, -0.063562f, 0.000000f, -0.008673f, -0.008948f, 0.000000f, -0.020151f, 0.000000f, 0.017099f, 0.000000f, -0.009476f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.074007f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.012666f, 0.000000f, 0.013652f, // C
0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-0.520591f, -0.419052f, 0.415955f, 0.000000f, -0.092715f, 0.000000f, 0.000000f, -0.061595f, -0.083957f, 0.000000f, -0.101526f, 0.068569f, 0.000000f, 0.000000f, -0.017680f, -0.126417f, // Ls
-0.520596f, -0.419047f, -0.415960f, 0.000000f, -0.092693f, 0.000000f, 0.000000f, -0.061591f, 0.083957f, 0.000000f, -0.101519f, -0.068568f, 0.000000f, 0.000000f, -0.017687f, 0.126417f, // Rs
+0.368113f, 0.415955f, 0.000000f, -0.419052f, -0.027986f, 0.000000f, -0.092715f, 0.000000f, -0.020532f, -0.008428f, 0.000000f, 0.033196f, 0.000000f, -0.049151f, 0.000000f, -0.001179f, // Ls
+0.368117f, -0.415960f, 0.000000f, -0.419047f, 0.027986f, 0.000000f, -0.092693f, 0.000000f, -0.020530f, 0.008428f, 0.000000f, -0.033195f, 0.000000f, -0.049148f, 0.000000f, -0.001179f, // Rs
};
// Decoder matrix for 5dot1, ambisonic level 3
static constexpr float decoderMatrix_5dot1_3_hf[6*16] = {
-0.401972f, 0.370107f, 0.412646f, 0.000000f, -0.064901f, 0.000000f, 0.000000f, -0.026574f, 0.321786f, 0.000000f, 0.017964f, 0.021168f, 0.000000f, 0.000000f, -0.072263f, 0.068234f, // L
-0.401960f, 0.370099f, -0.412646f, 0.000000f, -0.064928f, 0.000000f, 0.000000f, -0.026577f, -0.321782f, 0.000000f, 0.017956f, -0.021161f, 0.000000f, 0.000000f, -0.072261f, -0.068233f, // R
-0.213283f, 0.315364f, 0.000000f, 0.000000f, -0.038207f, 0.000000f, 0.000000f, 0.226791f, 0.000000f, 0.000000f, 0.013300f, 0.000000f, 0.000000f, 0.000000f, 0.104104f, 0.000000f, // C
+0.284237f, 0.412646f, 0.000000f, 0.370107f, 0.107262f, 0.000000f, -0.064901f, 0.000000f, -0.008858f, 0.004549f, 0.000000f, 0.010248f, 0.000000f, 0.008697f, 0.000000f, -0.004818f, // L
+0.284229f, -0.412646f, 0.000000f, 0.370099f, -0.107261f, 0.000000f, -0.064928f, 0.000000f, -0.008859f, -0.004549f, 0.000000f, -0.010244f, 0.000000f, 0.008693f, 0.000000f, -0.004817f, // R
+0.150814f, 0.000000f, 0.000000f, 0.315364f, 0.000000f, 0.000000f, -0.038207f, 0.000000f, 0.075597f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.006439f, 0.000000f, 0.006940f, // C
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-0.868441f, -0.601983f, 0.597533f, 0.000000f, -0.094707f, 0.000000f, 0.000000f, -0.062919f, -0.085760f, 0.000000f, -0.051613f, 0.034859f, 0.000000f, 0.000000f, -0.008988f, -0.064267f, // Ls
-0.868449f, -0.601975f, -0.597540f, 0.000000f, -0.094684f, 0.000000f, 0.000000f, -0.062915f, 0.085761f, 0.000000f, -0.051609f, -0.034858f, 0.000000f, 0.000000f, -0.008992f, 0.064267f, // Rs
+0.614081f, 0.597533f, 0.000000f, -0.601983f, -0.028587f, 0.000000f, -0.094707f, 0.000000f, -0.020973f, -0.004284f, 0.000000f, 0.016876f, 0.000000f, -0.024987f, 0.000000f, -0.000599f, // Ls
+0.614086f, -0.597540f, 0.000000f, -0.601975f, 0.028587f, 0.000000f, -0.094684f, 0.000000f, -0.020972f, 0.004284f, 0.000000f, -0.016876f, 0.000000f, -0.024985f, 0.000000f, -0.000599f, // Rs
};
// Decoder matrix for 7dot0, ambisonic level 1
static constexpr float decoderMatrix_7dot0_1_lf[7*4] = {
-0.194124f, 0.244088f, 0.209910f, 0.000000f, // L
-0.194108f, 0.244084f, -0.209914f, 0.000000f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, // C
-0.260404f, 0.000000f, 0.413172f, 0.000000f, // Ls
-0.260430f, 0.000000f, -0.413179f, 0.000000f, // Rs
-0.260425f, -0.357822f, 0.206589f, 0.000000f, // Lb
-0.260400f, -0.357815f, -0.206595f, 0.000000f, // Rb
+0.137267f, 0.209910f, 0.000000f, 0.244088f, // L
+0.137255f, -0.209914f, 0.000000f, 0.244084f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, // C
+0.184133f, 0.413172f, 0.000000f, 0.000000f, // Ls
+0.184152f, -0.413179f, 0.000000f, 0.000000f, // Rs
+0.184148f, 0.206589f, 0.000000f, -0.357822f, // Lb
+0.184131f, -0.206595f, 0.000000f, -0.357815f, // Rb
};
// Decoder matrix for 7dot0, ambisonic level 1
static constexpr float decoderMatrix_7dot0_1_hf[7*4] = {
-0.274533f, 0.199297f, 0.171391f, 0.000000f, // L
-0.274510f, 0.199294f, -0.171394f, 0.000000f, // R
-0.180812f, 0.179246f, 0.000000f, 0.000000f, // C
-0.368266f, 0.000000f, 0.337353f, 0.000000f, // Ls
-0.368304f, 0.000000f, -0.337359f, 0.000000f, // Rs
-0.368297f, -0.292160f, 0.168680f, 0.000000f, // Lb
-0.368261f, -0.292155f, -0.168684f, 0.000000f, // Rb
+0.194124f, 0.171391f, 0.000000f, 0.199297f, // L
+0.194108f, -0.171394f, 0.000000f, 0.199294f, // R
+0.127854f, 0.000000f, 0.000000f, 0.179246f, // C
+0.260404f, 0.337353f, 0.000000f, 0.000000f, // Ls
+0.260430f, -0.337359f, 0.000000f, 0.000000f, // Rs
+0.260425f, 0.168680f, 0.000000f, -0.292160f, // Lb
+0.260400f, -0.168684f, 0.000000f, -0.292155f, // Rb
};
// Decoder matrix for 7dot0, ambisonic level 2
static constexpr float decoderMatrix_7dot0_2_lf[7*9] = {
-0.194124f, 0.244088f, 0.209910f, 0.000000f, -0.054359f, 0.000000f, 0.000000f, 0.046706f, 0.289736f, // L
-0.194108f, 0.244084f, -0.209914f, 0.000000f, -0.054434f, 0.000000f, 0.000000f, 0.046694f, -0.289734f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.000000f, 0.222021f, 0.000000f, // C
-0.260404f, 0.000000f, 0.413172f, 0.000000f, -0.071326f, 0.000000f, 0.000000f, -0.326534f, 0.000000f, // Ls
-0.260430f, 0.000000f, -0.413179f, 0.000000f, -0.071237f, 0.000000f, 0.000000f, -0.326534f, 0.000000f, // Rs
-0.260425f, -0.357822f, 0.206589f, 0.000000f, -0.071249f, 0.000000f, 0.000000f, 0.163267f, -0.282791f, // Lb
-0.260400f, -0.357815f, -0.206595f, 0.000000f, -0.071359f, 0.000000f, 0.000000f, 0.163256f, 0.282788f, // Rb
+0.137267f, 0.209910f, 0.000000f, 0.244088f, 0.096579f, 0.000000f, -0.054359f, 0.000000f, 0.015569f, // L
+0.137255f, -0.209914f, 0.000000f, 0.244084f, -0.096578f, 0.000000f, -0.054434f, 0.000000f, 0.015565f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.074007f, // C
+0.184133f, 0.413172f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.071326f, 0.000000f, -0.108845f, // Ls
+0.184152f, -0.413179f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.071237f, 0.000000f, -0.108845f, // Rs
+0.184148f, 0.206589f, 0.000000f, -0.357822f, -0.094264f, 0.000000f, -0.071249f, 0.000000f, 0.054422f, // Lb
+0.184131f, -0.206595f, 0.000000f, -0.357815f, 0.094263f, 0.000000f, -0.071359f, 0.000000f, 0.054419f, // Rb
};
// Decoder matrix for 7dot0, ambisonic level 2
static constexpr float decoderMatrix_7dot0_2_hf[7*9] = {
-0.306937f, 0.298946f, 0.257087f, 0.000000f, -0.034380f, 0.000000f, 0.000000f, 0.029540f, 0.183245f, // L
-0.306912f, 0.298940f, -0.257091f, 0.000000f, -0.034427f, 0.000000f, 0.000000f, 0.029532f, -0.183244f, // R
-0.202154f, 0.268870f, 0.000000f, 0.000000f, -0.023656f, 0.000000f, 0.000000f, 0.140418f, 0.000000f, // C
-0.411734f, 0.000000f, 0.506030f, 0.000000f, -0.045111f, 0.000000f, 0.000000f, -0.206518f, 0.000000f, // Ls
-0.411776f, 0.000000f, -0.506039f, 0.000000f, -0.045054f, 0.000000f, 0.000000f, -0.206518f, 0.000000f, // Rs
-0.411768f, -0.438240f, 0.253019f, 0.000000f, -0.045062f, 0.000000f, 0.000000f, 0.103259f, -0.178853f, // Lb
-0.411728f, -0.438232f, -0.253026f, 0.000000f, -0.045131f, 0.000000f, 0.000000f, 0.103252f, 0.178851f, // Rb
+0.217038f, 0.257087f, 0.000000f, 0.298946f, 0.061082f, 0.000000f, -0.034380f, 0.000000f, 0.009847f, // L
+0.217019f, -0.257091f, 0.000000f, 0.298940f, -0.061081f, 0.000000f, -0.034427f, 0.000000f, 0.009844f, // R
+0.142945f, 0.000000f, 0.000000f, 0.268870f, 0.000000f, 0.000000f, -0.023656f, 0.000000f, 0.046806f, // C
+0.291140f, 0.506030f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.045111f, 0.000000f, -0.068839f, // Ls
+0.291170f, -0.506039f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.045054f, 0.000000f, -0.068839f, // Rs
+0.291164f, 0.253019f, 0.000000f, -0.438240f, -0.059618f, 0.000000f, -0.045062f, 0.000000f, 0.034420f, // Lb
+0.291136f, -0.253026f, 0.000000f, -0.438232f, 0.059617f, 0.000000f, -0.045131f, 0.000000f, 0.034417f, // Rb
};
// Decoder matrix for 7dot0, ambisonic level 3
static constexpr float decoderMatrix_7dot0_3_lf[7*16] = {
-0.194124f, 0.244088f, 0.209910f, 0.000000f, -0.054359f, 0.000000f, 0.000000f, 0.046706f, 0.289736f, 0.000000f, 0.031236f, 0.027345f, 0.000000f, 0.000000f, -0.110659f, 0.194894f, // L
-0.194108f, 0.244084f, -0.209914f, 0.000000f, -0.054434f, 0.000000f, 0.000000f, 0.046694f, -0.289734f, 0.000000f, 0.031217f, -0.027307f, 0.000000f, 0.000000f, -0.110659f, -0.194879f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.000000f, 0.222021f, 0.000000f, 0.000000f, 0.026162f, 0.000000f, 0.000000f, 0.000000f, 0.204779f, 0.000000f, // C
-0.260404f, 0.000000f, 0.413172f, 0.000000f, -0.071326f, 0.000000f, 0.000000f, -0.326534f, 0.000000f, 0.000000f, 0.000000f, 0.055313f, 0.000000f, 0.000000f, 0.000000f, -0.185006f, // Ls
-0.260430f, 0.000000f, -0.413179f, 0.000000f, -0.071237f, 0.000000f, 0.000000f, -0.326534f, 0.000000f, 0.000000f, 0.000000f, -0.055349f, 0.000000f, 0.000000f, 0.000000f, 0.185008f, // Rs
-0.260425f, -0.357822f, 0.206589f, 0.000000f, -0.071249f, 0.000000f, 0.000000f, 0.163267f, -0.282791f, 0.000000f, -0.047935f, 0.027670f, 0.000000f, 0.000000f, 0.000000f, 0.185014f, // Lb
-0.260400f, -0.357815f, -0.206595f, 0.000000f, -0.071359f, 0.000000f, 0.000000f, 0.163256f, 0.282788f, 0.000000f, -0.047893f, -0.027649f, 0.000000f, 0.000000f, 0.000000f, -0.184996f, // Rb
+0.137267f, 0.209910f, 0.000000f, 0.244088f, 0.096579f, 0.000000f, -0.054359f, 0.000000f, 0.015569f, 0.012993f, 0.000000f, 0.013238f, 0.000000f, 0.015122f, 0.000000f, -0.007377f, // L
+0.137255f, -0.209914f, 0.000000f, 0.244084f, -0.096578f, 0.000000f, -0.054434f, 0.000000f, 0.015565f, -0.012992f, 0.000000f, -0.013220f, 0.000000f, 0.015113f, 0.000000f, -0.007377f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.074007f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.012666f, 0.000000f, 0.013652f, // C
+0.184133f, 0.413172f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.071326f, 0.000000f, -0.108845f, -0.012334f, 0.000000f, 0.026779f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, // Ls
+0.184152f, -0.413179f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.071237f, 0.000000f, -0.108845f, 0.012334f, 0.000000f, -0.026796f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, // Rs
+0.184148f, 0.206589f, 0.000000f, -0.357822f, -0.094264f, 0.000000f, -0.071249f, 0.000000f, 0.054422f, 0.012334f, 0.000000f, 0.013396f, 0.000000f, -0.023206f, 0.000000f, 0.000000f, // Lb
+0.184131f, -0.206595f, 0.000000f, -0.357815f, 0.094263f, 0.000000f, -0.071359f, 0.000000f, 0.054419f, -0.012333f, 0.000000f, -0.013386f, 0.000000f, -0.023186f, 0.000000f, 0.000000f, // Rb
};
// Decoder matrix for 7dot0, ambisonic level 3
static constexpr float decoderMatrix_7dot0_3_hf[7*16] = {
-0.323835f, 0.350641f, 0.301543f, 0.000000f, -0.055527f, 0.000000f, 0.000000f, 0.047710f, 0.295961f, 0.000000f, 0.015880f, 0.013901f, 0.000000f, 0.000000f, -0.056256f, 0.099079f, // L
-0.323808f, 0.350635f, -0.301549f, 0.000000f, -0.055604f, 0.000000f, 0.000000f, 0.047697f, -0.295959f, 0.000000f, 0.015870f, -0.013882f, 0.000000f, 0.000000f, -0.056256f, -0.099072f, // R
-0.213283f, 0.315364f, 0.000000f, 0.000000f, -0.038207f, 0.000000f, 0.000000f, 0.226791f, 0.000000f, 0.000000f, 0.013300f, 0.000000f, 0.000000f, 0.000000f, 0.104104f, 0.000000f, // C
-0.434401f, 0.000000f, 0.593535f, 0.000000f, -0.072859f, 0.000000f, 0.000000f, -0.333550f, 0.000000f, 0.000000f, 0.000000f, 0.028120f, 0.000000f, 0.000000f, 0.000000f, -0.094052f, // Ls
-0.434446f, 0.000000f, -0.593546f, 0.000000f, -0.072768f, 0.000000f, 0.000000f, -0.333550f, 0.000000f, 0.000000f, 0.000000f, -0.028138f, 0.000000f, 0.000000f, 0.000000f, 0.094053f, // Rs
-0.434437f, -0.514023f, 0.296773f, 0.000000f, -0.072780f, 0.000000f, 0.000000f, 0.166775f, -0.288867f, 0.000000f, -0.024369f, 0.014067f, 0.000000f, 0.000000f, 0.000000f, 0.094056f, // Lb
-0.434395f, -0.514014f, -0.296781f, 0.000000f, -0.072892f, 0.000000f, 0.000000f, 0.166764f, 0.288864f, 0.000000f, -0.024348f, -0.014056f, 0.000000f, 0.000000f, 0.000000f, -0.094047f, // Rb
+0.228986f, 0.301543f, 0.000000f, 0.350641f, 0.098654f, 0.000000f, -0.055527f, 0.000000f, 0.015903f, 0.006605f, 0.000000f, 0.006730f, 0.000000f, 0.007688f, 0.000000f, -0.003750f, // L
+0.228967f, -0.301549f, 0.000000f, 0.350635f, -0.098653f, 0.000000f, -0.055604f, 0.000000f, 0.015899f, -0.006605f, 0.000000f, -0.006721f, 0.000000f, 0.007683f, 0.000000f, -0.003750f, // R
+0.150814f, 0.000000f, 0.000000f, 0.315364f, 0.000000f, 0.000000f, -0.038207f, 0.000000f, 0.075597f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.006439f, 0.000000f, 0.006940f, // C
+0.307168f, 0.593535f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.072859f, 0.000000f, -0.111183f, -0.006270f, 0.000000f, 0.013613f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, // Ls
+0.307199f, -0.593546f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.072768f, 0.000000f, -0.111183f, 0.006270f, 0.000000f, -0.013622f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, // Rs
+0.307193f, 0.296773f, 0.000000f, -0.514023f, -0.096289f, 0.000000f, -0.072780f, 0.000000f, 0.055592f, 0.006270f, 0.000000f, 0.006810f, 0.000000f, -0.011797f, 0.000000f, 0.000000f, // Lb
+0.307164f, -0.296781f, 0.000000f, -0.514014f, 0.096288f, 0.000000f, -0.072892f, 0.000000f, 0.055588f, -0.006270f, 0.000000f, -0.006805f, 0.000000f, -0.011787f, 0.000000f, 0.000000f, // Rb
};
// Decoder matrix for 7dot1, ambisonic level 1
static constexpr float decoderMatrix_7dot1_1_lf[8*4] = {
-0.194124f, 0.244088f, 0.209910f, 0.000000f, // L
-0.194108f, 0.244084f, -0.209914f, 0.000000f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, // C
+0.137267f, 0.209910f, 0.000000f, 0.244088f, // L
+0.137255f, -0.209914f, 0.000000f, 0.244084f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, // C
0.5f, 0.0f, 0.0f, 0.0f, // LFE
-0.260404f, 0.000000f, 0.413172f, 0.000000f, // Ls
-0.260430f, 0.000000f, -0.413179f, 0.000000f, // Rs
-0.260425f, -0.357822f, 0.206589f, 0.000000f, // Lb
-0.260400f, -0.357815f, -0.206595f, 0.000000f, // Rb
+0.184133f, 0.413172f, 0.000000f, 0.000000f, // Ls
+0.184152f, -0.413179f, 0.000000f, 0.000000f, // Rs
+0.184148f, 0.206589f, 0.000000f, -0.357822f, // Lb
+0.184131f, -0.206595f, 0.000000f, -0.357815f, // Rb
};
// Decoder matrix for 7dot1, ambisonic level 1
static constexpr float decoderMatrix_7dot1_1_hf[8*4] = {
-0.274533f, 0.199297f, 0.171391f, 0.000000f, // L
-0.274510f, 0.199294f, -0.171394f, 0.000000f, // R
-0.180812f, 0.179246f, 0.000000f, 0.000000f, // C
+0.194124f, 0.171391f, 0.000000f, 0.199297f, // L
+0.194108f, -0.171394f, 0.000000f, 0.199294f, // R
+0.127854f, 0.000000f, 0.000000f, 0.179246f, // C
0.0f, 0.0f, 0.0f, 0.0f, // LFE
-0.368266f, 0.000000f, 0.337353f, 0.000000f, // Ls
-0.368304f, 0.000000f, -0.337359f, 0.000000f, // Rs
-0.368297f, -0.292160f, 0.168680f, 0.000000f, // Lb
-0.368261f, -0.292155f, -0.168684f, 0.000000f, // Rb
+0.260404f, 0.337353f, 0.000000f, 0.000000f, // Ls
+0.260430f, -0.337359f, 0.000000f, 0.000000f, // Rs
+0.260425f, 0.168680f, 0.000000f, -0.292160f, // Lb
+0.260400f, -0.168684f, 0.000000f, -0.292155f, // Rb
};
// Decoder matrix for 7dot1, ambisonic level 2
static constexpr float decoderMatrix_7dot1_2_lf[8*9] = {
-0.194124f, 0.244088f, 0.209910f, 0.000000f, -0.054359f, 0.000000f, 0.000000f, 0.046706f, 0.289736f, // L
-0.194108f, 0.244084f, -0.209914f, 0.000000f, -0.054434f, 0.000000f, 0.000000f, 0.046694f, -0.289734f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.000000f, 0.222021f, 0.000000f, // C
+0.137267f, 0.209910f, 0.000000f, 0.244088f, 0.096579f, 0.000000f, -0.054359f, 0.000000f, 0.015569f, // L
+0.137255f, -0.209914f, 0.000000f, 0.244084f, -0.096578f, 0.000000f, -0.054434f, 0.000000f, 0.015565f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.074007f, // C
0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-0.260404f, 0.000000f, 0.413172f, 0.000000f, -0.071326f, 0.000000f, 0.000000f, -0.326534f, 0.000000f, // Ls
-0.260430f, 0.000000f, -0.413179f, 0.000000f, -0.071237f, 0.000000f, 0.000000f, -0.326534f, 0.000000f, // Rs
-0.260425f, -0.357822f, 0.206589f, 0.000000f, -0.071249f, 0.000000f, 0.000000f, 0.163267f, -0.282791f, // Lb
-0.260400f, -0.357815f, -0.206595f, 0.000000f, -0.071359f, 0.000000f, 0.000000f, 0.163256f, 0.282788f, // Rb
+0.184133f, 0.413172f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.071326f, 0.000000f, -0.108845f, // Ls
+0.184152f, -0.413179f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.071237f, 0.000000f, -0.108845f, // Rs
+0.184148f, 0.206589f, 0.000000f, -0.357822f, -0.094264f, 0.000000f, -0.071249f, 0.000000f, 0.054422f, // Lb
+0.184131f, -0.206595f, 0.000000f, -0.357815f, 0.094263f, 0.000000f, -0.071359f, 0.000000f, 0.054419f, // Rb
};
// Decoder matrix for 7dot1, ambisonic level 2
static constexpr float decoderMatrix_7dot1_2_hf[8*9] = {
-0.306937f, 0.298946f, 0.257087f, 0.000000f, -0.034380f, 0.000000f, 0.000000f, 0.029540f, 0.183245f, // L
-0.306912f, 0.298940f, -0.257091f, 0.000000f, -0.034427f, 0.000000f, 0.000000f, 0.029532f, -0.183244f, // R
-0.202154f, 0.268870f, 0.000000f, 0.000000f, -0.023656f, 0.000000f, 0.000000f, 0.140418f, 0.000000f, // C
+0.217038f, 0.257087f, 0.000000f, 0.298946f, 0.061082f, 0.000000f, -0.034380f, 0.000000f, 0.009847f, // L
+0.217019f, -0.257091f, 0.000000f, 0.298940f, -0.061081f, 0.000000f, -0.034427f, 0.000000f, 0.009844f, // R
+0.142945f, 0.000000f, 0.000000f, 0.268870f, 0.000000f, 0.000000f, -0.023656f, 0.000000f, 0.046806f, // C
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-0.411734f, 0.000000f, 0.506030f, 0.000000f, -0.045111f, 0.000000f, 0.000000f, -0.206518f, 0.000000f, // Ls
-0.411776f, 0.000000f, -0.506039f, 0.000000f, -0.045054f, 0.000000f, 0.000000f, -0.206518f, 0.000000f, // Rs
-0.411768f, -0.438240f, 0.253019f, 0.000000f, -0.045062f, 0.000000f, 0.000000f, 0.103259f, -0.178853f, // Lb
-0.411728f, -0.438232f, -0.253026f, 0.000000f, -0.045131f, 0.000000f, 0.000000f, 0.103252f, 0.178851f, // Rb
+0.291140f, 0.506030f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.045111f, 0.000000f, -0.068839f, // Ls
+0.291170f, -0.506039f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.045054f, 0.000000f, -0.068839f, // Rs
+0.291164f, 0.253019f, 0.000000f, -0.438240f, -0.059618f, 0.000000f, -0.045062f, 0.000000f, 0.034420f, // Lb
+0.291136f, -0.253026f, 0.000000f, -0.438232f, 0.059617f, 0.000000f, -0.045131f, 0.000000f, 0.034417f, // Rb
};
// Decoder matrix for 7dot1, ambisonic level 3
static constexpr float decoderMatrix_7dot1_3_lf[8*16] = {
-0.194124f, 0.244088f, 0.209910f, 0.000000f, -0.054359f, 0.000000f, 0.000000f, 0.046706f, 0.289736f, 0.000000f, 0.031236f, 0.027345f, 0.000000f, 0.000000f, -0.110659f, 0.194894f, // L
-0.194108f, 0.244084f, -0.209914f, 0.000000f, -0.054434f, 0.000000f, 0.000000f, 0.046694f, -0.289734f, 0.000000f, 0.031217f, -0.027307f, 0.000000f, 0.000000f, -0.110659f, -0.194879f, // R
-0.127854f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.000000f, 0.222021f, 0.000000f, 0.000000f, 0.026162f, 0.000000f, 0.000000f, 0.000000f, 0.204779f, 0.000000f, // C
+0.137267f, 0.209910f, 0.000000f, 0.244088f, 0.096579f, 0.000000f, -0.054359f, 0.000000f, 0.015569f, 0.012993f, 0.000000f, 0.013238f, 0.000000f, 0.015122f, 0.000000f, -0.007377f, // L
+0.137255f, -0.209914f, 0.000000f, 0.244084f, -0.096578f, 0.000000f, -0.054434f, 0.000000f, 0.015565f, -0.012992f, 0.000000f, -0.013220f, 0.000000f, 0.015113f, 0.000000f, -0.007377f, // R
+0.090406f, 0.000000f, 0.000000f, 0.219531f, 0.000000f, 0.000000f, -0.037403f, 0.000000f, 0.074007f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.012666f, 0.000000f, 0.013652f, // C
0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-0.260404f, 0.000000f, 0.413172f, 0.000000f, -0.071326f, 0.000000f, 0.000000f, -0.326534f, 0.000000f, 0.000000f, 0.000000f, 0.055313f, 0.000000f, 0.000000f, 0.000000f, -0.185006f, // Ls
-0.260430f, 0.000000f, -0.413179f, 0.000000f, -0.071237f, 0.000000f, 0.000000f, -0.326534f, 0.000000f, 0.000000f, 0.000000f, -0.055349f, 0.000000f, 0.000000f, 0.000000f, 0.185008f, // Rs
-0.260425f, -0.357822f, 0.206589f, 0.000000f, -0.071249f, 0.000000f, 0.000000f, 0.163267f, -0.282791f, 0.000000f, -0.047935f, 0.027670f, 0.000000f, 0.000000f, 0.000000f, 0.185014f, // Lb
-0.260400f, -0.357815f, -0.206595f, 0.000000f, -0.071359f, 0.000000f, 0.000000f, 0.163256f, 0.282788f, 0.000000f, -0.047893f, -0.027649f, 0.000000f, 0.000000f, 0.000000f, -0.184996f, // Rb
+0.184133f, 0.413172f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.071326f, 0.000000f, -0.108845f, -0.012334f, 0.000000f, 0.026779f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, // Ls
+0.184152f, -0.413179f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.071237f, 0.000000f, -0.108845f, 0.012334f, 0.000000f, -0.026796f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, // Rs
+0.184148f, 0.206589f, 0.000000f, -0.357822f, -0.094264f, 0.000000f, -0.071249f, 0.000000f, 0.054422f, 0.012334f, 0.000000f, 0.013396f, 0.000000f, -0.023206f, 0.000000f, 0.000000f, // Lb
+0.184131f, -0.206595f, 0.000000f, -0.357815f, 0.094263f, 0.000000f, -0.071359f, 0.000000f, 0.054419f, -0.012333f, 0.000000f, -0.013386f, 0.000000f, -0.023186f, 0.000000f, 0.000000f, // Rb
};
// Decoder matrix for 7dot1, ambisonic level 3
static constexpr float decoderMatrix_7dot1_3_hf[8*16] = {
-0.323835f, 0.350641f, 0.301543f, 0.000000f, -0.055527f, 0.000000f, 0.000000f, 0.047710f, 0.295961f, 0.000000f, 0.015880f, 0.013901f, 0.000000f, 0.000000f, -0.056256f, 0.099079f, // L
-0.323808f, 0.350635f, -0.301549f, 0.000000f, -0.055604f, 0.000000f, 0.000000f, 0.047697f, -0.295959f, 0.000000f, 0.015870f, -0.013882f, 0.000000f, 0.000000f, -0.056256f, -0.099072f, // R
-0.213283f, 0.315364f, 0.000000f, 0.000000f, -0.038207f, 0.000000f, 0.000000f, 0.226791f, 0.000000f, 0.000000f, 0.013300f, 0.000000f, 0.000000f, 0.000000f, 0.104104f, 0.000000f, // C
+0.228986f, 0.301543f, 0.000000f, 0.350641f, 0.098654f, 0.000000f, -0.055527f, 0.000000f, 0.015903f, 0.006605f, 0.000000f, 0.006730f, 0.000000f, 0.007688f, 0.000000f, -0.003750f, // L
+0.228967f, -0.301549f, 0.000000f, 0.350635f, -0.098653f, 0.000000f, -0.055604f, 0.000000f, 0.015899f, -0.006605f, 0.000000f, -0.006721f, 0.000000f, 0.007683f, 0.000000f, -0.003750f, // R
+0.150814f, 0.000000f, 0.000000f, 0.315364f, 0.000000f, 0.000000f, -0.038207f, 0.000000f, 0.075597f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.006439f, 0.000000f, 0.006940f, // C
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, // LFE
-0.434401f, 0.000000f, 0.593535f, 0.000000f, -0.072859f, 0.000000f, 0.000000f, -0.333550f, 0.000000f, 0.000000f, 0.000000f, 0.028120f, 0.000000f, 0.000000f, 0.000000f, -0.094052f, // Ls
-0.434446f, 0.000000f, -0.593546f, 0.000000f, -0.072768f, 0.000000f, 0.000000f, -0.333550f, 0.000000f, 0.000000f, 0.000000f, -0.028138f, 0.000000f, 0.000000f, 0.000000f, 0.094053f, // Rs
-0.434437f, -0.514023f, 0.296773f, 0.000000f, -0.072780f, 0.000000f, 0.000000f, 0.166775f, -0.288867f, 0.000000f, -0.024369f, 0.014067f, 0.000000f, 0.000000f, 0.000000f, 0.094056f, // Lb
-0.434395f, -0.514014f, -0.296781f, 0.000000f, -0.072892f, 0.000000f, 0.000000f, 0.166764f, 0.288864f, 0.000000f, -0.024348f, -0.014056f, 0.000000f, 0.000000f, 0.000000f, -0.094047f, // Rb
+0.307168f, 0.593535f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.072859f, 0.000000f, -0.111183f, -0.006270f, 0.000000f, 0.013613f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, // Ls
+0.307199f, -0.593546f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, -0.072768f, 0.000000f, -0.111183f, 0.006270f, 0.000000f, -0.013622f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, // Rs
+0.307193f, 0.296773f, 0.000000f, -0.514023f, -0.096289f, 0.000000f, -0.072780f, 0.000000f, 0.055592f, 0.006270f, 0.000000f, 0.006810f, 0.000000f, -0.011797f, 0.000000f, 0.000000f, // Lb
+0.307164f, -0.296781f, 0.000000f, -0.514014f, 0.096288f, 0.000000f, -0.072892f, 0.000000f, 0.055588f, -0.006270f, 0.000000f, -0.006805f, 0.000000f, -0.011787f, 0.000000f, 0.000000f, // Rb
};
QT_END_NAMESPACE
diff --git a/util/adt_generate_qt.m b/util/adt_generate_qt.m
index 45b3dcd03..8bb9497d3 100644
--- a/util/adt_generate_qt.m
+++ b/util/adt_generate_qt.m
@@ -98,34 +98,6 @@ function adt_generate_qt()
fprintf(outfile, "\n\n");
fprintf(outfile, "QT_BEGIN_NAMESPACE\n\n");
- % cover top/bottom and back for mono and stereo
- imag_speakers = [0,0,radius; 0,0,-radius; 0,radius,0; 0,-radius,0; -radius,0,0];
-
- % Mono, one speaker up front
- S = ambi_spkr_array(...
- ... % array name
- 'mono', ...
- ... % coordinate codes, unit codes
- ... % Azimuth, Elevation, Radius; Degrees, Degrees, Meters
- 'AER', 'DDM', ...
- ... % speaker name, [azimuth, elevation, radius]
- 'C', [ 0, 0, radius] ...
- );
- createDecoders(S, imag_speakers, outfile);
-
- % Stereo, assume -30 and 30 degree speakers
- S = ambi_spkr_array(...
- 'stereo', ...
- 'AER', 'DDM', ...
- 'L', [ 30, 0, radius], ...
- 'R', [ -30, 0, radius] ...
- );
- createDecoders(S, imag_speakers, outfile);
-
- S.lfeRow = 3;
- S.name = "2dot1";
- createDecoders(S, imag_speakers, outfile);
-
% cover top/bottom for surround
imag_speakers = [0,0,radius; 0,0,-radius];
@@ -197,6 +169,24 @@ function writeLFERow(outfile, m, suffix)
fprintf(outfile, "// LFE\n");
end
+function [n, m] = getnm(l)
+% Computes spherical harmonic degree and order from Ambisonic Channel Number.
+ n = floor(sqrt(l));
+ m = l-n.^2-n;
+end
+
+function channels = normalizeSN3D(channels)
+ for i = 1:columns(channels)
+ [n, m] = getnm(i-1);
+ if (m == 0)
+ factor = 1;
+ else
+ factor = sqrt(2 * factorial(n - abs(m)) / (factorial(n + abs(m))));
+ endif
+ channels(i) *= factor;
+ endfor
+end
+
function writeMatrix(outfile, level, S, M, suffix)
m = trimMatrix(M);
hasLFE = isfield(S, "lfeRow");
@@ -208,7 +198,8 @@ function writeMatrix(outfile, level, S, M, suffix)
fprintf(outfile, "// Decoder matrix for %s, ambisonic level %d\n", S.name, level);
fprintf(outfile, "static constexpr float decoderMatrix_%s_%d_%s[%d*%d] = {\n", S.name, level, suffix, r, c);
for i = 1:rows(S.id)
- fprintf(outfile, "%ff, ", m(i, :));
+ channels = normalizeSN3D(m(i, :))
+ fprintf(outfile, "%ff, ", channels);
fprintf(outfile, "// %s\n", S.id(i, 1){1});
if (hasLFE && S.lfeRow == i + 1)
writeLFERow(outfile, m, suffix);
@@ -218,7 +209,8 @@ function writeMatrix(outfile, level, S, M, suffix)
end
function createOneDecoder(S, imag_speakers, outfile, level)
- [D,S,M,C] = ambi_run_allrad(S, level, imag_speakers, [S.name '_' int2str(level)], false, "amb", 1, 3);
+ ambi_order = ambi_channel_definitions_convention(level, 'ambix2011')
+ [D,S,M,C] = ambi_run_allrad(S, ambi_order, imag_speakers, [S.name '_' int2str(level)], false, "amb", 1, 3);
writeMatrix(outfile, level, S, M.lf, "lf");
m = ambi_apply_gamma(M.hf, D.hf_gains, C);
writeMatrix(outfile, level, S, m, "hf");