Loading lib_util/ambi_convert.c +36 −0 Original line number Diff line number Diff line Loading @@ -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 /* -------------------------------- Loading Loading @@ -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 ---------------------------- */ Loading Loading @@ -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 ); Loading @@ -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 ); Loading Loading @@ -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; Loading @@ -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; Loading lib_util/ambi_convert.h +6 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
lib_util/ambi_convert.c +36 −0 Original line number Diff line number Diff line Loading @@ -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 /* -------------------------------- Loading Loading @@ -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 ---------------------------- */ Loading Loading @@ -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 ); Loading @@ -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 ); Loading Loading @@ -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; Loading @@ -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; Loading
lib_util/ambi_convert.h +6 −4 Original line number Diff line number Diff line Loading @@ -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; Loading