Commit c1fb7f8e authored by emerit's avatar emerit
Browse files

on going reverb fix

parent 14d6d8a4
Loading
Loading
Loading
Loading
+12 −12
Original line number Diff line number Diff line
@@ -450,26 +450,26 @@ ivas_error ivas_HRTF_statistics_init_fx(
        return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for statistics HRTF tables!" );
    }

    HrtfStatistics->average_energy_l = NULL;
    HrtfStatistics->average_energy_r = NULL;
    HrtfStatistics->inter_aural_coherence = NULL;
    HrtfStatistics->average_energy_l_fx = NULL;
    HrtfStatistics->average_energy_r_fx = NULL;
    HrtfStatistics->inter_aural_coherence_fx = NULL;

    switch ( sampleRate )
    {
        case 48000:
            HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_48kHz_fx;
            HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_48kHz_fx;
            HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_48kHz_fx;
            HrtfStatistics->average_energy_l_fx = defaultHRIR_left_avg_power_48kHz_fx;
            HrtfStatistics->average_energy_r_fx = defaultHRIR_right_avg_power_48kHz_fx;
            HrtfStatistics->inter_aural_coherence_fx = defaultHRIR_coherence_48kHz_fx;
            break;
        case 32000:
            HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_32kHz_fx;
            HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_32kHz_fx;
            HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_32kHz_fx;
            HrtfStatistics->average_energy_l_fx = defaultHRIR_left_avg_power_32kHz_fx;
            HrtfStatistics->average_energy_r_fx = defaultHRIR_right_avg_power_32kHz_fx;
            HrtfStatistics->inter_aural_coherence_fx = defaultHRIR_coherence_32kHz_fx;
            break;
        case 16000:
            HrtfStatistics->average_energy_l = defaultHRIR_left_avg_power_16kHz_fx;
            HrtfStatistics->average_energy_r = defaultHRIR_right_avg_power_16kHz_fx;
            HrtfStatistics->inter_aural_coherence = defaultHRIR_coherence_16kHz_fx;
            HrtfStatistics->average_energy_l_fx = defaultHRIR_left_avg_power_16kHz_fx;
            HrtfStatistics->average_energy_r_fx = defaultHRIR_right_avg_power_16kHz_fx;
            HrtfStatistics->inter_aural_coherence_fx = defaultHRIR_coherence_16kHz_fx;
            break;
    }
    HrtfStatistics->fromROM = TRUE;
