Unverified Commit 9f88d219 authored by norvell's avatar norvell
Browse files

Change to Word16 for knot sequence parameters

parent 911e9627
Loading
Loading
Loading
Loading
+55 −6
Original line number Diff line number Diff line
@@ -45,7 +45,11 @@
 *---------------------------------------------------------------------*/

static void getPeriodicBSplineSampVec_fx( Word32 *BfVec_fx, Word16 *AzIdx, const Word16 NumBFs, const Word32 t_fx, Word16 *num_az_idx, const Word32 knot_interval_fx, const Word32 azimKSeq_0_fx, const Word16 azimSegSamples, const Word32 *azimBsShape_fx, const Word16 subSampFactor );
#ifdef FIX_2235_TD_RENDERER_WORD16
static void getStandardBSplineSampVec_fx( Word32 *BfVec_fx, Word16 *NzIdx, Word16 *num_idx, const Word16 NumBFs, const Word32 t_fx, const Word16 *KSeq_fx, const Word16 KSeq_Q_fx, const Word16 SegSamples, const Word16 *BsLen, const Word16 *BsStart, const Word32 *BsShape_fx );
#else
static void getStandardBSplineSampVec_fx( Word32 *BfVec_fx, Word16 *NzIdx, Word16 *num_idx, const Word16 NumBFs, const Word32 t_fx, const Word32 *KSeq_fx, const Word16 SegSamples, const Word16 *BsLen, const Word16 *BsStart, const Word32 *BsShape_fx );
#endif
static void GenerateFilter_fx( const Word32 elev, Word32 azim, ModelParams_t *model, ModelEval_t *modelEval );
static void GenerateITD_fx( const Word32 elev, Word32 azim, ModelParamsITD_t *model, ModelEval_t *modelEval );
static void SkipSmallest_ValueIndex_fx( Word16 *use_inds, const ValueIndex_t *VI, const Word16 N, const Word16 n_smallest );
@@ -215,8 +219,13 @@ static void GenerateFilter_fx(
    Word16 BMEnergiesR_e, BMEnergiesL_e;
    Word16 tmp_hrfModR_e, tmp_hrfModL_e;

#ifdef FIX_2235_TD_RENDERER_WORD16
    getStandardBSplineSampVec_fx( modelEval->elevBfVec_fx, EvIdx, &num_ev_idx, model->elevDim3, elev, model->elevKSeq_fx, model->elevKSeq_Q_fx,
                                  model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape_fx );
#else
    getStandardBSplineSampVec_fx( modelEval->elevBfVec_fx, EvIdx, &num_ev_idx, model->elevDim3, elev, model->elevKSeq_fx,
                                  model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape_fx );
#endif

    FOR( p = 0; p < num_ev_idx; p++ )
    {
@@ -450,8 +459,13 @@ static void GenerateITD_fx(

    IF( NE_32( L_abs( elev_fx ), DEG_90_IN_Q22 ) )
    {
#ifdef FIX_2235_TD_RENDERER_WORD16
        getStandardBSplineSampVec_fx( modelEval->elevBfVecITD_fx, EvIdx, &num_ev_idx, model->elevDim3, elev_fx, model->elevKSeq_fx, model->elevKSeq_Q_fx,
                                      model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape_fx );
#else
        getStandardBSplineSampVec_fx( modelEval->elevBfVecITD_fx, EvIdx, &num_ev_idx, model->elevDim3, elev_fx, model->elevKSeq_fx,
                                      model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape_fx );
#endif

        azim_itd_fx = azim_fx;
        move32();
@@ -460,8 +474,13 @@ static void GenerateITD_fx(
            /* Flip spline functions around 180 deg */
            azim_itd_fx = L_sub( DEG_360_IN_Q22, azim_fx ); // Q22
        }
#ifdef FIX_2235_TD_RENDERER_WORD16
        getStandardBSplineSampVec_fx( modelEval->azimBfVecITD_fx, AzIdx, &num_az_idx, shr( add( model->azimDim3, 1 ), 1 ), azim_itd_fx, model->azimKSeq_fx, model->azimKSeq_Q_fx,
                                      model->azimSegSamples, model->azimBsLen, model->azimBsStart, model->azimBsShape_fx );
#else
        getStandardBSplineSampVec_fx( modelEval->azimBfVecITD_fx, AzIdx, &num_az_idx, shr( add( model->azimDim3, 1 ), 1 ), azim_itd_fx, model->azimKSeq_fx,
                                      model->azimSegSamples, model->azimBsLen, model->azimBsStart, model->azimBsShape_fx );
#endif
        IF( GT_32( azim_fx, DEG_180_IN_Q22 ) )
        {
            /* Flip spline functions around 180 deg */
@@ -497,7 +516,11 @@ static void GenerateITD_fx(
    /* Compute BM_ITD */
    elev_offset = 0;
    move16();
#ifdef FIX_2235_TD_RENDERER_WORD16
    if ( EQ_16( model->elevKSeq_fx[0], shl( -90, model->elevKSeq_Q_fx ) ) )
#else
    if ( EQ_32( model->elevKSeq_fx[0], -DEG_90_IN_Q22 ) )
#endif
    {
        elev_offset = sub( 1, model->azimDim3 );
    }
@@ -509,7 +532,11 @@ static void GenerateITD_fx(
        test();
        test();
        test();
#ifdef FIX_2235_TD_RENDERER_WORD16
        IF( EvIdx[p] == 0 && EQ_16( model->elevKSeq_fx[EvIdx[p]], shl( -90, model->elevKSeq_Q_fx ) ) )
#else
        IF( EvIdx[p] == 0 && EQ_32( model->elevKSeq_fx[EvIdx[p]], -DEG_90_IN_Q22 ) )
#endif
        {
            modelEval->BM_ITD_fx[qp] = modelEval->elevBfVecITD_fx[p]; // Q30
            move32();
@@ -517,7 +544,11 @@ static void GenerateITD_fx(
            move16();
            qp = add( qp, 1 );
        }
#ifdef FIX_2235_TD_RENDERER_WORD16
        ELSE IF( EQ_16( EvIdx[p], sub( model->elevDim3, 1 ) ) && EQ_16( model->elevKSeq_fx[sub( EvIdx[p], 2 )], shl( 90, model->elevKSeq_Q_fx ) ) )
#else
        ELSE IF( EQ_16( EvIdx[p], sub( model->elevDim3, 1 ) ) && EQ_32( model->elevKSeq_fx[sub( EvIdx[p], 2 )], DEG_90_IN_Q22 ) )
#endif
        {
            /* NB: -2 in if() condition above as number of knot points is numBF-2 */
            modelEval->BM_ITD_fx[qp] = modelEval->elevBfVecITD_fx[p]; // Q30
@@ -542,7 +573,11 @@ static void GenerateITD_fx(

    /* Compute ITD */
    AlphaN = add( imult1616( model->elevDim3, model->azimDim3 ), elev_offset );
#ifdef FIX_2235_TD_RENDERER_WORD16
    if ( EQ_16( model->elevKSeq_fx[sub( model->elevDim3, 3 )], shl( 90, model->elevKSeq_Q_fx ) ) ) /* Constant azimuth basis function */
#else
    if ( EQ_32( model->elevKSeq_fx[sub( model->elevDim3, 3 )], DEG_90_IN_Q22 ) ) /* Constant azimuth basis function */
#endif
    {
        AlphaN = sub( AlphaN, sub( model->azimDim3, 1 ) );
    }
@@ -672,7 +707,12 @@ static void getStandardBSplineSampVec_fx(
    Word16 *num_idx,     /* i/o: number of non-zero indices                             */
    const Word16 NumBFs, /* i  : the number of basis functions = third index of Bf      */
    const Word32 t_fx,   /* i  : estimation point                                   Q22 */
#ifdef FIX_2235_TD_RENDERER_WORD16
    const Word16 *KSeq_fx,  /* i  : knot sequence including multiplicities             Q KSeq_Q_fx */
    const Word16 KSeq_Q_fx, /* i  : Q-value of knot sequence                           */
#else
    const Word32 *KSeq_fx,                                                       /* i  : knot sequence including multiplicities             Q22 */
#endif
    const Word16 SegSamples, /* i  : samples per segment                                    */
    const Word16 *BsLen,     /* i  : lengths of basis shapes                                */
    const Word16 *BsStart,   /* i  : start of basis shapes                                  */
@@ -686,13 +726,22 @@ static void getStandardBSplineSampVec_fx(
    Word32 tmp32;

    /* assuming triple knot at the first knot */
#ifdef FIX_2235_TD_RENDERER_WORD16
    tmp32 = L_shl( L_sub( L_deposit_l( KSeq_fx[NumBFs - 3] ), L_deposit_l( KSeq_fx[0] ) ), sub( 22, KSeq_Q_fx ) ); /* Q22 */
    knot_interval_fx = L_deposit_h( BASOP_Util_Divide3216_Scale( tmp32, sub( NumBFs, 3 ), &tmp_e1 ) );
#else
    knot_interval_fx = L_deposit_h( BASOP_Util_Divide3216_Scale( L_sub( KSeq_fx[NumBFs - 3], KSeq_fx[0] ), sub( NumBFs, 3 ), &tmp_e1 ) );
#endif
    tmp_e1 = add( tmp_e1, 9 - 15 );

    /* index of closest sample point */
    tmp32 = L_deposit_h( BASOP_Util_Divide3216_Scale( knot_interval_fx, SegSamples, &tmp_e2 ) );
    tmp_e2 = add( tmp_e2, sub( tmp_e1, 15 ) );
#ifdef FIX_2235_TD_RENDERER_WORD16
    tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( t_fx, L_shl( L_deposit_l( KSeq_fx[0] ), 22 - KSeq_Q_fx ) ), tmp32, &tmp_e3 ) );
#else
    tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( t_fx, KSeq_fx[0] ), tmp32, &tmp_e3 ) );
#endif
    tmp_e3 = add( tmp_e3, sub( 9, tmp_e2 ) );
    tmp32 = L_shr( tmp32, sub( 9, tmp_e3 ) ); // Q22 (assuming tmp32 will be in range of Q22)
    d0 = extract_l( round_hrFilt_fx( tmp32, 22 ) );
+19 −0
Original line number Diff line number Diff line
@@ -179,15 +179,19 @@ void TDREND_MIX_Dealloc_fx(
        {
            IF( hBinRendererTd->HrFiltSet_p->ModelParams.UseItdModel )
            {
#ifndef FIX_2235_TD_RENDERER_WORD16
                free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.elevKSeq_dyn_fx );
                free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.azimKSeq_dyn_fx );
#endif
                free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.W_dyn_fx );
                free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.azimBsShape_dyn_fx );
                free( hBinRendererTd->HrFiltSet_p->ModelParamsITD.elevBsShape_dyn_fx );
            }
#ifndef FIX_2235_TD_RENDERER_WORD16
            free( hBinRendererTd->HrFiltSet_p->ModelParams.elevKSeq_dyn_fx );
            free( hBinRendererTd->HrFiltSet_p->ModelParams.AlphaL_dyn_fx );
            free( hBinRendererTd->HrFiltSet_p->ModelParams.AlphaR_dyn_fx );
#endif

            free( hBinRendererTd->HrFiltSet_p->ModelParams.elevBsShape_dyn_fx );
        }
@@ -438,6 +442,10 @@ static ivas_error DefaultBSplineModel_fx(
    model->azimShapeIdx = defaultHRIR_rom_azimShapeIdx;               // Q0
    model->azimShapeSampFactor = defaultHRIR_rom_azimShapeSampFactor; // Q0

#ifdef FIX_2235_TD_RENDERER_WORD16
    model->elevKSeq_fx = (const Word16 *) defaultHRIR_rom_elevKSeq_fx;
    model->elevKSeq_Q_fx = defaultHRIR_rom_elevKSeq_Q_fx;
#else
    model->elevKSeq_dyn_fx = (Word32 *) malloc( ( model->elevDim3 - 2 ) * sizeof( Word32 ) );
    IF( model->elevKSeq_dyn_fx == NULL )
    {
@@ -445,6 +453,7 @@ static ivas_error DefaultBSplineModel_fx(
    }
    Copy_Scale_sig_16_32_r( defaultHRIR_rom_elevKSeq_fx, model->elevKSeq_dyn_fx, ( model->elevDim3 - 2 ), Q22 - defaultHRIR_rom_elevKSeq_Q_fx ); // Q22
    model->elevKSeq_fx = model->elevKSeq_dyn_fx;
#endif

    model->elevBsShape_dyn_fx = (Word32 *) malloc( sizeof( defaultHRIR_rom_elevBsShape_fx ) * sizeof( Word32 ) / sizeof( Word16 ) );
    IF( model->elevBsShape_dyn_fx == NULL )
@@ -648,6 +657,10 @@ static ivas_error DefaultBSplineModel_fx(
    modelITD->elevBsLen = defaultHRIR_rom_ITD_elevBsLen;
    modelITD->elevBsStart = defaultHRIR_rom_ITD_elevBsStart;

#ifdef FIX_2235_TD_RENDERER_WORD16
    modelITD->elevKSeq_fx = (const Word16 *) defaultHRIR_rom_ITD_elevKSeq_fx;
    modelITD->elevKSeq_Q_fx = defaultHRIR_rom_ITD_elevKSeq_Q_fx;
#else
    modelITD->elevKSeq_dyn_fx = (Word32 *) malloc( sizeof( defaultHRIR_rom_ITD_elevKSeq_fx ) * sizeof( Word32 ) / sizeof( Word16 ) );
    IF( modelITD->elevKSeq_dyn_fx == NULL )
    {
@@ -656,10 +669,15 @@ static ivas_error DefaultBSplineModel_fx(
    Copy_Scale_sig_16_32_r( defaultHRIR_rom_ITD_elevKSeq_fx, modelITD->elevKSeq_dyn_fx, sizeof( defaultHRIR_rom_ITD_elevKSeq_fx ) / sizeof( Word16 ), Q22 - defaultHRIR_rom_ITD_elevKSeq_Q_fx ); // Q22

    modelITD->elevKSeq_fx = modelITD->elevKSeq_dyn_fx;
#endif

    modelITD->azimBsLen = defaultHRIR_rom_ITD_azimBsLen;
    modelITD->azimBsStart = defaultHRIR_rom_ITD_azimBsStart;

#ifdef FIX_2235_TD_RENDERER_WORD16
    modelITD->azimKSeq_fx = (const Word16 *) defaultHRIR_rom_ITD_azimKSeq_fx;
    modelITD->azimKSeq_Q_fx = defaultHRIR_rom_ITD_azimKSeq_Q_fx;
#else
    modelITD->azimKSeq_dyn_fx = (Word32 *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( Word32 ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */
    IF( modelITD->azimKSeq_dyn_fx == NULL )
    {
@@ -667,6 +685,7 @@ static ivas_error DefaultBSplineModel_fx(
    }
    Copy_Scale_sig_16_32_r( defaultHRIR_rom_ITD_azimKSeq_fx, modelITD->azimKSeq_dyn_fx, ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ), Q22 - defaultHRIR_rom_ITD_azimKSeq_Q_fx ); // Q22
    modelITD->azimKSeq_fx = modelITD->azimKSeq_dyn_fx;
#endif
    modelITD->W_dyn_fx = (Word32 *) malloc( sizeof( defaultHRIR_rom_ITD_W_fx ) * sizeof( Word32 ) / sizeof( Word16 ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */
    IF( modelITD->W_dyn_fx == NULL )
    {
+27 −8
Original line number Diff line number Diff line
@@ -1052,19 +1052,22 @@ typedef struct
    const Word16 *azimShapeIdx;
    const Word16 *azimShapeSampFactor;

    const Word32 *elevKSeq_fx; /* Array, N x elevDim2 x elevDim3 */
#ifdef FIX_2235_TD_RENDERER_WORD16
    const Word16 *elevKSeq_fx; /* Array, N x elevDim2 x elevDim3 */
    Word16 elevKSeq_Q_fx;      /* Q-value of elevKSeq_fx */
    const Word32 *elevBsShape_fx;
    const Word32 **azimBsShape_fx;
    Word32 **azimKSeq_fx;    /* Array, length azimDim3+1            */
#ifdef FIX_2235_TD_RENDERER_WORD16
    const Word16 *AlphaL_fx; /* Array, size AlphaN x K */
#else
    const Word32 *AlphaL_fx; /* Array, size AlphaN x K */
#endif
    Word16 AlphaL_e;
#ifdef FIX_2235_TD_RENDERER_WORD16
    const Word16 *AlphaR_fx; /* Array, size AlphaN x K */
#else
    const Word32 *elevKSeq_fx; /* Array, N x elevDim2 x elevDim3 */
    const Word32 *elevBsShape_fx;
    const Word32 **azimBsShape_fx;
    Word32 **azimKSeq_fx;    /* Array, length azimDim3+1            */
    const Word32 *AlphaL_fx; /* Array, size AlphaN x K */
    Word16 AlphaL_e;
    const Word32 *AlphaR_fx; /* Array, size AlphaN x K */
#endif
    Word16 AlphaR_e;
@@ -1087,7 +1090,11 @@ typedef struct
    Word32 *EL_dyn_fx;
    Word32 *ER_dyn_fx;
    Word32 *elevBsShape_dyn_fx;
#ifdef FIX_2235_TD_RENDERER_WORD16
    Word16 *elevKSeq_dyn_fx;
#else
    Word32 *elevKSeq_dyn_fx;
#endif
    Word16 *elevBsLen_dyn;
    Word16 *elevBsStart_dyn;
    Word16 *azimDim3_dyn;
@@ -1111,16 +1118,28 @@ typedef struct
    const Word16 *elevBsStart;
    Word16 elevSegSamples;
    Word16 resamp_factor_fx; /*Q14*/
#ifdef FIX_2235_TD_RENDERER_WORD16
    const Word16 *elevKSeq_fx; /* Array, length elevDim3-2       */
    Word16 elevKSeq_Q_fx;      /* Q-value of elevKSeq_fx */
    const Word16 *azimKSeq_fx; /* Array, length azimDim3-2            */
    Word16 azimKSeq_Q_fx;      /* Q-value of azimKSeq_fx */
#else
    const Word32 *elevKSeq_fx; /* Array, length elevDim3-2       */
    const Word32 *azimKSeq_fx; /* Array, length azimDim3-2            */
#endif
    const Word32 *W_fx; /* Array, size (elevDim3*azimDim3) x K */
    Word16 W_e;
    const Word32 *azimBsShape_fx;
    const Word32 *elevBsShape_fx;

    /* Pointers for allocation of dynamic memory  */
#ifdef FIX_2235_TD_RENDERER_WORD16
    Word16 *elevKSeq_dyn_fx;
    Word16 *azimKSeq_dyn_fx;
#else
    Word32 *elevKSeq_dyn_fx;
    Word32 *azimKSeq_dyn_fx;
#endif
    Word32 *W_dyn_fx;
    Word32 *azimBsShape_dyn_fx;
    Word32 *elevBsShape_dyn_fx;
+40 −0
Original line number Diff line number Diff line
@@ -293,6 +293,15 @@ static ivas_error TDREND_LoadBSplineBinaryITD(
    }

    fread( &modelITD->elevDim3, sizeof( Word16 ), 1, f_hrtf );
#ifdef FIX_2235_TD_RENDERER_WORD16
    modelITD->elevKSeq_dyn_fx = (Word16 *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( Word16 ) );
    if ( modelITD->elevKSeq_dyn_fx == NULL )
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" );
    }
    fread( &modelITD->elevKSeq_Q_fx, 1, sizeof( Word16 ), f_hrtf );
    fread( modelITD->elevKSeq_dyn_fx, sizeof( Word16 ), modelITD->elevDim3 - 2, f_hrtf );
#else
    modelITD->elevKSeq_dyn_fx = (Word32 *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( Word32 ) );
    v_tmp16 = (Word16 *) malloc( ( modelITD->elevDim3 - 2 ) * sizeof( Word16 ) );
    if ( modelITD->elevKSeq_dyn_fx == NULL || v_tmp16 == NULL )
@@ -306,8 +315,18 @@ static ivas_error TDREND_LoadBSplineBinaryITD(
        modelITD->elevKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q22 - factor_Q );
    }
    free( v_tmp16 );
#endif

    fread( &modelITD->azimDim3, sizeof( Word16 ), 1, f_hrtf );
#ifdef FIX_2235_TD_RENDERER_WORD16
    modelITD->azimKSeq_dyn_fx = (Word16 *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( Word16 ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */
    if ( modelITD->azimKSeq_dyn_fx == NULL )
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" );
    }
    fread( &modelITD->azimKSeq_Q_fx, 1, sizeof( Word16 ), f_hrtf );
    fread( modelITD->azimKSeq_dyn_fx, sizeof( Word16 ), ( modelITD->azimDim3 + 1 ) / 2 - 2, f_hrtf );
#else
    modelITD->azimKSeq_dyn_fx = (Word32 *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( Word32 ) ); /* basis functions are flipped around 180 deg, number of basis functions above/below is (N+1)/2 */
    v_tmp16 = (Word16 *) malloc( ( ( modelITD->azimDim3 + 1 ) / 2 - 2 ) * sizeof( Word16 ) );
    if ( modelITD->azimKSeq_dyn_fx == NULL || v_tmp16 == NULL )
@@ -321,6 +340,7 @@ static ivas_error TDREND_LoadBSplineBinaryITD(
        modelITD->azimKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q22 - factor_Q );
    }
    free( v_tmp16 );
#endif

    fread( &tmp, sizeof( Word16 ), 1, f_hrtf );
    modelITD->W_dyn_fx = (Word32 *) malloc( tmp * sizeof( Word32 ) );
@@ -410,8 +430,13 @@ static ivas_error TDREND_LoadBSplineBinaryITD(
    free( v_tmp16 );
    fread( &modelITD->elevSegSamples, sizeof( Word16 ), 1, f_hrtf );

#ifdef FIX_2235_TD_RENDERER_WORD16
    modelITD->elevKSeq_fx = (const Word16 *) modelITD->elevKSeq_dyn_fx;
    modelITD->azimKSeq_fx = (const Word16 *) modelITD->azimKSeq_dyn_fx;
#else
    modelITD->elevKSeq_fx = (const Word32 *) modelITD->elevKSeq_dyn_fx;
    modelITD->azimKSeq_fx = (const Word32 *) modelITD->azimKSeq_dyn_fx;
#endif
    modelITD->W_fx = (const Word32 *) modelITD->W_dyn_fx;
    modelITD->azimBsShape_fx = (const Word32 *) modelITD->azimBsShape_dyn_fx;
    modelITD->elevBsShape_fx = (const Word32 *) modelITD->elevBsShape_dyn_fx;
@@ -486,6 +511,15 @@ static ivas_error TDREND_LoadBSplineBinary(

    fread( &model->K, sizeof( Word16 ), 1, f_hrtf );
    fread( &model->elevDim3, sizeof( Word16 ), 1, f_hrtf );
#ifdef FIX_2235_TD_RENDERER_WORD16
    model->elevKSeq_dyn_fx = (Word16 *) malloc( ( model->elevDim3 - 2 ) * sizeof( Word16 ) );
    if ( model->elevKSeq_dyn_fx == NULL )
    {
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Could not allocate memory for hrtf data" );
    }
    fread( &model->elevKSeq_Q_fx, 1, sizeof( Word16 ), f_hrtf );
    fread( model->elevKSeq_dyn_fx, sizeof( Word16 ), model->elevDim3 - 2, f_hrtf );
#else
    model->elevKSeq_dyn_fx = (Word32 *) malloc( ( model->elevDim3 - 2 ) * sizeof( Word32 ) );

    v_tmp16 = (Word16 *) malloc( ( model->elevDim3 - 2 ) * sizeof( Word16 ) );
@@ -500,6 +534,8 @@ static ivas_error TDREND_LoadBSplineBinary(
        model->elevKSeq_dyn_fx[j] = L_shl_r( L_deposit_l( v_tmp16[j] ), Q22 - factor_Q );
    }
    free( v_tmp16 );
#endif

    model->azimDim3_dyn = (Word16 *) malloc( model->elevDim3 * sizeof( Word16 ) );
    model->azim_start_idx_dyn = (Word16 *) malloc( model->elevDim3 * sizeof( Word16 ) );
    model->azimKSeq_fx = (Word32 **) malloc( model->elevDim3 * sizeof( Word32 * ) );
@@ -693,7 +729,11 @@ static ivas_error TDREND_LoadBSplineBinary(
    model->elevBsLen = (const Word16 *) model->elevBsLen_dyn;
    model->elevBsStart = (const Word16 *) model->elevBsStart_dyn;
    model->elevBsShape_fx = (const Word32 *) model->elevBsShape_dyn_fx;
#ifdef FIX_2235_TD_RENDERER_WORD16
    model->elevKSeq_fx = (const Word16 *) model->elevKSeq_dyn_fx;
#else
    model->elevKSeq_fx = (const Word32 *) model->elevKSeq_dyn_fx;
#endif
    model->azimDim3 = (const Word16 *) model->azimDim3_dyn;
    model->azim_start_idx = (const Word16 *) model->azim_start_idx_dyn;
    model->azimSegSamples = (const Word16 *) model->azimSegSamples_dyn;