summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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");