Loading lib_com/options.h +3 −0 Original line number Diff line number Diff line Loading @@ -159,12 +159,15 @@ #define SPLIT_REND_POSE_CORRECTION_UNUSED_BITS #define FIX_CREND_FIX_POINT_HRTF_FILE_FORMAT /* Orange issue 1031 : fix point hrtf binary file format */ #define FIX_TDREND_HRTF_FILE_FORMAT /* Eri: fix point hrtf binary file format for TDREND */ #define FIX_1053_REVERB_RECONFIGURATION /* Philips: issue 1053: fix for dynamic switching of acoustic environment */ #define CONF_DISTATT /* Eri: Make distance attenuation configurable */ #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 */ /* #################### End BE switches ################################## */ /* #################### Start NON-BE switches ############################ */ Loading lib_util/hrtf_file_reader.c +311 −0 Original line number Diff line number Diff line Loading @@ -256,7 +256,109 @@ static ivas_error read_hrtf_binary_header( return IVAS_ERR_END_OF_FILE; } #ifdef FIX_TDREND_HRTF_FILE_FORMAT /*-------------------------------------------------------------------* * LoadBSplineBinaryITD_fx() * * Loads the B Spline HR filter model ITD data from file. --------------------------------------------------------------------*/ static void LoadBSplineBinaryITD_fx( ModelParamsITD_t *modelITD, /* i/o: ITD model parameter structure */ FILE *f_hrtf /* i : HR filter data file handle */ ) { int16_t tmp, factor_Q; int16_t *v_tmp16; int16_t j; float q_scale; 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 ); modelITD->elevKSeq_dyn = (float *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( float ) ); v_tmp16 = (int16_t *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), modelITD->elevDim3 - 2, f_hrtf ); for ( j = 0; j < modelITD->elevDim3 - 2; j++ ) { modelITD->elevKSeq_dyn[j] = ( (float) v_tmp16[j] ) * q_scale; } fread( &modelITD->azimDim2, sizeof( int16_t ), 1, 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 */ v_tmp16 = (int16_t *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf ); for ( j = 0; j < ( modelITD->azimDim3 + 1 ) / 2 - 2; j++ ) { modelITD->azimKSeq_dyn[j] = ( (float) v_tmp16[j] ) * q_scale; } fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); modelITD->W_dyn = (float *) malloc( tmp * sizeof( float ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); v_tmp16 = (int16_t *) malloc( tmp * sizeof( int16_t ) ); fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf ); for ( j = 0; j < tmp; j++ ) { modelITD->W_dyn[j] = ( (float) v_tmp16[j] ) * q_scale; } /* azimuth */ 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 ); fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); modelITD->azimBsShape_dyn = (float *) malloc( tmp * sizeof( float ) ); v_tmp16 = (int16_t *) malloc( tmp * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf ); for ( j = 0; j < tmp; j++ ) { modelITD->azimBsShape_dyn[j] = ( (float) v_tmp16[j] ) * q_scale; } fread( &modelITD->azimSegSamples, sizeof( int16_t ), 1, f_hrtf ); /* elevation */ 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 ); fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); modelITD->elevBsShape_dyn = (float *) malloc( tmp * sizeof( float ) ); v_tmp16 = (int16_t *) malloc( tmp * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf ); for ( j = 0; j < tmp; j++ ) { modelITD->elevBsShape_dyn[j] = ( (float) v_tmp16[j] ) * q_scale; } fread( &modelITD->elevSegSamples, sizeof( int16_t ), 1, f_hrtf ); modelITD->elevKSeq = (const float *) modelITD->elevKSeq_dyn; modelITD->azimKSeq = (const float *) modelITD->azimKSeq_dyn; modelITD->W = (const float *) modelITD->W_dyn; modelITD->azimBsShape = (const float *) modelITD->azimBsShape_dyn; modelITD->elevBsShape = (const float *) modelITD->elevBsShape_dyn; return; } #endif /*-------------------------------------------------------------------* * LoadBSplineBinaryITD() * Loading Loading @@ -315,6 +417,204 @@ static void LoadBSplineBinaryITD( return; } #ifdef FIX_TDREND_HRTF_FILE_FORMAT /*-------------------------------------------------------------------* * LoadBSplineBinary_fx() * * Loads the B Spline HR filter model data from file. --------------------------------------------------------------------*/ static ivas_error LoadBSplineBinary_fx( IVAS_DEC_HRTF_HANDLE HrFiltSet_p, /* i/o: HR filter model parameter structure */ FILE *f_hrtf /* i : HR filter data file handle */ ) { ModelParams_t *model; int16_t i, tmp, factor_Q; int16_t *v_tmp16; int32_t j, tmp32; float q_scale; fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( &tmp32, 1, sizeof( int32_t ), f_hrtf ); HrFiltSet_p->latency_s = ( (float) tmp32 ) * q_scale; model = &( HrFiltSet_p->ModelParams ); /* Set ROM flag for correct deallocation */ model->modelROM = FALSE; fread( &model->UseItdModel, sizeof( int16_t ), 1, f_hrtf ); /* Indicates if ITD model is active */ fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); switch ( tmp ) { case 16: HrFiltSet_p->SampleRate = 16000; if ( HrFiltSet_p->ModelParams.UseItdModel ) { HrFiltSet_p->ModelParamsITD.resamp_factor = RESAMPLE_FACTOR_16_48; } break; case 32: HrFiltSet_p->SampleRate = 32000; if ( HrFiltSet_p->ModelParams.UseItdModel ) { HrFiltSet_p->ModelParamsITD.resamp_factor = RESAMPLE_FACTOR_32_48; } break; case 48: HrFiltSet_p->SampleRate = 48000; if ( HrFiltSet_p->ModelParams.UseItdModel ) { HrFiltSet_p->ModelParamsITD.resamp_factor = 1.0f; } break; default: return IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "Error: HR filter file had an unsupported sampling rate (%d kHz)", tmp ); } fread( &model->SplineDegree, sizeof( int16_t ), 1, f_hrtf ); fread( &model->K, sizeof( int16_t ), 1, f_hrtf ); fread( &model->elevDim2, 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 ) ); v_tmp16 = (int16_t *) malloc( ( model->elevDim3 - 2 ) * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), model->elevDim3 - 2, f_hrtf ); for ( j = 0; j < model->elevDim3 - 2; j++ ) { model->elevKSeq_dyn[j] = ( (float) v_tmp16[j] * q_scale ); } free( v_tmp16 ); model->azimDim2_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); 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++ ) { fread( &model->azimDim2_dyn[i], sizeof( int16_t ), 1, f_hrtf ); 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 ) ); v_tmp16 = (int16_t *) malloc( ( model->azimDim3_dyn[i] + 1 ) * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), ( model->azimDim3_dyn[i] + 1 ), f_hrtf ); for ( j = 0; j < model->azimDim3_dyn[i] + 1; j++ ) { model->azimKSeq[i][j] = ( (float) v_tmp16[j] * q_scale ); } free( v_tmp16 ); } fread( &model->AlphaN, sizeof( int16_t ), 1, f_hrtf ); model->AlphaL_dyn = (float *) malloc( model->AlphaN * model->K * sizeof( float ) ); v_tmp16 = (int16_t *) malloc( model->AlphaN * model->K * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), model->AlphaN * model->K, f_hrtf ); for ( j = 0; j < model->AlphaN * model->K; j++ ) { model->AlphaL_dyn[j] = ( (float) ( v_tmp16[j] ) ) * q_scale; // Q14 } model->AlphaR_dyn = (float *) malloc( model->AlphaN * model->K * sizeof( float ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), model->AlphaN * model->K, f_hrtf ); for ( j = 0; j < model->AlphaN * model->K; j++ ) { model->AlphaR_dyn[j] = ( (float) ( v_tmp16[j] ) ) * q_scale; // Q14 } /* azimuth */ fread( &model->num_unique_azim_splines, sizeof( int16_t ), 1, f_hrtf ); model->azimBsShape = (const float **) malloc( model->num_unique_azim_splines * sizeof( float * ) ); model->azimBsShape_dyn = (float **) malloc( model->num_unique_azim_splines * sizeof( float * ) ); model->azimSegSamples_dyn = (int16_t *) malloc( model->num_unique_azim_splines * sizeof( int16_t ) ); for ( i = 0; i < model->num_unique_azim_splines; i++ ) { fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); model->azimBsShape_dyn[i] = (float *) malloc( tmp * sizeof( float ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf ); for ( j = 0; j < tmp; j++ ) { model->azimBsShape_dyn[i][j] = ( (float) ( v_tmp16[j] ) ) * q_scale; } fread( &model->azimSegSamples_dyn[i], sizeof( int16_t ), 1, f_hrtf ); } model->azimShapeIdx_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); fread( model->azimShapeIdx_dyn, sizeof( int16_t ), model->elevDim3, f_hrtf ); model->azimShapeSampFactor_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); fread( model->azimShapeSampFactor_dyn, sizeof( int16_t ), model->elevDim3, f_hrtf ); /* elevation */ 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 ); fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); model->elevBsShape_dyn = (float *) malloc( tmp * sizeof( float ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf ); for ( j = 0; j < tmp; j++ ) { model->elevBsShape_dyn[j] = ( (float) ( v_tmp16[j] ) ) * q_scale; } fread( &model->elevSegSamples, sizeof( int16_t ), 1, f_hrtf ); /* Set const pointers */ model->AlphaL = (const float *) model->AlphaL_dyn; model->AlphaR = (const float *) model->AlphaR_dyn; model->EL = (const float *) model->EL_dyn; model->ER = (const float *) model->ER_dyn; model->elevBsShape = (const float *) model->elevBsShape_dyn; model->elevKSeq = (const float *) model->elevKSeq_dyn; model->azimDim2 = (const int16_t *) model->azimDim2_dyn; 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; model->azimShapeIdx = (const int16_t *) model->azimShapeIdx_dyn; model->azimShapeSampFactor = (const int16_t *) model->azimShapeSampFactor_dyn; for ( i = 0; i < model->num_unique_azim_splines; i++ ) { model->azimBsShape[i] = (const float *) model->azimBsShape_dyn[i]; } HRTF_model_precalc( model ); HRTF_energy_sections_precalc( model ); HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K; HrFiltSet_p->ModelEval.hrfModL = (float *) malloc( model->K * sizeof( float ) ); HrFiltSet_p->ModelEval.hrfModR = (float *) malloc( model->K * sizeof( float ) ); if ( HrFiltSet_p->ModelParams.UseItdModel ) { LoadBSplineBinaryITD_fx( &HrFiltSet_p->ModelParamsITD, f_hrtf ); } free( v_tmp16 ); return IVAS_ERR_OK; } #endif /*-------------------------------------------------------------------* * LoadBSplineBinary() Loading Loading @@ -728,8 +1028,19 @@ static ivas_error TDREND_MIX_LoadHRTF( } else { #ifdef FIX_TDREND_HRTF_FILE_FORMAT if ( is_fx ) { header_check_result = LoadBSplineBinary_fx( HrFiltSet_p, f_hrtf ); } else { header_check_result = LoadBSplineBinary( HrFiltSet_p, f_hrtf ); } #else header_check_result = LoadBSplineBinary( HrFiltSet_p, f_hrtf ); #endif } } else { Loading scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c +21 −0 Original line number Diff line number Diff line Loading @@ -821,6 +821,9 @@ char *create_hrtf_tdrend( int32_t frequency, int32_t *hrtf_size ) FILE *input_td_bin_file = NULL; int32_t td_hrtf_header_size, td_hrtf_data_size; char *td_hrtf = NULL, *td_hrtf_wptr, *full_in_td_path = NULL; #ifdef FIX_TDREND_HRTF_FILE_FORMAT int16_t is_fx; #endif // left/right and coherences for late reverb table sizes Loading @@ -842,6 +845,13 @@ char *create_hrtf_tdrend( int32_t frequency, int32_t *hrtf_size ) #endif input_td_bin_file = fopen( full_in_td_path, "rb" ); #ifdef FIX_TDREND_HRTF_FILE_FORMAT if ( strstr( input_td_bin_file_name, "_fx" ) ) { is_fx = 1; } #endif if ( input_td_bin_file != NULL ) { Loading Loading @@ -875,7 +885,18 @@ char *create_hrtf_tdrend( int32_t frequency, int32_t *hrtf_size ) // Get the HRTF header // Renderer type #ifdef FIX_TDREND_HRTF_FILE_FORMAT if ( is_fx == 1 ) { *( (int32_t *) ( td_hrtf_wptr ) ) = HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD + DEFAULT_BIN_FILE_FX_FLAG; } else { *( (int32_t *) ( td_hrtf_wptr ) ) = HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD; } #else *( (int32_t *) ( td_hrtf_wptr ) ) = HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD; #endif td_hrtf_wptr += sizeof( int32_t ); // Decoder output format Loading scripts/binauralRenderer_interface/generate_ivas_binauralizer_tables_from_sofa.m +14 −1 Original line number Diff line number Diff line Loading @@ -96,6 +96,19 @@ dataSpec.subjId = 'custom'; dataSpec.hrfInDir = hrir_file; dataSpec.hrfOutDir = binary_path; dataSpec.genRomFile = writeRomFileOutput; dataSpec.fx = false; dataSpec.float = true; dataSpec.romOutDir = rom_path; Mod_Hrf_Itd_Main(dataSpec); dataSpec.dataBase = 'IVAS'; dataSpec.subjId = 'custom'; % specify HR filter directory dataSpec.hrfInDir = hrir_file; dataSpec.hrfOutDir = binary_path; dataSpec.genRomFile = writeRomFileOutput; dataSpec.fx = true; dataSpec.float = false; dataSpec.romOutDir = rom_path; Mod_Hrf_Itd_Main(dataSpec); Loading scripts/td_object_renderer/modeling_tool/Gen_Hrf_IVAS_Binary.m +851 −113 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
lib_com/options.h +3 −0 Original line number Diff line number Diff line Loading @@ -159,12 +159,15 @@ #define SPLIT_REND_POSE_CORRECTION_UNUSED_BITS #define FIX_CREND_FIX_POINT_HRTF_FILE_FORMAT /* Orange issue 1031 : fix point hrtf binary file format */ #define FIX_TDREND_HRTF_FILE_FORMAT /* Eri: fix point hrtf binary file format for TDREND */ #define FIX_1053_REVERB_RECONFIGURATION /* Philips: issue 1053: fix for dynamic switching of acoustic environment */ #define CONF_DISTATT /* Eri: Make distance attenuation configurable */ #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 */ /* #################### End BE switches ################################## */ /* #################### Start NON-BE switches ############################ */ Loading
lib_util/hrtf_file_reader.c +311 −0 Original line number Diff line number Diff line Loading @@ -256,7 +256,109 @@ static ivas_error read_hrtf_binary_header( return IVAS_ERR_END_OF_FILE; } #ifdef FIX_TDREND_HRTF_FILE_FORMAT /*-------------------------------------------------------------------* * LoadBSplineBinaryITD_fx() * * Loads the B Spline HR filter model ITD data from file. --------------------------------------------------------------------*/ static void LoadBSplineBinaryITD_fx( ModelParamsITD_t *modelITD, /* i/o: ITD model parameter structure */ FILE *f_hrtf /* i : HR filter data file handle */ ) { int16_t tmp, factor_Q; int16_t *v_tmp16; int16_t j; float q_scale; 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 ); modelITD->elevKSeq_dyn = (float *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( float ) ); v_tmp16 = (int16_t *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), modelITD->elevDim3 - 2, f_hrtf ); for ( j = 0; j < modelITD->elevDim3 - 2; j++ ) { modelITD->elevKSeq_dyn[j] = ( (float) v_tmp16[j] ) * q_scale; } fread( &modelITD->azimDim2, sizeof( int16_t ), 1, 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 */ v_tmp16 = (int16_t *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf ); for ( j = 0; j < ( modelITD->azimDim3 + 1 ) / 2 - 2; j++ ) { modelITD->azimKSeq_dyn[j] = ( (float) v_tmp16[j] ) * q_scale; } fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); modelITD->W_dyn = (float *) malloc( tmp * sizeof( float ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); v_tmp16 = (int16_t *) malloc( tmp * sizeof( int16_t ) ); fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf ); for ( j = 0; j < tmp; j++ ) { modelITD->W_dyn[j] = ( (float) v_tmp16[j] ) * q_scale; } /* azimuth */ 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 ); fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); modelITD->azimBsShape_dyn = (float *) malloc( tmp * sizeof( float ) ); v_tmp16 = (int16_t *) malloc( tmp * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf ); for ( j = 0; j < tmp; j++ ) { modelITD->azimBsShape_dyn[j] = ( (float) v_tmp16[j] ) * q_scale; } fread( &modelITD->azimSegSamples, sizeof( int16_t ), 1, f_hrtf ); /* elevation */ 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 ); fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); modelITD->elevBsShape_dyn = (float *) malloc( tmp * sizeof( float ) ); v_tmp16 = (int16_t *) malloc( tmp * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf ); for ( j = 0; j < tmp; j++ ) { modelITD->elevBsShape_dyn[j] = ( (float) v_tmp16[j] ) * q_scale; } fread( &modelITD->elevSegSamples, sizeof( int16_t ), 1, f_hrtf ); modelITD->elevKSeq = (const float *) modelITD->elevKSeq_dyn; modelITD->azimKSeq = (const float *) modelITD->azimKSeq_dyn; modelITD->W = (const float *) modelITD->W_dyn; modelITD->azimBsShape = (const float *) modelITD->azimBsShape_dyn; modelITD->elevBsShape = (const float *) modelITD->elevBsShape_dyn; return; } #endif /*-------------------------------------------------------------------* * LoadBSplineBinaryITD() * Loading Loading @@ -315,6 +417,204 @@ static void LoadBSplineBinaryITD( return; } #ifdef FIX_TDREND_HRTF_FILE_FORMAT /*-------------------------------------------------------------------* * LoadBSplineBinary_fx() * * Loads the B Spline HR filter model data from file. --------------------------------------------------------------------*/ static ivas_error LoadBSplineBinary_fx( IVAS_DEC_HRTF_HANDLE HrFiltSet_p, /* i/o: HR filter model parameter structure */ FILE *f_hrtf /* i : HR filter data file handle */ ) { ModelParams_t *model; int16_t i, tmp, factor_Q; int16_t *v_tmp16; int32_t j, tmp32; float q_scale; fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( &tmp32, 1, sizeof( int32_t ), f_hrtf ); HrFiltSet_p->latency_s = ( (float) tmp32 ) * q_scale; model = &( HrFiltSet_p->ModelParams ); /* Set ROM flag for correct deallocation */ model->modelROM = FALSE; fread( &model->UseItdModel, sizeof( int16_t ), 1, f_hrtf ); /* Indicates if ITD model is active */ fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); switch ( tmp ) { case 16: HrFiltSet_p->SampleRate = 16000; if ( HrFiltSet_p->ModelParams.UseItdModel ) { HrFiltSet_p->ModelParamsITD.resamp_factor = RESAMPLE_FACTOR_16_48; } break; case 32: HrFiltSet_p->SampleRate = 32000; if ( HrFiltSet_p->ModelParams.UseItdModel ) { HrFiltSet_p->ModelParamsITD.resamp_factor = RESAMPLE_FACTOR_32_48; } break; case 48: HrFiltSet_p->SampleRate = 48000; if ( HrFiltSet_p->ModelParams.UseItdModel ) { HrFiltSet_p->ModelParamsITD.resamp_factor = 1.0f; } break; default: return IVAS_ERROR( IVAS_ERR_INVALID_HRTF, "Error: HR filter file had an unsupported sampling rate (%d kHz)", tmp ); } fread( &model->SplineDegree, sizeof( int16_t ), 1, f_hrtf ); fread( &model->K, sizeof( int16_t ), 1, f_hrtf ); fread( &model->elevDim2, 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 ) ); v_tmp16 = (int16_t *) malloc( ( model->elevDim3 - 2 ) * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), model->elevDim3 - 2, f_hrtf ); for ( j = 0; j < model->elevDim3 - 2; j++ ) { model->elevKSeq_dyn[j] = ( (float) v_tmp16[j] * q_scale ); } free( v_tmp16 ); model->azimDim2_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); 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++ ) { fread( &model->azimDim2_dyn[i], sizeof( int16_t ), 1, f_hrtf ); 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 ) ); v_tmp16 = (int16_t *) malloc( ( model->azimDim3_dyn[i] + 1 ) * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), ( model->azimDim3_dyn[i] + 1 ), f_hrtf ); for ( j = 0; j < model->azimDim3_dyn[i] + 1; j++ ) { model->azimKSeq[i][j] = ( (float) v_tmp16[j] * q_scale ); } free( v_tmp16 ); } fread( &model->AlphaN, sizeof( int16_t ), 1, f_hrtf ); model->AlphaL_dyn = (float *) malloc( model->AlphaN * model->K * sizeof( float ) ); v_tmp16 = (int16_t *) malloc( model->AlphaN * model->K * sizeof( int16_t ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), model->AlphaN * model->K, f_hrtf ); for ( j = 0; j < model->AlphaN * model->K; j++ ) { model->AlphaL_dyn[j] = ( (float) ( v_tmp16[j] ) ) * q_scale; // Q14 } model->AlphaR_dyn = (float *) malloc( model->AlphaN * model->K * sizeof( float ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), model->AlphaN * model->K, f_hrtf ); for ( j = 0; j < model->AlphaN * model->K; j++ ) { model->AlphaR_dyn[j] = ( (float) ( v_tmp16[j] ) ) * q_scale; // Q14 } /* azimuth */ fread( &model->num_unique_azim_splines, sizeof( int16_t ), 1, f_hrtf ); model->azimBsShape = (const float **) malloc( model->num_unique_azim_splines * sizeof( float * ) ); model->azimBsShape_dyn = (float **) malloc( model->num_unique_azim_splines * sizeof( float * ) ); model->azimSegSamples_dyn = (int16_t *) malloc( model->num_unique_azim_splines * sizeof( int16_t ) ); for ( i = 0; i < model->num_unique_azim_splines; i++ ) { fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); model->azimBsShape_dyn[i] = (float *) malloc( tmp * sizeof( float ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf ); for ( j = 0; j < tmp; j++ ) { model->azimBsShape_dyn[i][j] = ( (float) ( v_tmp16[j] ) ) * q_scale; } fread( &model->azimSegSamples_dyn[i], sizeof( int16_t ), 1, f_hrtf ); } model->azimShapeIdx_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); fread( model->azimShapeIdx_dyn, sizeof( int16_t ), model->elevDim3, f_hrtf ); model->azimShapeSampFactor_dyn = (int16_t *) malloc( model->elevDim3 * sizeof( int16_t ) ); fread( model->azimShapeSampFactor_dyn, sizeof( int16_t ), model->elevDim3, f_hrtf ); /* elevation */ 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 ); fread( &tmp, sizeof( int16_t ), 1, f_hrtf ); model->elevBsShape_dyn = (float *) malloc( tmp * sizeof( float ) ); fread( &factor_Q, 1, sizeof( int16_t ), f_hrtf ); q_scale = powf( 2.f, -1.f * (float) factor_Q ); fread( v_tmp16, sizeof( int16_t ), tmp, f_hrtf ); for ( j = 0; j < tmp; j++ ) { model->elevBsShape_dyn[j] = ( (float) ( v_tmp16[j] ) ) * q_scale; } fread( &model->elevSegSamples, sizeof( int16_t ), 1, f_hrtf ); /* Set const pointers */ model->AlphaL = (const float *) model->AlphaL_dyn; model->AlphaR = (const float *) model->AlphaR_dyn; model->EL = (const float *) model->EL_dyn; model->ER = (const float *) model->ER_dyn; model->elevBsShape = (const float *) model->elevBsShape_dyn; model->elevKSeq = (const float *) model->elevKSeq_dyn; model->azimDim2 = (const int16_t *) model->azimDim2_dyn; 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; model->azimShapeIdx = (const int16_t *) model->azimShapeIdx_dyn; model->azimShapeSampFactor = (const int16_t *) model->azimShapeSampFactor_dyn; for ( i = 0; i < model->num_unique_azim_splines; i++ ) { model->azimBsShape[i] = (const float *) model->azimBsShape_dyn[i]; } HRTF_model_precalc( model ); HRTF_energy_sections_precalc( model ); HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K; HrFiltSet_p->ModelEval.hrfModL = (float *) malloc( model->K * sizeof( float ) ); HrFiltSet_p->ModelEval.hrfModR = (float *) malloc( model->K * sizeof( float ) ); if ( HrFiltSet_p->ModelParams.UseItdModel ) { LoadBSplineBinaryITD_fx( &HrFiltSet_p->ModelParamsITD, f_hrtf ); } free( v_tmp16 ); return IVAS_ERR_OK; } #endif /*-------------------------------------------------------------------* * LoadBSplineBinary() Loading Loading @@ -728,8 +1028,19 @@ static ivas_error TDREND_MIX_LoadHRTF( } else { #ifdef FIX_TDREND_HRTF_FILE_FORMAT if ( is_fx ) { header_check_result = LoadBSplineBinary_fx( HrFiltSet_p, f_hrtf ); } else { header_check_result = LoadBSplineBinary( HrFiltSet_p, f_hrtf ); } #else header_check_result = LoadBSplineBinary( HrFiltSet_p, f_hrtf ); #endif } } else { Loading
scripts/binauralRenderer_interface/Table_Format_Converter/generate_tables_from_rom_to_bin.c +21 −0 Original line number Diff line number Diff line Loading @@ -821,6 +821,9 @@ char *create_hrtf_tdrend( int32_t frequency, int32_t *hrtf_size ) FILE *input_td_bin_file = NULL; int32_t td_hrtf_header_size, td_hrtf_data_size; char *td_hrtf = NULL, *td_hrtf_wptr, *full_in_td_path = NULL; #ifdef FIX_TDREND_HRTF_FILE_FORMAT int16_t is_fx; #endif // left/right and coherences for late reverb table sizes Loading @@ -842,6 +845,13 @@ char *create_hrtf_tdrend( int32_t frequency, int32_t *hrtf_size ) #endif input_td_bin_file = fopen( full_in_td_path, "rb" ); #ifdef FIX_TDREND_HRTF_FILE_FORMAT if ( strstr( input_td_bin_file_name, "_fx" ) ) { is_fx = 1; } #endif if ( input_td_bin_file != NULL ) { Loading Loading @@ -875,7 +885,18 @@ char *create_hrtf_tdrend( int32_t frequency, int32_t *hrtf_size ) // Get the HRTF header // Renderer type #ifdef FIX_TDREND_HRTF_FILE_FORMAT if ( is_fx == 1 ) { *( (int32_t *) ( td_hrtf_wptr ) ) = HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD + DEFAULT_BIN_FILE_FX_FLAG; } else { *( (int32_t *) ( td_hrtf_wptr ) ) = HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD; } #else *( (int32_t *) ( td_hrtf_wptr ) ) = HRTF_READER_RENDERER_BINAURAL_OBJECTS_TD; #endif td_hrtf_wptr += sizeof( int32_t ); // Decoder output format Loading
scripts/binauralRenderer_interface/generate_ivas_binauralizer_tables_from_sofa.m +14 −1 Original line number Diff line number Diff line Loading @@ -96,6 +96,19 @@ dataSpec.subjId = 'custom'; dataSpec.hrfInDir = hrir_file; dataSpec.hrfOutDir = binary_path; dataSpec.genRomFile = writeRomFileOutput; dataSpec.fx = false; dataSpec.float = true; dataSpec.romOutDir = rom_path; Mod_Hrf_Itd_Main(dataSpec); dataSpec.dataBase = 'IVAS'; dataSpec.subjId = 'custom'; % specify HR filter directory dataSpec.hrfInDir = hrir_file; dataSpec.hrfOutDir = binary_path; dataSpec.genRomFile = writeRomFileOutput; dataSpec.fx = true; dataSpec.float = false; dataSpec.romOutDir = rom_path; Mod_Hrf_Itd_Main(dataSpec); Loading
scripts/td_object_renderer/modeling_tool/Gen_Hrf_IVAS_Binary.m +851 −113 File changed.Preview size limit exceeded, changes collapsed. Show changes