Commit edd73108 authored by Dominik Weckbecker's avatar Dominik Weckbecker 💬
Browse files

add conversion tables for AmbiX convention

parent b1bbc235
Loading
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -55,6 +55,9 @@
#define INV_SQRT_3_OVER_5_   1.2909944f
#define INV_SQRT_45_OVER_32_ 0.8432740f

#define INV_SQRT_FOUR_PI_  0.2820947f /* 1/sqrt(4/pi) */
#define SQRT_FOUR_PI_      3.5449077f

#define AMBI_MAX_CHANNELS 16

/* --------------------------------
@@ -93,6 +96,23 @@ static const float FM_SN3D[AMBI_MAX_CHANNELS] = { INV_SQRT_2,
                                                  INV_TWO_OVER_SQRT_3_, INV_TWO_OVER_SQRT_3_, 1.0f, INV_TWO_OVER_SQRT_3_, INV_TWO_OVER_SQRT_3_,
                                                  INV_SQRT_8_OVER_5_, INV_SQRT_3_OVER_5_, INV_SQRT_45_OVER_32_, 1.0f, INV_SQRT_45_OVER_32_, INV_SQRT_3_OVER_5_, INV_SQRT_8_OVER_5_ };

/* 
   Curiously, not everyone seems to have the same understanding of what SN3D means. The Ambix paper 
   (Nachbar et al. : AMBIX - A SUGGESTED AMBISONICS FORMAT) has an additional 1/sqrt(4*pi) in the 
   normalization factor (see Eq. (3)) as compared to the tables in IVAS.
*/

static const float AMBIX_SN3D[AMBI_MAX_CHANNELS] = { INV_SQRT_FOUR_PI_,
                                                     INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_,
                                                     INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_,
                                                     INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_, INV_SQRT_FOUR_PI_ };

static const float SN3D_AMBIX[AMBI_MAX_CHANNELS] = { SQRT_FOUR_PI_,
                                                     SQRT_FOUR_PI_, SQRT_FOUR_PI_, SQRT_FOUR_PI_,
                                                     SQRT_FOUR_PI_, SQRT_FOUR_PI_, SQRT_FOUR_PI_, SQRT_FOUR_PI_, SQRT_FOUR_PI_,
                                                     SQRT_FOUR_PI_, SQRT_FOUR_PI_, SQRT_FOUR_PI_, SQRT_FOUR_PI_, SQRT_FOUR_PI_, SQRT_FOUR_PI_, SQRT_FOUR_PI_ };


/* ----------------------------
    channel re-ordering tables
   ---------------------------- */
@@ -136,6 +156,10 @@ int16_t convert_ambi_format( float *in[], float *out[], int16_t order, AMBI_FMT
            renormalize_channels( in, out, order, AMBI_NORM_SN3D, AMBI_NORM_MAXN );
            reorder_channels( in, out, order, AMBI_CHANNEL_ORDER_ACN, AMBI_CHANNEL_ORDER_FM );
        }
        else if ( out_format == AMBI_FMT_AMBIX )
        {
            renormalize_channels( in, out, order, AMBI_NORM_SN3D, AMBI_NORM_AMBIX );
        }
        else if ( out_format == AMBI_FMT_SID_SN3D )
        {
            reorder_channels( in, out, order, AMBI_CHANNEL_ORDER_ACN, AMBI_CHANNEL_ORDER_SID );
@@ -161,6 +185,10 @@ int16_t convert_ambi_format( float *in[], float *out[], int16_t order, AMBI_FMT
            reorder_channels( in, out, order, AMBI_CHANNEL_ORDER_FM, AMBI_CHANNEL_ORDER_ACN );
            renormalize_channels( in, out, order, AMBI_NORM_MAXN, AMBI_NORM_SN3D );
        }
        else if ( in_format == AMBI_FMT_AMBIX )
        {
            renormalize_channels( in, out, order, AMBI_NORM_AMBIX, AMBI_NORM_SN3D );
        }
        else if ( in_format == AMBI_FMT_SID_SN3D )
        {
            reorder_channels( in, out, order, AMBI_CHANNEL_ORDER_SID, AMBI_CHANNEL_ORDER_ACN );
@@ -201,6 +229,10 @@ int16_t renormalize_channels( float *in[], float *out[], int16_t order, AMBI_CHA
        {
            conversion_table = SN3D_MAXN;
        }
        else if ( out_format == AMBI_NORM_AMBIX )
        {
            conversion_table = SN3D_AMBIX;
        }
        else if ( out_format == AMBI_NORM_FM )
        {
            conversion_table = SN3D_FM;
@@ -220,6 +252,10 @@ int16_t renormalize_channels( float *in[], float *out[], int16_t order, AMBI_CHA
        {
            conversion_table = MAXN_SN3D;
        }
        if ( in_format == AMBI_NORM_AMBIX )
        {
            conversion_table = AMBIX_SN3D;
        }
        else if ( in_format == AMBI_NORM_FM )
        {
            conversion_table = FM_SN3D;
+6 −4
Original line number Diff line number Diff line
@@ -38,16 +38,18 @@
typedef enum
{
    AMBI_FMT_ACN_SN3D = 0,
    AMBI_FMT_ACN_N3D = 1,
    AMBI_FMT_FM_MAXN = 2,
    AMBI_FMT_SID_SN3D = 3,
    AMBI_FMT_SID_N3D = 4
    AMBI_FMT_ACN_N3D,
    AMBI_FMT_AMBIX,
    AMBI_FMT_FM_MAXN,
    AMBI_FMT_SID_SN3D,
    AMBI_FMT_SID_N3D
} AMBI_FMT;

typedef enum
{
    AMBI_NORM_SN3D = 0,
    AMBI_NORM_N3D,
	AMBI_NORM_AMBIX,
    AMBI_NORM_MAXN,
    AMBI_NORM_FM
} AMBI_CHANNEL_NORM;