Commit 80fc28e5 authored by emerit's avatar emerit
Browse files

reverb acceptable

parent a4e534f8
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -457,16 +457,19 @@ ivas_error ivas_HRTF_statistics_init_fx(
    switch ( sampleRate )
    {
        case 48000:
            HrtfStatistics->factor_Q_energy_fx = defaultHRIR_Q_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->factor_Q_energy_fx = defaultHRIR_Q_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->factor_Q_energy_fx = defaultHRIR_Q_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;
+3 −0
Original line number Diff line number Diff line
@@ -425,16 +425,19 @@ static ivas_error DefaultBSplineModel_fx(
    SWITCH( output_Fs )
    {
        case 48000:
            HrFiltSet_p->factor_Q_energy_fx = defaultHRIR_Q_48kHz_fx;
            HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_48kHz_fx;  // Q23
            HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_48kHz_fx; // Q23
            HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_48kHz_fx;       // Q23
            BREAK;
        case 32000:
            HrFiltSet_p->factor_Q_energy_fx = defaultHRIR_Q_32kHz_fx;
            HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_32kHz_fx;  // Q23
            HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_32kHz_fx; // Q23
            HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_32kHz_fx;       // Q23
            BREAK;
        case 16000:
            HrFiltSet_p->factor_Q_energy_fx = defaultHRIR_Q_16kHz_fx;
            HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_16kHz_fx;  // Q23
            HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_16kHz_fx; // Q23
            HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_16kHz_fx;       // Q23
+58 −81
Original line number Diff line number Diff line
@@ -146,19 +146,17 @@ typedef struct ivas_reverb_params_t
    Word32 *pHrtf_avg_pwr_response_l_fx;                /* The HRTF set's average left  ear power response                                      */
    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                               */
#else
    const Word32 *pHrtf_avg_pwr_response_l_const_fx;    /* The HRTF set's average left  ear power response                                      */
    const Word32 *pHrtf_avg_pwr_response_r_const_fx;    /* The HRTF set's average right ear power response                                      */
    const Word32 *pHrtf_inter_aural_coherence_const_fx; /* The HRTF set's inter-aural coherence for diffuse sound                               */
#endif
    Word16 do_corr_filter;                              /* Flag indicating whether correlation filters should be used.                          */
                                                        /*        Correlation only supported and needed for binaural playback (i.e.             */
                                                        /*        when nr_outputs != 2 correlation filtering is never supported).               */
#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    const Word16 *pHrtf_avg_pwr_response_l_const_fx_16;    /* The HRTF set's average left  ear power response                                      */
    const Word16 *pHrtf_avg_pwr_response_r_const_fx_16;    /* The HRTF set's average right ear power response                                      */
    const Word16 *pHrtf_inter_aural_coherence_const_fx_16; /* The HRTF set's inter-aural coherence for diffuse sound                               */
#endif
} ivas_reverb_params_t;

/*------------------------------------------------------------------------------------------*
@@ -1511,17 +1509,29 @@ ivas_error ivas_reverb_open_fx(
    predelay_bf_len = output_frame;
    move16();
    nr_fc_input = hRenderConfig->roomAcoustics.nBands;

#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    IF( *hReverb == NULL )
    {
#endif
        /* Allocate main reverb. handle */
        IF( ( pState = (REVERB_HANDLE) malloc( sizeof( REVERB_DATA ) ) ) == NULL )
        {
            return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Reverberator " );
        }
#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    }
#endif

    IF( NE_32( ( error = set_base_config_fx( &params, output_Fs ) ), IVAS_ERR_OK ) )
    {
        return error;
    }

#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    if ( *hReverb == NULL )
    {
#endif
        /* Allocate memory for feedback delay lines */
        FOR( loop_idx = 0; loop_idx < IVAS_REV_MAX_NR_BRANCHES; loop_idx++ )
        {
@@ -1536,51 +1546,15 @@ ivas_error ivas_reverb_open_fx(
        {
            return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for CREND Reverberator" );
        }
#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    }
#endif

    pState->nr_of_branches = IVAS_REV_MAX_NR_BRANCHES;
    move16();
    set_fft_and_datablock_sizes_fx( pState, subframe_len );
    nr_fc_fft_filter = add( extract_l( L_shr( pState->fft_size, 1 ) ), 1 );

#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    /* === 'Control logic': compute the reverb processing parameters from the              === */
    /* === room, source and listener acoustic information provided in the reverb config    === */
    /* Setting up shared temporary buffers for fc, RT60, DSR, etc.                             */
    params.pRt60_fx = &pFft_wf_filter_ch1_fx[0][0];
    params.pDsr_fx = params.pRt60_fx + nr_fc_fft_filter;
    params.pFc_fx = &pState->fft_filter_color_0.fft_spectrum_fx[0];
    /* Note: these temp buffers can only be used before the final step of the FFT filter design :     */
    /* before calls to ivas_reverb_calc_correl_filters(...) or to ivas_reverb_calc_color_filters(...) */

    /* set the uniform frequency grid for FFT filtering                                               */
    freq_step_fx = L_mult0( extract_l( L_shr( output_Fs, 2 ) ), div_s( 1, ( nr_fc_fft_filter - 1 ) ) ); /*Q14:0.5f * output_Fs / ( nr_fc_fft_filter - 1 )*/
    FOR( bin_idx = 0; bin_idx < nr_fc_fft_filter; bin_idx++ )
    {
        params.pFc_fx[bin_idx] = W_extract_l( W_mult0_32_32( freq_step_fx, bin_idx ) ); /*Q14*/
    }

    /* 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    === */
    /* Setting up shared temporary buffers for fc, RT60, DSR, etc.                             */
@@ -1593,6 +1567,19 @@ ivas_error ivas_reverb_open_fx(
#ifdef MSAN_FIX
    set32_fx( pState->fft_filter_color_1.fft_spectrum_fx, 0, RV_FILTER_MAX_FFT_SIZE );
#endif

#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ )
    {
        params.pHrtf_avg_pwr_response_l_fx[i] = L_shl( hHrtfStatistics->average_energy_l_fx[i], ( Q31 - Q23 ) - ( Q15 - hHrtfStatistics->factor_Q_energy_fx ) );         /*Q23*/
        params.pHrtf_avg_pwr_response_r_fx[i] = L_shl( hHrtfStatistics->average_energy_r_fx[i], ( Q31 - Q23 ) - ( Q15 - hHrtfStatistics->factor_Q_energy_fx ) );         /*Q23*/
        params.pHrtf_inter_aural_coherence_fx[i] = L_shl( hHrtfStatistics->inter_aural_coherence_fx[i], ( Q31 - Q19 ) - ( Q15 - hHrtfStatistics->factor_Q_energy_fx ) ); /*Q30*/
    }
    params.pHrtf_avg_pwr_response_l_const_fx = (const Word32 *) params.pHrtf_avg_pwr_response_l_fx;
    params.pHrtf_avg_pwr_response_r_const_fx = (const Word32 *) params.pHrtf_avg_pwr_response_r_fx;
    params.pHrtf_inter_aural_coherence_const_fx = (const Word32 *) params.pHrtf_inter_aural_coherence_fx;
#endif

    /* Note: these temp buffers can only be used before the final step of the FFT filter design :     */
    /* before calls to ivas_reverb_calc_correl_filters(...) or to ivas_reverb_calc_color_filters(...) */

@@ -1603,6 +1590,7 @@ ivas_error ivas_reverb_open_fx(
        params.pFc_fx[bin_idx] = W_extract_l( W_mult0_32_32( freq_step_fx, bin_idx ) ); /*Q14*/
    }

#ifndef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    test();
    IF( hHrtf == NULL && lr_energy_and_iac_fx != NULL )
    {
@@ -1610,6 +1598,7 @@ ivas_error ivas_reverb_open_fx(
        params.pHrtf_avg_pwr_response_r_const_fx = lr_energy_and_iac_fx[1];
        params.pHrtf_inter_aural_coherence_const_fx = lr_energy_and_iac_fx[2];
    }
#endif
    /* 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 );
@@ -1618,7 +1607,11 @@ ivas_error ivas_reverb_open_fx(
    params.pRt60_e = pRt60_e;
    params.pDsr_e = pDsr_e;

#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    set_reverb_acoustic_data_fx( &params, &hRenderConfig->roomAcoustics, nr_fc_input, nr_fc_fft_filter );
#else
    set_reverb_acoustic_data_fx( &params, input_audio_config, hHrtf, &hRenderConfig->roomAcoustics, subframe_len, nr_fc_input, nr_fc_fft_filter );
#endif
    Scale_sig32( params.pFc_fx, nr_fc_fft_filter, -2 );
    FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ )
    {
@@ -1627,7 +1620,7 @@ ivas_error ivas_reverb_open_fx(
        params.pDsr_fx[i] = L_abs( params.pDsr_fx[i] );
        move32();
    }
#endif

    /* set reverb acoustic configuration based on renderer config  */
    pState->pConfig.roomAcoustics.override = hRenderConfig->roomAcoustics.override;
    move16();
@@ -1666,17 +1659,9 @@ 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++ )
@@ -1732,11 +1717,7 @@ 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 );
@@ -1787,11 +1768,7 @@ ivas_error ivas_reverb_open_fx(
        move32();
    }

#ifdef FIX_POINT_HRTF_FILE_FORMAT_REVERB
    Copy_Scale_sig_16_32_no_sat( 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
    Scale_sig32( params.pFc_fx, nr_fc_fft_filter, 17 );                        /*Scaling  ( *hReverb )->fft_filter_color_1.fft_spectrum_fx to Q31*/

    /* Copying the computed FFT colorations filters to the fft_filter components */
+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_fx, hHrtfStatistics->average_energy_r_fx, 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_fx, 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 )
    {
+1 −1
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@
 *------------------------------------------------------------------------*/
/* TD renderer default HRIR model */
#ifdef DEBUGGING
/* Generated on 04-Feb-2025 with Matlab version 23.2.0.2668659 (R2023b) Update 9 by marcemerit on MACA64 */
/* Generated on 06-Feb-2025 with Matlab version 23.2.0.2668659 (R2023b) Update 9 by marcemerit on MACA64 */
#endif
const Word16 defaultHRIR_rom_latency_s_Q_fx = 31;
Loading