diff --git a/lib_com/options.h b/lib_com/options.h index 1063c88614c74464f49dbb840420a5f4e6803a73..2440c09406deb975f87d1bb6b00f8debdd8c202d 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -166,7 +166,10 @@ #define FIX_1082_INSTRUM_FAILED_LC3PLUS /* VoiceAge: issue 1082: fix ambiguous syntax in LC3Plus code leading to fails of instrumented builds */ #define FIX_1052_EXT_OUTPUT /* VA: issue 1052: define EXT decoder output configuration for stereo and MC formats */ +#define FIX_989_TD_REND_ROM /* Eri: Clean-up for TD renderer and completion of ROM generation tool */ + #define FIX_1068_ASAN_IN_MC_2_BINAURAL_ROOM_IR /* issue 1068 : Memory leak in MC to BINAURAL_ROOM decoding with bitrate switching*/ + /* #################### End BE switches ################################## */ /* #################### Start NON-BE switches ############################ */ diff --git a/lib_rend/ivas_objectRenderer_mix.c b/lib_rend/ivas_objectRenderer_mix.c index ca828de2e70dbd8d30cb2dba64a35287533aac72..b2492324c91dea187c096c9e0a1f64185e7973d1 100644 --- a/lib_rend/ivas_objectRenderer_mix.c +++ b/lib_rend/ivas_objectRenderer_mix.c @@ -39,6 +39,9 @@ #include "wmc_auto.h" #include "ivas_rom_rend.h" #include "ivas_rom_binaural_crend_head.h" +#ifdef FIX_989_TD_REND_ROM +#include +#endif #ifdef DEBUGGING #include "debug.h" #endif @@ -386,6 +389,9 @@ static ivas_error DefaultBSplineModel( ModelParamsITD_t *modelITD; int16_t i, j; ivas_error error; +#ifdef FIX_989_TD_REND_ROM + float azimSegSamples; +#endif HrFiltSet_p->FilterMethod = TDREND_HRFILT_Method_BSplineModel; model = &( HrFiltSet_p->ModelParams ); @@ -396,6 +402,15 @@ static ivas_error DefaultBSplineModel( model->modelROM = TRUE; /* int16_t parameters */ +#ifdef FIX_989_TD_REND_ROM + model->UseItdModel = defaultHRIR_rom_model_configuration[0]; + model->elevDim3 = defaultHRIR_rom_model_configuration[1]; + model->AlphaN = defaultHRIR_rom_model_configuration[2]; + model->num_unique_azim_splines = defaultHRIR_rom_model_configuration[3]; + model->elevSegSamples = defaultHRIR_rom_model_configuration[4]; + model->elevBsLen = defaultHRIR_rom_elevBsLen; + model->elevBsStart = defaultHRIR_rom_elevBsStart; +#else model->UseItdModel = 1; model->SplineDegree = 4; model->elevDim2 = 17; @@ -413,6 +428,7 @@ static ivas_error DefaultBSplineModel( model->elevBsStart[3] = 27; model->azimDim2 = defaultHRIR_rom_azimDim2; +#endif model->azimDim3 = defaultHRIR_rom_azimDim3; model->azim_start_idx = defaultHRIR_rom_azim_start_idx; model->azimSegSamples = defaultHRIR_rom_azimSegSamples; @@ -429,10 +445,36 @@ static ivas_error DefaultBSplineModel( } model->azimBsShape[0] = (const float *) defaultHRIR_rom_azimBsShape; +#ifdef FIX_989_TD_REND_ROM + if ( ( model->azimKSeq = (float **) malloc( model->elevDim3 * sizeof( float * ) ) ) == NULL ) +#else if ( ( model->azimKSeq = (float **) malloc( 18 * sizeof( float * ) ) ) == NULL ) +#endif { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } +#ifdef FIX_989_TD_REND_ROM + for ( i = 0; i < model->elevDim3; i++ ) + { + if ( ( model->azimKSeq[i] = (float *) malloc( ( model->azimDim3[i] + 1 ) * sizeof( float * ) ) ) == NULL ) + { + return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); + } + if ( model->azimShapeIdx[i] < 0 ) + { + azimSegSamples = 360.0f; + } + else + { + azimSegSamples = defaultHRIR_rom_azimSegSamples[model->azimShapeIdx[i]]; + } + assert( azimSegSamples == 360.0f / model->azimDim3[i] ); + for ( j = 0; j < model->azimDim3[i] + 1; j++ ) + { + model->azimKSeq[i][j] = azimSegSamples * j; + } + } +#else if ( ( model->azimKSeq[0] = (float *) malloc( 2 * sizeof( float * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); @@ -457,6 +499,7 @@ static ivas_error DefaultBSplineModel( model->azimKSeq[i][j] = (float) defaultHRIR_rom_azimSegSamples[0] * j; } } +#endif switch ( output_Fs ) { @@ -465,7 +508,11 @@ static ivas_error DefaultBSplineModel( model->AlphaR = (const float *) defaultHRIR_rom_AlphaR48; model->EL = (const float *) defaultHRIR_rom_EL48; model->ER = (const float *) defaultHRIR_rom_ER48; +#ifdef FIX_989_TD_REND_ROM + model->K = defaultHRIR_rom_model_configuration[5]; +#else model->K = 128; +#endif if ( HrFiltSet_p->ModelParams.UseItdModel ) { modelITD->resamp_factor = 1.0f; @@ -476,7 +523,11 @@ static ivas_error DefaultBSplineModel( model->AlphaR = (const float *) defaultHRIR_rom_AlphaR32; model->EL = (const float *) defaultHRIR_rom_EL32; model->ER = (const float *) defaultHRIR_rom_ER32; +#ifdef FIX_989_TD_REND_ROM + model->K = (int16_t) ceil( RESAMPLE_FACTOR_32_48 * defaultHRIR_rom_model_configuration[5] ); +#else model->K = 86; +#endif if ( HrFiltSet_p->ModelParams.UseItdModel ) { modelITD->resamp_factor = RESAMPLE_FACTOR_32_48; @@ -487,7 +538,11 @@ static ivas_error DefaultBSplineModel( model->AlphaR = (const float *) defaultHRIR_rom_AlphaR16; model->EL = (const float *) defaultHRIR_rom_EL16; model->ER = (const float *) defaultHRIR_rom_ER16; +#ifdef FIX_989_TD_REND_ROM + model->K = (int16_t) ceil( RESAMPLE_FACTOR_16_48 * defaultHRIR_rom_model_configuration[5] ); +#else model->K = 43; +#endif if ( HrFiltSet_p->ModelParams.UseItdModel ) { modelITD->resamp_factor = RESAMPLE_FACTOR_16_48; @@ -497,6 +552,14 @@ static ivas_error DefaultBSplineModel( break; } +#ifdef FIX_989_TD_REND_ROM + modelITD->elevDim3 = defaultHRIR_rom_ITD_model_configuration[0]; + modelITD->azimDim3 = defaultHRIR_rom_ITD_model_configuration[1]; + modelITD->elevSegSamples = defaultHRIR_rom_ITD_model_configuration[2]; + modelITD->azimSegSamples = defaultHRIR_rom_ITD_model_configuration[3]; + modelITD->elevBsLen = defaultHRIR_rom_ITD_elevBsLen; + modelITD->elevBsStart = defaultHRIR_rom_ITD_elevBsStart; +#else modelITD->N = 4; modelITD->elevDim2 = 20; modelITD->elevDim3 = 18; @@ -511,9 +574,14 @@ static ivas_error DefaultBSplineModel( modelITD->elevBsStart[1] = 4; modelITD->elevBsStart[2] = 11; modelITD->elevBsStart[3] = 21; +#endif modelITD->elevKSeq = defaultHRIR_rom_ITD_elevKSeq; +#ifdef FIX_989_TD_REND_ROM + modelITD->azimBsLen = defaultHRIR_rom_ITD_azimBsLen; + modelITD->azimBsStart = defaultHRIR_rom_ITD_azimBsStart; +#else modelITD->azimBsLen[0] = 11; modelITD->azimBsLen[1] = 21; modelITD->azimBsLen[2] = 31; @@ -524,6 +592,7 @@ static ivas_error DefaultBSplineModel( modelITD->azimBsStart[3] = 63; modelITD->azimSegSamples = 10; +#endif modelITD->azimKSeq = defaultHRIR_rom_ITD_azimKSeq; modelITD->W = (const float *) defaultHRIR_rom_ITD_W; diff --git a/lib_rend/ivas_rom_TdBinauralRenderer.c b/lib_rend/ivas_rom_TdBinauralRenderer.c index 2879476014732b60dd705370ceabaee7a76aff8e..706d7de2d2972eb8c2cb4ccd5987630702c03d41 100644 --- a/lib_rend/ivas_rom_TdBinauralRenderer.c +++ b/lib_rend/ivas_rom_TdBinauralRenderer.c @@ -50,9 +50,26 @@ *------------------------------------------------------------------------*/ /* TD renderer default HRIR model */ const float defaultHRIR_rom_latency_s = 0.000020834f; +#ifdef FIX_989_TD_REND_ROM +const int16_t defaultHRIR_rom_model_configuration[6] = { +1, /* UseItdModel */ +15, /* elevDim3 */ +470, /* AlphaN */ +1, /* num_unique_azim_splines */ +4, /* elevSegSamples */ +128, /* K_48k */ +}; +const int16_t defaultHRIR_rom_elevBsLen[4] = { +5, 9, 13, 9, +}; +const int16_t defaultHRIR_rom_elevBsStart[4] = { +0, 5, 14, 27, +}; +#else const int16_t defaultHRIR_rom_azimDim2[15] = { 1, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 1, }; +#endif const int16_t defaultHRIR_rom_azimDim3[15] = { 1, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 1, }; @@ -10139,6 +10156,26 @@ const uint32_t defaultHRIR_rom_ITD_W[658] = { 0x3c678a1c,0xbdeb0ba5,0xbe2218a5,0x3e58dcde,0x3d71aaa0,0xbef80fb9,0xbf3d07e1,0x3f3485be,0x3db783c0,0x3c142933,0xbed36b04,0xbb9f1f49,0x3ebfdc23,0xbcc7652e,0xbdb4e6cd,0xbf3be092,0x3f399c4e,0x3ef2eb6a,0xbd93a618,0xbe480d88,0x3e1bd187,0x3df79a5d,0xbc53f8d6,0xbf002186,0xbd41bc42, 0x3e5c0f28,0x3f2ad402,0xbf3cc2c3,0xbedc59d1,0xbe021816,0x3ea43429,0x3d349309,0xbab986b3, }; +#ifdef FIX_989_TD_REND_ROM +const int16_t defaultHRIR_rom_ITD_model_configuration[4] = { +18, /* elevDim3 */ +41, /* azimDim3 */ +3, /* elevSegSamples */ +10, /* azimSegSamples */ +}; +const int16_t defaultHRIR_rom_ITD_elevBsLen[4] = { +4, 7, 10, 7, +}; +const int16_t defaultHRIR_rom_ITD_elevBsStart[4] = { +0, 4, 11, 21, +}; +const int16_t defaultHRIR_rom_ITD_azimBsLen[4] = { +11, 21, 31, 21, +}; +const int16_t defaultHRIR_rom_ITD_azimBsStart[4] = { +0, 11, 32, 63, +}; +#endif const uint32_t defaultHRIR_rom_ITD_azimBsShape[84] = { 0x3f800000,0x3f3a9fbe,0x3f03126f,0x3eaf9db2,0x3e5d2f1b,0x3e000000,0x3d83126f,0x3cdd2f1b,0x3c03126f,0x3a83126f,0xa5800000,0x00000000,0x3e8374bc,0x3ede353f,0x3f0ad0e5,0x3f178d50,0x3f180000,0x3f0ed917,0x3efd9168,0x3ed4fdf4,0x3ea95810,0x3e800000,0x3e3a9fbe,0x3e03126f,0x3daf9db2, 0x3d5d2f1b,0x3d000000,0x3c83126f,0x3bdd2f1b,0x3b03126f,0x3983126f,0xa6000000,0x00000000,0x3c66bdc8,0x3d57b901,0x3de1cac1,0x3e39af72,0x3e855555,0x3eaf1aa0,0x3ed756b3,0x3efb38a9,0x3f0bf7cf,0x3f155555,0x3f18aec3,0x3f16872b,0x3f0fc3ed,0x3f054a69,0x3ef00000,0x3ed19423,0x3eb11bfd, diff --git a/lib_rend/ivas_rom_TdBinauralRenderer.h b/lib_rend/ivas_rom_TdBinauralRenderer.h index c79742757e5d9d401814eaea00bf0447cc1e43da..f633f06a686dc5f0614908498d1ce6fcbe369ab0 100644 --- a/lib_rend/ivas_rom_TdBinauralRenderer.h +++ b/lib_rend/ivas_rom_TdBinauralRenderer.h @@ -47,7 +47,11 @@ *------------------------------------------------------------------------*/ /* TD renderer default HRIR model */ extern const float defaultHRIR_rom_latency_s; +#ifdef FIX_989_TD_REND_ROM +extern const int16_t defaultHRIR_rom_model_configuration[6]; +#else extern const int16_t defaultHRIR_rom_azimDim2[15]; +#endif extern const int16_t defaultHRIR_rom_azimDim3[15]; extern const int16_t defaultHRIR_rom_azim_start_idx[15]; extern const int16_t defaultHRIR_rom_azimSegSamples[1]; @@ -66,6 +70,10 @@ extern const uint32_t defaultHRIR_rom_EL32[HRTF_MODEL_N_SECTIONS * 470]; extern const uint32_t defaultHRIR_rom_ER32[HRTF_MODEL_N_SECTIONS * 470]; extern const uint32_t defaultHRIR_rom_EL16[HRTF_MODEL_N_SECTIONS * 470]; extern const uint32_t defaultHRIR_rom_ER16[HRTF_MODEL_N_SECTIONS * 470]; +#ifdef FIX_989_TD_REND_ROM +extern const int16_t defaultHRIR_rom_elevBsLen[4]; +extern const int16_t defaultHRIR_rom_elevBsStart[4]; +#endif extern const uint32_t defaultHRIR_rom_elevBsShape[36]; extern const uint32_t defaultHRIR_rom_azimBsShape[21]; extern const uint32_t defaultHRIR_rom_ITD_W[658]; @@ -73,4 +81,11 @@ extern const uint32_t defaultHRIR_rom_ITD_azimBsShape[84]; extern const float defaultHRIR_rom_ITD_azimKSeq[19]; extern const uint32_t defaultHRIR_rom_ITD_elevBsShape[28]; extern const float defaultHRIR_rom_ITD_elevKSeq[16]; +#ifdef FIX_989_TD_REND_ROM +extern const int16_t defaultHRIR_rom_ITD_model_configuration[4]; +extern const int16_t defaultHRIR_rom_ITD_elevBsLen[4]; +extern const int16_t defaultHRIR_rom_ITD_elevBsStart[4]; +extern const int16_t defaultHRIR_rom_ITD_azimBsLen[4]; +extern const int16_t defaultHRIR_rom_ITD_azimBsStart[4]; +#endif #endif diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index 9bbb047ce58632e731201c402cb687c6ae4fec4d..d1f0fe4bca2b805fb03721aae9767df554c983ee 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -924,19 +924,28 @@ typedef struct er_struct_t typedef struct { - int16_t modelROM; /* Flag that indicates that the model resides in ROM (controls init/dealloc). */ - int16_t UseItdModel; /* Controls whether ITD model is used. */ + int16_t modelROM; /* Flag that indicates that the model resides in ROM (controls init/dealloc). */ + int16_t UseItdModel; /* Controls whether ITD model is used. */ +#ifdef FIX_989_TD_REND_ROM + int16_t K; /* Length of filter */ +#else int16_t SplineDegree; /* Degree of the spline functions */ int16_t K; /* Length of filter */ int16_t elevDim2; +#endif int16_t elevDim3; int16_t AlphaN; /* Number of rows in Alpha matrices */ int16_t num_unique_azim_splines; int16_t elevSegSamples; +#ifdef FIX_989_TD_REND_ROM + const int16_t *elevBsLen; + const int16_t *elevBsStart; +#else int16_t elevBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; int16_t elevBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; const int16_t *azimDim2; +#endif const int16_t *azimDim3; const int16_t *azim_start_idx; const int16_t *azimSegSamples; @@ -963,7 +972,12 @@ typedef struct float *ER_dyn; float *elevBsShape_dyn; float *elevKSeq_dyn; +#ifdef FIX_989_TD_REND_ROM + int16_t *elevBsLen_dyn; + int16_t *elevBsStart_dyn; +#else int16_t *azimDim2_dyn; +#endif int16_t *azimDim3_dyn; int16_t *azim_start_idx_dyn; int16_t *azimSegSamples_dyn; @@ -975,6 +989,13 @@ typedef struct typedef struct { +#ifdef FIX_989_TD_REND_ROM + int16_t elevDim3; + const float *elevKSeq; /* Array, length elevDim3-2 */ + int16_t azimDim3; + const float *azimKSeq; /* Array, length azimDim3-2 */ + const float *W; /* Array, size (elevDim3*azimDim3) x K */ +#else int16_t N; /* Polynomial degree */ int16_t elevDim2; @@ -984,14 +1005,25 @@ typedef struct int16_t azimDim3; const float *azimKSeq; /* Array, length azimDim3-2 */ const float *W; /* Array, size (elevDim3*azimDim3) x K */ +#endif +#ifdef FIX_989_TD_REND_ROM + const int16_t *azimBsLen; + const int16_t *azimBsStart; +#else int16_t azimBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; int16_t azimBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; +#endif const float *azimBsShape; int16_t azimSegSamples; +#ifdef FIX_989_TD_REND_ROM + const int16_t *elevBsLen; + const int16_t *elevBsStart; +#else int16_t elevBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; int16_t elevBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; +#endif const float *elevBsShape; int16_t elevSegSamples; float resamp_factor; @@ -1002,6 +1034,12 @@ typedef struct float *W_dyn; float *azimBsShape_dyn; float *elevBsShape_dyn; +#ifdef FIX_989_TD_REND_ROM + int16_t *azimBsLen_dyn; + int16_t *azimBsStart_dyn; + int16_t *elevBsLen_dyn; + int16_t *elevBsStart_dyn; +#endif } ModelParamsITD_t; diff --git a/lib_util/hrtf_file_reader.c b/lib_util/hrtf_file_reader.c index d49568bc08254c019fb6859d52771c5202245579..69b466db7ed03de89e4b72f616c8282a9088cfbd 100644 --- a/lib_util/hrtf_file_reader.c +++ b/lib_util/hrtf_file_reader.c @@ -249,6 +249,15 @@ static void LoadBSplineBinaryITD( ) { int16_t tmp; +#ifdef FIX_989_TD_REND_ROM + fread( &modelITD->elevDim3, sizeof( int16_t ), 1, f_hrtf ); + modelITD->elevKSeq_dyn = (float *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( float ) ); + fread( modelITD->elevKSeq_dyn, sizeof( float ), modelITD->elevDim3 - 2, f_hrtf ); + + fread( &modelITD->azimDim3, sizeof( int16_t ), 1, f_hrtf ); + modelITD->azimKSeq_dyn = (float *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( float ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */ + fread( modelITD->azimKSeq_dyn, sizeof( float ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf ); +#else fread( &modelITD->N, sizeof( int16_t ), 1, f_hrtf ); fread( &modelITD->elevDim2, sizeof( int16_t ), 1, f_hrtf ); fread( &modelITD->elevDim3, sizeof( int16_t ), 1, f_hrtf ); @@ -259,14 +268,22 @@ static void LoadBSplineBinaryITD( fread( &modelITD->azimDim3, sizeof( int16_t ), 1, f_hrtf ); modelITD->azimKSeq_dyn = (float *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( float ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */ fread( modelITD->azimKSeq_dyn, sizeof( float ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf ); +#endif fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); modelITD->W_dyn = (float *) malloc( tmp * sizeof( float ) ); fread( modelITD->W_dyn, sizeof( float ), tmp, f_hrtf ); /* azimuth */ +#ifdef FIX_989_TD_REND_ROM + modelITD->azimBsLen_dyn = (int16_t *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( int16_t ) ); + fread( modelITD->azimBsLen_dyn, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + modelITD->azimBsStart_dyn = (int16_t *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( int16_t ) ); + fread( modelITD->azimBsStart_dyn, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); +#else fread( modelITD->azimBsLen, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); fread( modelITD->azimBsStart, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); +#endif fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); @@ -276,8 +293,15 @@ static void LoadBSplineBinaryITD( fread( &modelITD->azimSegSamples, sizeof( int16_t ), 1, f_hrtf ); /* elevation */ +#ifdef FIX_989_TD_REND_ROM + modelITD->elevBsLen_dyn = (int16_t *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( int16_t ) ); + fread( modelITD->elevBsLen_dyn, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + modelITD->elevBsStart_dyn = (int16_t *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( int16_t ) ); + fread( modelITD->elevBsStart_dyn, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); +#else fread( modelITD->elevBsLen, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); fread( modelITD->elevBsStart, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); +#endif fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); @@ -291,6 +315,12 @@ static void LoadBSplineBinaryITD( modelITD->W = (const float *) modelITD->W_dyn; modelITD->azimBsShape = (const float *) modelITD->azimBsShape_dyn; modelITD->elevBsShape = (const float *) modelITD->elevBsShape_dyn; +#ifdef FIX_989_TD_REND_ROM + modelITD->azimBsLen = (const int16_t *) modelITD->azimBsLen_dyn; + modelITD->azimBsStart = (const int16_t *) modelITD->azimBsStart_dyn; + modelITD->elevBsLen = (const int16_t *) modelITD->elevBsLen_dyn; + modelITD->elevBsStart = (const int16_t *) modelITD->elevBsStart_dyn; +#endif return; } @@ -347,6 +377,12 @@ static ivas_error LoadBSplineBinary( return IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "Error: HR filter file had an unsupported sampling rate (%d kHz)", tmp ); } +#ifdef FIX_989_TD_REND_ROM + fread( &model->K, sizeof( int16_t ), 1, f_hrtf ); + fread( &model->elevDim3, sizeof( int16_t ), 1, f_hrtf ); + model->elevKSeq_dyn = (float *) malloc( ( model->elevDim3 - 2 ) * sizeof( float ) ); + fread( model->elevKSeq_dyn, sizeof( float ), model->elevDim3 - 2, f_hrtf ); +#else fread( &model->SplineDegree, sizeof( int16_t ), 1, f_hrtf ); fread( &model->K, sizeof( int16_t ), 1, f_hrtf ); @@ -355,12 +391,15 @@ static ivas_error LoadBSplineBinary( model->elevKSeq_dyn = (float *) malloc( ( model->elevDim3 - 2 ) * sizeof( float ) ); fread( model->elevKSeq_dyn, sizeof( float ), model->elevDim3 - 2, f_hrtf ); model->azimDim2_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); +#endif model->azimDim3_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); model->azim_start_idx_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); model->azimKSeq = (float **) malloc( model->elevDim3 * sizeof( float * ) ); for ( i = 0; i < model->elevDim3; i++ ) { +#ifndef FIX_989_TD_REND_ROM fread( &model->azimDim2_dyn[i], sizeof( int16_t ), 1, f_hrtf ); +#endif fread( &model->azimDim3_dyn[i], sizeof( int16_t ), 1, f_hrtf ); fread( &model->azim_start_idx_dyn[i], sizeof( int16_t ), 1, f_hrtf ); model->azimKSeq[i] = (float *) malloc( ( model->azimDim3_dyn[i] + 1 ) * sizeof( float ) ); @@ -393,8 +432,15 @@ static ivas_error LoadBSplineBinary( fread( model->azimShapeSampFactor_dyn, sizeof( int16_t ), model->elevDim3, f_hrtf ); /* elevation */ +#ifdef FIX_989_TD_REND_ROM + model->elevBsLen_dyn = (int16_t *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( int16_t ) ); + fread( model->elevBsLen_dyn, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); + model->elevBsStart_dyn = (int16_t *) malloc( HRTF_MODEL_BSPLINE_NUM_COEFFS * sizeof( int16_t ) ); + fread( model->elevBsStart_dyn, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); +#else fread( model->elevBsLen, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); fread( model->elevBsStart, sizeof( int16_t ), HRTF_MODEL_BSPLINE_NUM_COEFFS, f_hrtf ); +#endif fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); model->elevBsShape_dyn = (float *) malloc( tmp * sizeof( float ) ); fread( model->elevBsShape_dyn, sizeof( float ), tmp, f_hrtf ); @@ -406,9 +452,15 @@ static ivas_error LoadBSplineBinary( model->AlphaR = (const float *) model->AlphaR_dyn; model->EL = (const float *) model->EL_dyn; model->ER = (const float *) model->ER_dyn; +#ifdef FIX_989_TD_REND_ROM + model->elevBsLen = (const int16_t *) model->elevBsLen_dyn; + model->elevBsStart = (const int16_t *) model->elevBsStart_dyn; +#endif model->elevBsShape = (const float *) model->elevBsShape_dyn; model->elevKSeq = (const float *) model->elevKSeq_dyn; +#ifndef FIX_989_TD_REND_ROM model->azimDim2 = (const int16_t *) model->azimDim2_dyn; +#endif model->azimDim3 = (const int16_t *) model->azimDim3_dyn; model->azim_start_idx = (const int16_t *) model->azim_start_idx_dyn; model->azimSegSamples = (const int16_t *) model->azimSegSamples_dyn; @@ -777,10 +829,18 @@ void destroy_td_hrtf( free( ( *hHrtf )->ModelParamsITD.W_dyn ); free( ( *hHrtf )->ModelParamsITD.azimBsShape_dyn ); free( ( *hHrtf )->ModelParamsITD.elevBsShape_dyn ); +#ifdef FIX_989_TD_REND_ROM + free( ( *hHrtf )->ModelParamsITD.azimBsLen_dyn ); + free( ( *hHrtf )->ModelParamsITD.azimBsStart_dyn ); + free( ( *hHrtf )->ModelParamsITD.elevBsLen_dyn ); + free( ( *hHrtf )->ModelParamsITD.elevBsStart_dyn ); +#endif } free( ( *hHrtf )->ModelParams.elevKSeq_dyn ); free( ( *hHrtf )->ModelParams.azim_start_idx_dyn ); +#ifndef FIX_989_TD_REND_ROM free( ( *hHrtf )->ModelParams.azimDim2_dyn ); +#endif free( ( *hHrtf )->ModelParams.azimDim3_dyn ); free( ( *hHrtf )->ModelParams.AlphaL_dyn ); free( ( *hHrtf )->ModelParams.AlphaR_dyn ); @@ -788,6 +848,10 @@ void destroy_td_hrtf( free( ( *hHrtf )->ModelParams.azimShapeIdx_dyn ); free( ( *hHrtf )->ModelParams.azimShapeSampFactor_dyn ); +#ifdef FIX_989_TD_REND_ROM + free( ( *hHrtf )->ModelParams.elevBsLen_dyn ); + free( ( *hHrtf )->ModelParams.elevBsStart_dyn ); +#endif free( ( *hHrtf )->ModelParams.elevBsShape_dyn ); for ( i = 0; i < ( *hHrtf )->ModelParams.num_unique_azim_splines; i++ ) diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin index ffb4662687d6d2fa0e9cab79dd8bed54a3065ea5..97f7cfdf50ac4f9590a855cef9802fb74a0f26be 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_16kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:600f05865baeeb01c6435725f87c6a91e6e75e481ffae2ec3d6a7c62aba5fc7c -size 1971974 +oid sha256:41719cf6eeb2b627a48e30a9d0eb0375f2041730ef29c35e23af3162abe37ff7 +size 1971934 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin index 97190b44f8bc0e595ef3d5e9e22e02893056ba0c..0c87defe8cd12f6e3d923dcf2e377cd9b090cfca 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_32kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cda90cc841793f0a1ed76b580e46b9989564b055b664ed6746ebfa0033a74f2b -size 2430778 +oid sha256:84545fbcc27f8123f4c98f2188794797565e00b3ac76d133f6c24eebab9f7f29 +size 2430738 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin index e1f6981162b9f9f917b78e4f6b342e803dc8a8c4..68cae9bc10e4a14b76e8ce804759db58f1311b47 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_48kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c1654ead069a420b97af8755edbb1c358806aa3c5c07db3113789fe0942642de -size 2673946 +oid sha256:ef00e531e26972dd3788ad98378a6224f288d90ddd0536aefe546dccbd835bc2 +size 2673906 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_16kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_16kHz.bin index 20c688d2da51b9bdcbfed510f0c86503dfc4bde6..13787ec393cc381f9b77ec36760d2f5ed1e6c0e8 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_16kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_16kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c839dcbdcfb7de23b725325770a07de3fe0144dc56f0ba7b4a9627bc912c2547 -size 1771166 +oid sha256:420704e8c05cd809f8448c1797b3cd2e69df0deb7ebe229b51ff0b54bbf99339 +size 1771126 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_32kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_32kHz.bin index c92f4c2af0b29bee7ce6e66ac3b30bda3ee3f39e..9b7593a1d58bda1b358b3e407cbbb7c32ad143e1 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_32kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_32kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9c88daaf248bb36ac11d0aa320b18ce87019ef6ad9fab6ac2b7f064b27048aac -size 2107682 +oid sha256:5f26a82e286d6cadac49bd448bb4b621ff6381cb9c0be91a85b6723761f1c676 +size 2107642 diff --git a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_48kHz.bin b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_48kHz.bin index 61f226bca4ba61441e73905206a3a2b4e9f0741c..8e7ad080a4207d1721e3b0a1bd440303a28503b3 100644 --- a/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_48kHz.bin +++ b/scripts/binauralRenderer_interface/binaural_renderers_hrtf_data/ivas_binaural_51_brir-lc_48kHz.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ed7e4b9f3306e7aecd2edf19b7ca9fb62240031fa248b26ad7c606fef36a20fe -size 2343650 +oid sha256:7d72291e29de622a681635c11f8acceabbdfaec91e81a82146859b8b0d5ca2c8 +size 2343610 diff --git a/scripts/td_object_renderer/modeling_tool/Gen_Hrf_IVAS_Binary.m b/scripts/td_object_renderer/modeling_tool/Gen_Hrf_IVAS_Binary.m index 35d659174d395bd272b9454c21f935caffa4766b..660cedafd8a8377cc59af372abad23292b95c331 100644 --- a/scripts/td_object_renderer/modeling_tool/Gen_Hrf_IVAS_Binary.m +++ b/scripts/td_object_renderer/modeling_tool/Gen_Hrf_IVAS_Binary.m @@ -111,7 +111,7 @@ if dataSpec.genRomFile ' *------------------------------------------------------------------------*/' '/* TD renderer default HRIR model */' 'extern const float defaultHRIR_rom_latency_s;' - ['extern const int16_t defaultHRIR_rom_azimDim2[' int2str(size(mod_hrf_org.elevBf{1}, 3)) '];'] + ['extern const int16_t defaultHRIR_rom_model_configuration[6];'] ['extern const int16_t defaultHRIR_rom_azimDim3[' int2str(size(mod_hrf_org.elevBf{1}, 3)) '];'] ['extern const int16_t defaultHRIR_rom_azim_start_idx[' int2str(size(mod_hrf_org.elevBf{1}, 3)) '];'] 'extern const int16_t defaultHRIR_rom_azimSegSamples[1];' @@ -372,20 +372,14 @@ for fs = [48000 32000 16000] fwrite(fileID, fs_khz, 'short'); % General - model-specific parts - fwrite(fileID, size(mod_hrf.elevBf{1}, 1), 'short'); % N = 4 i.e. coefficients for cubic including zeroth order fwrite(fileID, size(mod_hrf.WR{1}, 2), 'short'); % K, filter length % Elevation model structure - elevDim2 = size(mod_hrf.elevBf{1}, 2); elevDim3 = size(mod_hrf.elevBf{1}, 3); - fwrite(fileID, elevDim2, 'short'); % elevDim2 fwrite(fileID, elevDim3, 'short'); % elevDim3 = P fwrite(fileID, mod_hrf.elevKSeq{1}, 'float'); % length = elevDim3-2 % Azimuth model structure azim_start_idx = 0; - c_file_content_dim2 = { - ['const int16_t defaultHRIR_rom_azimDim2[' num2str(elevDim3) '] = {'] - }; c_file_content_dim3 = { ['const int16_t defaultHRIR_rom_azimDim3[' num2str(elevDim3) '] = {'] }; @@ -399,8 +393,6 @@ for fs = [48000 32000 16000] for i = 1:elevDim3 azimDim2 = size(mod_hrf.azimBf{i}, 2); azimDim3 = size(mod_hrf.azimBf{i}, 3); - fwrite(fileID, azimDim2, 'short'); % azimDim2 - content_dim2 = [content_dim2 int2str(azimDim2) ', ']; fwrite(fileID, azimDim3, 'short'); % azimDim3 = Q content_dim3 = [content_dim3 int2str(azimDim3) ', ']; fwrite(fileID, azim_start_idx, 'short'); % start azim index per elevation @@ -410,9 +402,6 @@ for fs = [48000 32000 16000] end if fs == fs_orig && dataSpec.genRomFile fileID_c = fopen(c_file_name,'at'); - c_file_content_dim2{size(c_file_content_dim2,2)+1} = content_dim2; - c_file_content_dim2{size(c_file_content_dim2,2)+1} = '};'; - c_file_content_dim2{size(c_file_content_dim2,2)+1} = ''; c_file_content_dim3{size(c_file_content_dim3,2)+1} = content_dim3; c_file_content_dim3{size(c_file_content_dim3,2)+1} = '};'; c_file_content_dim3{size(c_file_content_dim3,2)+1} = ''; @@ -420,14 +409,64 @@ for fs = [48000 32000 16000] c_file_content_start_idx{size(c_file_content_start_idx,2)+1} = '};'; c_file_content_start_idx{size(c_file_content_start_idx,2)+1} = ''; - c_file_content = string(join(c_file_content_dim2,newline)); + c_file_content = ... + ['const int16_t defaultHRIR_rom_model_configuration[6] = {' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = [ num2str(useITD) ', /* UseItdModel */' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = [ num2str(elevDim3) ', /* elevDim3 */' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = [ num2str(size(mod_hrf_org.WL{1}, 1)) ', /* AlphaN */' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = [ num2str(num_unique_splines) ', /* num_unique_azim_splines */' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = [ num2str(e_num_points) ', /* elevSegSamples */' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = [ num2str(size(mod_hrf_org.WL{1}, 2)) ', /* K_48k */' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = ['};' newline ]; + fprintf(fileID_c,'%s', c_file_content); + + arr_str = join(mat2str((single(len_e)))); + arr_str = arr_str(2:end); + arr_str(end) = ';'; + arr_str = replace(arr_str, ";",','); + arr_str = replace(arr_str, " ",', '); + c_file_content = ... + ['const int16_t defaultHRIR_rom_elevBsLen[' num2str(length(len_e)) '] = {' newline ... + arr_str ... + newline '};' newline ... + ]; + fprintf(fileID_c,'%s', c_file_content); + + arr_str = join(mat2str((single(start_e)))); + arr_str = arr_str(2:end); + arr_str(end) = ';'; + arr_str = replace(arr_str, ";",','); + arr_str = replace(arr_str, " ",', '); + c_file_content = ... + ['const int16_t defaultHRIR_rom_elevBsStart[' num2str(length(start_e)) '] = {' newline ... + arr_str ... + newline '};' newline ... + ]; fprintf(fileID_c,'%s', c_file_content); + c_file_content = string(join(c_file_content_dim3,newline)); fprintf(fileID_c,'%s', c_file_content); c_file_content = string(join(c_file_content_start_idx,newline)); fprintf(fileID_c,'%s', c_file_content); - - c_file_content = ['const int16_t defaultHRIR_rom_azimSegSamples[1] = {' newline num2str(mod_hrf_org.azimKmSeq{1,2}(2)) ',' newline '};' newline]; + + + arr_str = join(mat2str((single(a_num_points(1:num_unique_splines))))); + if(num_unique_splines>1) + arr_str = arr_str(2:end); + arr_str(end) = ';'; + arr_str = replace(arr_str, ";",','); + arr_str = replace(arr_str, " ",', '); + else + arr_str(end+1) = ','; + end + c_file_content = ['const int16_t defaultHRIR_rom_azimSegSamples[' num2str(num_unique_splines) '] = {' newline arr_str newline '};' newline]; fprintf(fileID_c,'%s', c_file_content); arr_str = mat2str(azimShapeIdx); @@ -662,20 +701,15 @@ for fs = [48000 32000 16000] % If ITD model is used, parameters are stored in 2nd part of the same file if useITD % General - fwrite(fileID, size(mod_itd.elevBf, 1), 'short'); % N = 4 i.e. coefficients for cubic including zeroth order %fwrite(fileID, size(mod_itd.W, 2), 'short'); % K = 1 always for ITD, so do not need to write. % Elevation model structure - elevDim2 = size(mod_itd.elevBf, 2); elevDim3 = size(mod_itd.elevBf, 3); - fwrite(fileID, elevDim2, 'short'); % elevDim2 fwrite(fileID, elevDim3, 'short'); % elevDim3 = P fwrite(fileID, mod_itd.elevKSeq, 'float'); % length = elevDim3-2 % Azimuth model structure - azimDim2 = size(mod_itd.azimBf{2}, 2); azimDim3 = size(mod_itd.azimBf{2}, 3); - fwrite(fileID, azimDim2, 'short'); % azimDim2 fwrite(fileID, azimDim3, 'short'); % azimDim3 = Q fwrite(fileID, mod_itd.azimKSeq{2}, 'float'); % length = azimDim3+1 @@ -725,6 +759,68 @@ for fs = [48000 32000 16000] c_file_content = [ arr_str newline '};' newline]; fprintf(fileID_c,'%s', c_file_content); + c_file_content = ... + ['const int16_t defaultHRIR_rom_ITD_model_configuration[4] = {' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = [ num2str(elevDim3) ', /* elevDim3 */' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = [ num2str(azimDim3) ', /* azimDim3 */' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = [ num2str(e_num_points_ITD) ', /* elevSegSamples */' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = [ num2str(a_num_points_ITD) ', /* azimSegSamples */' newline ]; + fprintf(fileID_c,'%s', c_file_content); + c_file_content = ['};' newline ]; + fprintf(fileID_c,'%s', c_file_content); + + arr_str = join(mat2str((single(len_e_ITD)))); + arr_str = arr_str(2:end); + arr_str(end) = ';'; + arr_str = replace(arr_str, ";",','); + arr_str = replace(arr_str, " ",', '); + c_file_content = ... + ['const int16_t defaultHRIR_rom_ITD_elevBsLen[' num2str(length(len_e_ITD)) '] = {' newline ... + arr_str ... + newline '};' newline ... + ]; + fprintf(fileID_c,'%s', c_file_content); + + arr_str = join(mat2str((single(start_e_ITD)))); + arr_str = arr_str(2:end); + arr_str(end) = ';'; + arr_str = replace(arr_str, ";",','); + arr_str = replace(arr_str, " ",', '); + c_file_content = ... + ['const int16_t defaultHRIR_rom_ITD_elevBsStart[' num2str(length(start_e_ITD)) '] = {' newline ... + arr_str ... + newline '};' newline ... + ]; + fprintf(fileID_c,'%s', c_file_content); + + arr_str = join(mat2str((single(len_a_ITD)))); + arr_str = arr_str(2:end); + arr_str(end) = ';'; + arr_str = replace(arr_str, ";",','); + arr_str = replace(arr_str, " ",', '); + c_file_content = ... + ['const int16_t defaultHRIR_rom_ITD_azimBsLen[' num2str(length(len_a_ITD)) '] = {' newline ... + arr_str ... + newline '};' newline ... + ]; + fprintf(fileID_c,'%s', c_file_content); + + arr_str = join(mat2str((single(start_a_ITD)))); + arr_str = arr_str(2:end); + arr_str(end) = ';'; + arr_str = replace(arr_str, ";",','); + arr_str = replace(arr_str, " ",', '); + c_file_content = ... + ['const int16_t defaultHRIR_rom_ITD_azimBsStart[' num2str(length(start_a_ITD)) '] = {' newline ... + arr_str ... + newline '};' newline ... + ]; + fprintf(fileID_c,'%s', c_file_content); + arr_str_all = num2hex(single(azimSplineShapeITD_all)); numCol = 25; numIter = floor(length(azimSplineShapeITD_all)/numCol); @@ -809,6 +905,8 @@ end % fs loop if dataSpec.genRomFile h_file_content = string(join({'' + ['extern const int16_t defaultHRIR_rom_elevBsLen[' int2str(length(len_e)) '];'] + ['extern const int16_t defaultHRIR_rom_elevBsStart[' int2str(length(start_e)) '];'] ['extern const uint32_t defaultHRIR_rom_elevBsShape[' int2str(length(elevSplineShape_all)) '];'] ['extern const uint32_t defaultHRIR_rom_azimBsShape[' int2str(length(azimSplineShape{1})) '];'] ['extern const uint32_t defaultHRIR_rom_ITD_W[' int2str(mod_itd.angleBfNum) '];'] @@ -816,6 +914,11 @@ if dataSpec.genRomFile ['extern const float defaultHRIR_rom_ITD_azimKSeq[19];'] ['extern const uint32_t defaultHRIR_rom_ITD_elevBsShape[' int2str(length(elevSplineShapeITD_all)) '];'] ['extern const float defaultHRIR_rom_ITD_elevKSeq[16];'] + ['extern const int16_t defaultHRIR_rom_ITD_model_configuration[4];'] + ['extern const int16_t defaultHRIR_rom_ITD_elevBsLen[' int2str(length(len_e_ITD)) '];'] + ['extern const int16_t defaultHRIR_rom_ITD_elevBsStart[' int2str(length(start_e_ITD)) '];'] + ['extern const int16_t defaultHRIR_rom_ITD_azimBsLen[' int2str(length(len_a_ITD)) '];'] + ['extern const int16_t defaultHRIR_rom_ITD_azimBsStart[' int2str(length(start_a_ITD)) '];'] '#endif' '' }, newline));