Commit 7ba8dec4 authored by Marek Szczerba's avatar Marek Szczerba
Browse files

Setting HRTF energies and preparation of CLDFB reverb parameters based on ROM/HRTF file data

parent 25c32d32
Loading
Loading
Loading
Loading
+29 −71
Original line number Diff line number Diff line
@@ -73,7 +73,6 @@ static void ivas_reverb_set_energies( const float *avg_pwr_l, const float *avg_p
static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCONV_HANDLE hHrtfFastConv, const AUDIO_CONFIG input_audio_config, const int16_t use_brir, const int32_t sampling_rate, float *avg_pwr_left, float *avg_pwr_right );
#endif

#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES
/*-----------------------------------------------------------------------------------------*
 * Function ivas_reverb_prepare_cldfb_params()
 *
@@ -82,59 +81,13 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies( const HRTFS_FASTCO

ivas_error ivas_reverb_prepare_cldfb_params(
    IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params,
#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES
    const HRTFS_STATISTICS_HANDLE hHrtfStatistics,
    const int32_t output_Fs,
    float *pOutput_t60,
    float *pOutput_ene )
{
    int16_t idx;
    float fc[CLDFB_NO_CHANNELS_MAX];
    float avg_pwr_left[CLDFB_NO_CHANNELS_MAX];
    float avg_pwr_right[CLDFB_NO_CHANNELS_MAX];
    float delay_diff, ln_1e6_inverted, exp_argument;
    const float dist = DEFAULT_SRC_DIST;
    const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f;

    for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ )
    {
        fc[idx] = ( (float) idx + 0.5f ) * ( (float) MAX_SAMPLING_RATE / (float) ( 2 * CLDFB_NO_CHANNELS_MAX ) );
    }

    ivas_reverb_interpolate_acoustic_data( pInput_params->nBands, pInput_params->pFc_input, pInput_params->pAcoustic_rt60, pInput_params->pAcoustic_dsr, CLDFB_NO_CHANNELS_MAX, fc, pOutput_t60, pOutput_ene );

    /* adjust DSR for the delay difference */
    delay_diff = pInput_params->inputPreDelay - pInput_params->acousticPreDelay;
    ln_1e6_inverted = 1.0f / logf( 1e06f );
    for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ )
    {
        exp_argument = delay_diff / ( pOutput_t60[idx] * ln_1e6_inverted );
        /* Limit exponent to approx +/-100 dB in case of incoherent value of delay_diff, to prevent overflow */
        exp_argument = min( exp_argument, 23.0f );
        exp_argument = max( exp_argument, -23.0f );
        pOutput_ene[idx] *= expf( exp_argument );
    }

    ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, output_Fs, avg_pwr_left, avg_pwr_right );

    for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ )
    {
        pOutput_ene[idx] *= 0.5f * ( avg_pwr_left[idx] + avg_pwr_right[idx] ) * dmx_gain_2;
    }

    return IVAS_ERR_OK;
}
#else
/*-----------------------------------------------------------------------------------------*
 * Function ivas_reverb_prepare_cldfb_params()
 *
 * Prepares reverb parameters for CLDFB-based reverberator
 *-----------------------------------------------------------------------------------------*/

ivas_error ivas_reverb_prepare_cldfb_params(
    IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pInput_params,
    const HRTFS_FASTCONV_HANDLE hHrtfFastConv,
    const AUDIO_CONFIG input_audio_config,
    const int16_t use_brir,
#endif
    const int32_t output_Fs,
    float *pOutput_t60,
    float *pOutput_ene )