+19 −1
Original line number Diff line number Diff line
@@ -215,8 +215,13 @@ static void GenerateFilter_fx(
    Word16 BMEnergiesR_e, BMEnergiesL_e;
    Word16 tmp_hrfModR_e, tmp_hrfModL_e;

#ifdef FIX_TDREND_HRTF_FILE_FORMAT
    getStandardBSplineSampVec_fx( modelEval->elevBfVec_fx, EvIdx, &num_ev_idx, model->elevDim3, elev, model->elevKSeq_fx, model->elevKSeq_e,
                                  model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape_fx, model->elevBsShape_e );
#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++ )
    {
@@ -458,9 +463,13 @@ static void GenerateITD_fx(

    IF( NE_32( L_abs( elev_fx ), DEG_90_IN_Q22 ) )
    {
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
        getStandardBSplineSampVec_fx( modelEval->elevBfVecITD_fx, EvIdx, &num_ev_idx, model->elevDim3, elev_fx, model->elevKSeq_fx, model->elevKSeq_e,
                                      model->elevSegSamples, model->elevBsLen, model->elevBsStart, model->elevBsShape_fx, model->elevBsShape_e );

#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();
        if ( GT_32( azim_fx, DEG_180_IN_Q22 ) )
@@ -468,8 +477,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_TDREND_HRTF_FILE_FORMAT
        getStandardBSplineSampVec_fx( modelEval->azimBfVecITD_fx, AzIdx, &num_az_idx, shr( add( model->azimDim3, 1 ), 1 ), azim_itd_fx, model->azimKSeq_fx, model->azimKSeq_e,
                                      model->azimSegSamples, model->azimBsLen, model->azimBsStart, model->azimBsShape_fx, model->azimBsShape_e );
#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 */
@@ -842,13 +856,17 @@ void BSplineModelEvalDealloc_fx(

    IF( model->modelROM )
    {
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
        free( model->azimBsShape_e );
#endif
        free( (void *) model->azimBsShape_fx ); /* void* cast needed to please both gcc and Visual studio compilers. Deallocating const float** should be fine and gcc agrees, but Visual studio complains. */
        FOR( i = 0; i < model->elevDim3; i++ )
        {
            free( model->azimKSeq_fx[i] );
        }
#ifdef FIX_TDREND_HRTF_FILE_FORMAT
        free( model->azimKSeq_e );
#endif
        free( model->azimKSeq_fx );
        IF( modelEval != NULL )
        {
+54 −22
Original line number Diff line number Diff line
@@ -147,6 +147,7 @@ typedef struct ivas_reverb_params_t
    Word32 *pHrtf_avg_pwr_response_r_fx;    /* The HRTF set's average right ear power response                                      */
    Word32 *pHrtf_inter_aural_coherence_fx; /* The HRTF set's inter-aural coherence for diffuse sound                               */
#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    Word16 factor_Q_energy;
    const Word16 *pHrtf_avg_pwr_response_l_const_fx;    /* The HRTF set's average left  ear power response                                      */
    const Word16 *pHrtf_avg_pwr_response_r_const_fx;    /* The HRTF set's average right ear power response                                      */
    const Word16 *pHrtf_inter_aural_coherence_const_fx; /* The HRTF set's inter-aural coherence for diffuse sound                               */
@@ -1262,7 +1263,6 @@ static void set_fft_and_datablock_sizes_fx(

    return;
}
#ifndef FIX_POINT_HRTF_FILE_FORMAT_REVERB
/*-----------------------------------------------------------------------------------------*
 * Function set_reverb_acoustic_data()
 *
@@ -1271,18 +1271,26 @@ static void set_fft_and_datablock_sizes_fx(

static void set_reverb_acoustic_data_fx(
    ivas_reverb_params_t *pParams,
#ifndef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    const AUDIO_CONFIG input_audio_config,
    const HRTFS_HANDLE hHrtf,
#endif
    IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pRoomAcoustics,
#ifndef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    const Word16 subframe_len,
#endif
    const Word16 nr_fc_input,
    const Word16 nr_fc_fft_filter )
{
#ifndef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    Word16 nr_out_ch, hrtf_idx, offset, iter_idx, bin_idx;
    Word32 *pHrtf_set_l_re_fx[MAX_INTERN_CHANNELS];
    Word32 *pHrtf_set_l_im_fx[MAX_INTERN_CHANNELS];
    Word32 *pHrtf_set_r_re_fx[MAX_INTERN_CHANNELS];
    Word32 *pHrtf_set_r_im_fx[MAX_INTERN_CHANNELS];
#else
    Word16 bin_idx;
#endif
    Word32 ln_1e6_inverted_fx, delay_diff_fx, L_tmp;
    Word16 exp_argument_fx, tmp, tmp_flag, exp_argument_e;
    Word16 pow_exp;
@@ -1297,6 +1305,7 @@ static void set_reverb_acoustic_data_fx(
    Word32 *pDsr_fx = pParams->pDsr_fx;
    Word16 *pDsr_e = pParams->pDsr_e;

#ifndef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    /* use crend hrtf filters */
    IF( hHrtf != NULL )
    {
@@ -1325,7 +1334,6 @@ static void set_reverb_acoustic_data_fx(
                }
            }
        }

        /* Compute HRTF set properties using frequency-domain HRTF data */
        Word32 *pHrtf_avg_pwr_response_l_fx = pParams->pHrtf_avg_pwr_response_l_fx;
        Word32 *pHrtf_avg_pwr_response_r_fx = pParams->pHrtf_avg_pwr_response_r_fx;
@@ -1337,6 +1345,7 @@ static void set_reverb_acoustic_data_fx(
        pParams->pHrtf_avg_pwr_response_r_const_fx = (const Word32 *) pParams->pHrtf_avg_pwr_response_r_fx;
        pParams->pHrtf_inter_aural_coherence_const_fx = (const Word32 *) pParams->pHrtf_inter_aural_coherence_fx;
    }
#endif

    /* interpolate input table data for T60 and DSR to the FFT filter grid */
    ivas_reverb_interpolate_acoustic_data_fx( nr_fc_input, pFc_input_fx, pAcoustic_rt60_fx, pAcoustic_dsr_fx,
@@ -1395,7 +1404,6 @@ static void set_reverb_acoustic_data_fx(
    return;
}

#endif
/*-----------------------------------------------------------------------------------------*
 * Function setup_FDN_branches_fx()
 *
@@ -1492,11 +1500,8 @@ ivas_error ivas_reverb_open_fx(
    Word32 pTime_window_fx[RV_FILTER_MAX_FFT_SIZE];
    Word32 freq_step_fx;
    Word16 fft_hist_size, transition_start, transition_length;
#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    Word16 nr_fc_fft_filter;
#else
    Word16 nr_fc_input, nr_fc_fft_filter;
#endif

    rv_fftwf_type_complex_fx pFft_wf_filter_ch0_fx[RV_LENGTH_NR_FC];
    rv_fftwf_type_complex_fx pFft_wf_filter_ch1_fx[RV_LENGTH_NR_FC];

@@ -1505,9 +1510,7 @@ ivas_error ivas_reverb_open_fx(
    subframe_len = shr( output_frame, 2 ); /*output_frame / MAX_PARAM_SPATIAL_SUBFRAMES*/
    predelay_bf_len = output_frame;
    move16();
#ifndef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    nr_fc_input = hRenderConfig->roomAcoustics.nBands;
#endif
    /* Allocate main reverb. handle */
    IF( ( pState = (REVERB_HANDLE) malloc( sizeof( REVERB_DATA ) ) ) == NULL )
    {
@@ -1555,9 +1558,28 @@ ivas_error ivas_reverb_open_fx(
    {
        params.pFc_fx[bin_idx] = W_extract_l( W_mult0_32_32( freq_step_fx, bin_idx ) ); /*Q14*/
    }
    params.pHrtf_avg_pwr_response_l_const_fx = hHrtfStatistics->average_energy_l;
    params.pHrtf_avg_pwr_response_r_const_fx = hHrtfStatistics->average_energy_r;
    params.pHrtf_inter_aural_coherence_const_fx = hHrtfStatistics->inter_aural_coherence;

    /* set up reverb acoustic data on the basis of HRTF data and renderer config  */
    Scale_sig32( params.pFc_fx, nr_fc_fft_filter, 2 );
    Word16 *pRt60_e = (Word16 *) malloc( sizeof( Word16 ) * nr_fc_fft_filter );
    Word16 *pDsr_e = (Word16 *) malloc( sizeof( Word16 ) * nr_fc_fft_filter );

    params.pRt60_e = pRt60_e;
    params.pDsr_e = pDsr_e;

    set_reverb_acoustic_data_fx( &params, &hRenderConfig->roomAcoustics, nr_fc_input, nr_fc_fft_filter );
    Scale_sig32( params.pFc_fx, nr_fc_fft_filter, -2 );
    FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ )
    {
        params.pRt60_fx[i] = L_abs( params.pRt60_fx[i] );
        move32();
        params.pDsr_fx[i] = L_abs( params.pDsr_fx[i] );
        move32();
    }
    params.factor_Q_energy = hHrtfStatistics->factor_Q_energy;
    params.pHrtf_avg_pwr_response_l_const_fx = hHrtfStatistics->average_energy_l_fx;
    params.pHrtf_avg_pwr_response_r_const_fx = hHrtfStatistics->average_energy_r_fx;
    params.pHrtf_inter_aural_coherence_const_fx = hHrtfStatistics->inter_aural_coherence_fx;
#else
    /* === 'Control logic': compute the reverb processing parameters from the              === */
    /* === room, source and listener acoustic information provided in the reverb config    === */
@@ -1644,9 +1666,17 @@ ivas_error ivas_reverb_open_fx(
    {
        params.pDsr_fx[i] = L_shl( params.pDsr_fx[i], params.pDsr_e[i] );
        move32();
#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
        pHrtf_avg_pwr_response_l_const[i] = L_shl( params.pHrtf_avg_pwr_response_l_const_fx[i], ( Q23 - Q15 ) - ( Q15 - params.factor_Q_energy ) + 5 ); /*Q23+5*/
#else
        pHrtf_avg_pwr_response_l_const[i] = L_shl( params.pHrtf_avg_pwr_response_l_const_fx[i], 5 ); /*Q23+5*/
#endif
        move32();
#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
        pHrtf_avg_pwr_response_r_const[i] = L_shl( params.pHrtf_avg_pwr_response_r_const_fx[i], ( Q23 - Q15 ) - ( Q15 - params.factor_Q_energy ) + 5 ); /*Q23+5*/
#else
        pHrtf_avg_pwr_response_r_const[i] = L_shl( params.pHrtf_avg_pwr_response_r_const_fx[i], 5 ); /*Q23+5*/
#endif
        move32();
    }
    FOR( Word16 i = 0; i < lenT60_filter_coeff; i++ )
@@ -1702,7 +1732,11 @@ ivas_error ivas_reverb_open_fx(
        Word32 *pHrtf_inter_aural_coherence_const = (Word32 *) malloc( nr_fc_fft_filter * sizeof( Word32 ) );
        FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ )
        {
#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
            pHrtf_inter_aural_coherence_const[i] = L_shl( params.pHrtf_inter_aural_coherence_const_fx[i], ( Q31 - Q27 ) - ( Q15 - params.factor_Q_energy ) + 3 ); /*Scaling up to Q30*/
#else
            pHrtf_inter_aural_coherence_const[i] = L_shl( params.pHrtf_inter_aural_coherence_const_fx[i], 3 ); /*Scaling up to Q30*/
#endif
            move32();
        }
        ivas_reverb_calc_correl_filters_fx( pHrtf_inter_aural_coherence_const, pTime_window_fx, pState->fft_size, pFft_wf_filter_ch0_fx, pFft_wf_filter_ch1_fx, &q_pFft_wf_filter_ch0_fx, &q_pFft_wf_filter_ch1_fx );
@@ -1754,7 +1788,7 @@ ivas_error ivas_reverb_open_fx(
    }

#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    Copy_Scale_sig_16_32( params.pHrtf_inter_aural_coherence_const_fx, params.pHrtf_inter_aural_coherence_fx, nr_fc_fft_filter, 4 ); /*Scaling ( *hReverb )->fft_filter_color_0.fft_spectrum_fx to Q31*/
    Copy_Scale_sig_16_32( params.pHrtf_inter_aural_coherence_const_fx, params.pHrtf_inter_aural_coherence_fx, nr_fc_fft_filter, params.factor_Q_energy ); /*Scaling ( *hReverb )->fft_filter_color_0.fft_spectrum_fx to Q31*/
#else
    Scale_sig32( params.pHrtf_inter_aural_coherence_fx, nr_fc_fft_filter, 4 ); /*Scaling ( *hReverb )->fft_filter_color_0.fft_spectrum_fx to Q31*/
#endif
@@ -1779,10 +1813,8 @@ ivas_error ivas_reverb_open_fx(
    {
        return error;
    }
#ifndef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    free( pDsr_e );
    free( pRt60_e );
#endif
    *hReverb = pState;

    return error;
+1 −1
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ ivas_error ivas_reverb_prepare_cldfb_params(
        pOutput_ene[idx] *= expf( exp_argument );
    }
#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, hHrtfStatistics->factor_Q_energy, output_Fs, avg_pwr_left, avg_pwr_right );
    ivas_reverb_set_energies( hHrtfStatistics->average_energy_l_fx, hHrtfStatistics->average_energy_r_fx, hHrtfStatistics->factor_Q_energy, output_Fs, avg_pwr_left, avg_pwr_right );
#else
    if ( ( error = ivas_reverb_get_fastconv_hrtf_set_energies( hHrtfFastConv, input_audio_config, use_brir, output_Fs, avg_pwr_left, avg_pwr_right ) ) != IVAS_ERR_OK )
    {
+6 −6
Original line number Diff line number Diff line
@@ -1644,12 +1644,12 @@ typedef struct ivas_hrtfs_fastconv_struct
typedef struct ivas_hrtfs_statistics_struct
{
    Word16 factor_Q_energy;
    const Word16 *average_energy_l;
    const Word16 *average_energy_r;
    const Word16 *inter_aural_coherence;
    Word16 *average_energy_l_dyn;
    Word16 *average_energy_r_dyn;
    Word16 *inter_aural_coherence_dyn;
    const Word16 *average_energy_l_fx;
    const Word16 *average_energy_r_fx;
    const Word16 *inter_aural_coherence_fx;
    Word16 *average_energy_l_dyn_fx;
    Word16 *average_energy_r_dyn_fx;
    Word16 *inter_aural_coherence_dyn_fx;
    int16_t fromROM; /*  Flag that indicates that the pointers point to tables in ROM (controls init/dealloc).*/
} HRTFS_STATISTICS, *HRTFS_STATISTICS_HANDLE;
#endif
Loading