@@ -146,7 +99,9 @@ ivas_error ivas_reverb_prepare_cldfb_params(
    float delay_diff, ln_1e6_inverted, exp_argument;
    const float dist = DEFAULT_SRC_DIST;
    const float dmx_gain_2 = 4.0f * EVS_PI * dist * dist / 0.001f;
#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES
    ivas_error error;
#endif

    for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ )
    {
@@ -167,10 +122,14 @@ ivas_error ivas_reverb_prepare_cldfb_params(
        pOutput_ene[idx] *= expf( exp_argument );
    }

#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES
    ivas_reverb_set_energies( hHrtfStatistics->average_energy_l, hHrtfStatistics->average_energy_r, 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 )
    {
        return error;
    }
#endif

    for ( idx = 0; idx < CLDFB_NO_CHANNELS_MAX; idx++ )
    {
@@ -180,7 +139,7 @@ ivas_error ivas_reverb_prepare_cldfb_params(
    return IVAS_ERR_OK;
}


#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES
/*-----------------------------------------------------------------------------------------*
 * Function ivas_cldfb_convolver()
 *
@@ -534,25 +493,9 @@ static ivas_error ivas_reverb_get_cldfb_hrtf_set_properties(
 * left/right energies to CLDFB bin center frequencies.
 *-----------------------------------------------------------------------------------------*/

static void ivas_reverb_set_energies( const float *avg_pwr_l, const float *avg_pwr_r, const int32_t sampling_rate, float *avg_pwr_l_out, float *avg_pwr_r_out )
{
    int16_t freq_idx;
    const int16_t cldfb_freq_halfstep = MAX_SAMPLING_RATE / ( 4 * CLDFB_NO_CHANNELS_MAX );
    float input_fc[FFT_SPECTRUM_SIZE];
    float output_fc[CLDFB_NO_CHANNELS_MAX];

    for ( freq_idx = 0; freq_idx < FFT_SPECTRUM_SIZE; freq_idx++ )
    {
        input_fc[freq_idx] = freq_idx * ( 0.5f * sampling_rate / (float) ( FFT_SPECTRUM_SIZE - 1 ) );
    }

    for ( freq_idx = 0; freq_idx < CLDFB_NO_CHANNELS_MAX; freq_idx++ )
    {
        output_fc[freq_idx] = (float) ( ( 2 * freq_idx + 1 ) * cldfb_freq_halfstep );
    }

    ivas_reverb_interpolate_acoustic_data( FFT_SPECTRUM_SIZE, input_fc, avg_pwr_l, avg_pwr_r, CLDFB_NO_CHANNELS_MAX, output_fc, avg_pwr_l_out, avg_pwr_r_out );
}
static void ivas_reverb_set_energies(
    const float *avg_pwr_l,
    const float *avg_pwr_r,
#else
/*-----------------------------------------------------------------------------------------*
 * Function ivas_reverb_get_fastconv_hrtf_set_energies()
@@ -566,35 +509,50 @@ static ivas_error ivas_reverb_get_fastconv_hrtf_set_energies(
    const HRTFS_FASTCONV_HANDLE hHrtfFastConv,
    const AUDIO_CONFIG input_audio_config,
    const int16_t use_brir,
#endif
    const int32_t sampling_rate,
    float *avg_pwr_left,
    float *avg_pwr_right )
{
    int16_t freq_idx;
    const int16_t cldfb_freq_halfstep = MAX_SAMPLING_RATE / ( 4 * CLDFB_NO_CHANNELS_MAX );
#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES
    float avg_pwr_left_fft[FFT_SPECTRUM_SIZE];
    float avg_pwr_right_fft[FFT_SPECTRUM_SIZE];
#endif
    float input_fc[FFT_SPECTRUM_SIZE];
    float output_fc[CLDFB_NO_CHANNELS_MAX];
#ifndef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES
    ivas_error error;
#endif
#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES
    const int16_t avg_pwr_len = sampling_rate == 16000 ? LR_IAC_LENGTH_NR_FC_16KHZ : LR_IAC_LENGTH_NR_FC;

    for ( freq_idx = 0; freq_idx < avg_pwr_len; freq_idx++ )
    {
        input_fc[freq_idx] = freq_idx * ( 0.5f * sampling_rate / (float) ( avg_pwr_len - 1 ) );
    }
#else
    for ( freq_idx = 0; freq_idx < FFT_SPECTRUM_SIZE; freq_idx++ )
    {
        input_fc[freq_idx] = freq_idx * ( 0.5f * sampling_rate / (float) ( FFT_SPECTRUM_SIZE - 1 ) );
    }
#endif

    for ( freq_idx = 0; freq_idx < CLDFB_NO_CHANNELS_MAX; freq_idx++ )
    {
        output_fc[freq_idx] = (float) ( ( 2 * freq_idx + 1 ) * cldfb_freq_halfstep );
    }

#ifdef NONBE_FIX_922_PRECOMPUTED_HRTF_PROPERTIES
    ivas_reverb_interpolate_acoustic_data( avg_pwr_len, input_fc, avg_pwr_l, avg_pwr_r, CLDFB_NO_CHANNELS_MAX, output_fc, avg_pwr_left, avg_pwr_right );
#else
    if ( ( error = ivas_reverb_get_cldfb_hrtf_set_properties( input_audio_config, hHrtfFastConv, use_brir, sampling_rate, avg_pwr_left_fft, avg_pwr_right_fft ) ) != IVAS_ERR_OK )
    {
        return error;
    }

    ivas_reverb_interpolate_acoustic_data( FFT_SPECTRUM_SIZE, input_fc, avg_pwr_left_fft, avg_pwr_right_fft, CLDFB_NO_CHANNELS_MAX, output_fc, avg_pwr_left, avg_pwr_right );

    return IVAS_ERR_OK;
}
#endif
}