Loading lib_rend/ivas_crend.c +137 −37 Original line number Diff line number Diff line Loading @@ -69,6 +69,9 @@ ivas_error ivas_hrtf_init( hHrtf->max_num_iterations = 0; hHrtf->gain_lfe = 0; hHrtf->index_frequency_max_diffuse = 0; #ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->same_inv_diffuse_weight = 1; #endif for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) { Loading Loading @@ -1033,6 +1036,20 @@ static ivas_error ivas_rend_initCrend( } } #ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->same_inv_diffuse_weight = 1; for ( i = 0; i < hHrtf->max_num_ir; i++ ) { if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) { if ( hHrtf->inv_diffuse_weight[0][i] != hHrtf->inv_diffuse_weight[0][i] ) { hHrtf->same_inv_diffuse_weight = 0; } } } #endif pCrend->hHrtfCrend = hHrtf; return IVAS_ERR_OK; Loading Loading @@ -1496,30 +1513,55 @@ ivas_error ivas_rend_openCrend( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } if ( hHrtf->same_inv_diffuse_weight == 0 ) { if ( ( hCrend->freq_buffer_re_diffuse[1] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } } else { hCrend->freq_buffer_re_diffuse[1] = NULL; } #else if ( ( hCrend->freq_buffer_re_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } #endif #ifdef FIX_INV_DIFFUSE_WEIGHT if ( hCrend->freq_buffer_re_diffuse[0] != NULL ) { #ifdef FIX_CRASH_LONG_BRIR for ( j = 0; j < max_total_ir_len; j++ ) { #ifdef FIX_INV_DIFFUSE_WEIGHT hCrend->freq_buffer_re_diffuse[0][j] = 0.f; hCrend->freq_buffer_re_diffuse[1][j] = 0.f; } #else hCrend->freq_buffer_re_diffuse[j] = 0.f; set_zero( hCrend->freq_buffer_re_diffuse[0], max_total_ir_len ); #endif } if ( hCrend->freq_buffer_re_diffuse[1] != NULL ) { #ifdef FIX_CRASH_LONG_BRIR for ( j = 0; j < max_total_ir_len; j++ ) { hCrend->freq_buffer_re_diffuse[1][j] = 0.f; } #else #ifdef FIX_INV_DIFFUSE_WEIGHT set_zero( hCrend->freq_buffer_re_diffuse[0], max_total_ir_len ); set_zero( hCrend->freq_buffer_re_diffuse[1], max_total_ir_len ); #endif } #else #ifdef FIX_CRASH_LONG_BRIR if ( hCrend->freq_buffer_re_diffuse !NULL ) { for ( j = 0; j < max_total_ir_len; j++ ) { hCrend->freq_buffer_re_diffuse[j] = 0.f; } } #else set_zero( hCrend->freq_buffer_re_diffuse, max_total_ir_len ); #endif Loading @@ -1529,30 +1571,55 @@ ivas_error ivas_rend_openCrend( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } if ( hHrtf->same_inv_diffuse_weight == 0 ) { if ( ( hCrend->freq_buffer_im_diffuse[1] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } } else { hCrend->freq_buffer_im_diffuse[1] = NULL; } #else if ( ( hCrend->freq_buffer_im_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } #endif #ifdef FIX_INV_DIFFUSE_WEIGHT if ( hCrend->freq_buffer_im_diffuse[0] != NULL ) { #ifdef FIX_CRASH_LONG_BRIR for ( j = 0; j < max_total_ir_len; j++ ) { #ifdef FIX_INV_DIFFUSE_WEIGHT hCrend->freq_buffer_im_diffuse[0][j] = 0.f; hCrend->freq_buffer_im_diffuse[1][j] = 0.f; } #else hCrend->freq_buffer_im_diffuse[j] = 0.f; set_zero( hCrend->freq_buffer_im_diffuse[0], max_total_ir_len ); #endif } if ( hCrend->freq_buffer_im_diffuse[1] != NULL ) { #ifdef FIX_CRASH_LONG_BRIR for ( j = 0; j < max_total_ir_len; j++ ) { hCrend->freq_buffer_im_diffuse[1][j] = 0.f; } #else #ifdef FIX_INV_DIFFUSE_WEIGHT set_zero( hCrend->freq_buffer_im_diffuse[0], max_total_ir_len ); set_zero( hCrend->freq_buffer_im_diffuse[1], max_total_ir_len ); #endif } #else #ifdef FIX_CRASH_LONG_BRIR if ( hCrend->freq_buffer_im_diffuse !NULL ) { for ( j = 0; j < max_total_ir_len; j++ ) { hCrend->freq_buffer_im_diffuse[j] = 0.f; } } #else set_zero( hCrend->freq_buffer_im_diffuse, max_total_ir_len ); #endif Loading Loading @@ -1909,8 +1976,11 @@ static ivas_error ivas_rend_crendConvolver( #ifdef FIX_INV_DIFFUSE_WEIGHT set_zero( &hCrend->freq_buffer_re_diffuse[0][offset_diffuse], subframe_length ); set_zero( &hCrend->freq_buffer_im_diffuse[0][offset_diffuse], subframe_length ); if ( pCrend->hHrtfCrend->same_inv_diffuse_weight == 0 ) { set_zero( &hCrend->freq_buffer_re_diffuse[1][offset_diffuse], subframe_length ); set_zero( &hCrend->freq_buffer_im_diffuse[1][offset_diffuse], subframe_length ); } #else set_zero( &hCrend->freq_buffer_re_diffuse[offset_diffuse], subframe_length ); set_zero( &hCrend->freq_buffer_im_diffuse[offset_diffuse], subframe_length ); Loading @@ -1923,33 +1993,55 @@ static ivas_error ivas_rend_crendConvolver( pIn = &pcm_in[idx_in][i_ts * subframe_length]; if ( idx_in != lfe_idx_in ) { #ifdef FIX_INV_DIFFUSE_WEIGHT if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { #ifdef FIX_INV_DIFFUSE_WEIGHT if ( pCrend->hHrtfCrend->same_inv_diffuse_weight ) { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse]; pFreq_filt_re = &hCrend->freq_buffer_re[i][offset]; pFreq_filt_im = &hCrend->freq_buffer_im[i][offset]; for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) { pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i]; pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i]; } } else { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse]; pFreq_buf2_re = &hCrend->freq_buffer_re_diffuse[1][offset_diffuse]; pFreq_buf2_im = &hCrend->freq_buffer_im_diffuse[1][offset_diffuse]; #else pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[offset_diffuse]; #endif pFreq_filt_re = &hCrend->freq_buffer_re[i][offset]; pFreq_filt_im = &hCrend->freq_buffer_im[i][offset]; for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) { #ifdef FIX_INV_DIFFUSE_WEIGHT pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i]; pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i]; pFreq_buf2_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[1][i]; pFreq_buf2_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[1][i]; } } } #else if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[offset_diffuse]; pFreq_filt_re = &hCrend->freq_buffer_re[i][offset]; pFreq_filt_im = &hCrend->freq_buffer_im[i][offset]; for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) { pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[i]; pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[i]; #endif } } #endif pFreq_buf_re = &hCrend->freq_buffer_re[i][offset]; pFreq_buf_im = &hCrend->freq_buffer_im[i][offset]; Loading Loading @@ -1998,8 +2090,16 @@ static ivas_error ivas_rend_crendConvolver( offset_diffuse = offset_diffuse % pCrend->hHrtfCrend->num_iterations_diffuse[0]; offset_diffuse = offset_diffuse * subframe_length; #ifdef FIX_INV_DIFFUSE_WEIGHT if ( pCrend->hHrtfCrend->same_inv_diffuse_weight ) { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse]; } else { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[j][offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[j][offset_diffuse]; } #else pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[offset_diffuse]; Loading lib_rend/ivas_stat_rend.h +1 −0 Original line number Diff line number Diff line Loading @@ -1172,6 +1172,7 @@ typedef struct ivas_hrtfs_structure int16_t max_num_iterations; #ifdef FIX_INV_DIFFUSE_WEIGHT float inv_diffuse_weight[BINAURAL_CHANNELS][MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */ int16_t same_inv_diffuse_weight; #else float inv_diffuse_weight[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */ #endif Loading Loading
lib_rend/ivas_crend.c +137 −37 Original line number Diff line number Diff line Loading @@ -69,6 +69,9 @@ ivas_error ivas_hrtf_init( hHrtf->max_num_iterations = 0; hHrtf->gain_lfe = 0; hHrtf->index_frequency_max_diffuse = 0; #ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->same_inv_diffuse_weight = 1; #endif for ( i = 0; i < MAX_INTERN_CHANNELS; i++ ) { Loading Loading @@ -1033,6 +1036,20 @@ static ivas_error ivas_rend_initCrend( } } #ifdef FIX_INV_DIFFUSE_WEIGHT hHrtf->same_inv_diffuse_weight = 1; for ( i = 0; i < hHrtf->max_num_ir; i++ ) { if ( outConfig == IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) { if ( hHrtf->inv_diffuse_weight[0][i] != hHrtf->inv_diffuse_weight[0][i] ) { hHrtf->same_inv_diffuse_weight = 0; } } } #endif pCrend->hHrtfCrend = hHrtf; return IVAS_ERR_OK; Loading Loading @@ -1496,30 +1513,55 @@ ivas_error ivas_rend_openCrend( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } if ( hHrtf->same_inv_diffuse_weight == 0 ) { if ( ( hCrend->freq_buffer_re_diffuse[1] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } } else { hCrend->freq_buffer_re_diffuse[1] = NULL; } #else if ( ( hCrend->freq_buffer_re_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } #endif #ifdef FIX_INV_DIFFUSE_WEIGHT if ( hCrend->freq_buffer_re_diffuse[0] != NULL ) { #ifdef FIX_CRASH_LONG_BRIR for ( j = 0; j < max_total_ir_len; j++ ) { #ifdef FIX_INV_DIFFUSE_WEIGHT hCrend->freq_buffer_re_diffuse[0][j] = 0.f; hCrend->freq_buffer_re_diffuse[1][j] = 0.f; } #else hCrend->freq_buffer_re_diffuse[j] = 0.f; set_zero( hCrend->freq_buffer_re_diffuse[0], max_total_ir_len ); #endif } if ( hCrend->freq_buffer_re_diffuse[1] != NULL ) { #ifdef FIX_CRASH_LONG_BRIR for ( j = 0; j < max_total_ir_len; j++ ) { hCrend->freq_buffer_re_diffuse[1][j] = 0.f; } #else #ifdef FIX_INV_DIFFUSE_WEIGHT set_zero( hCrend->freq_buffer_re_diffuse[0], max_total_ir_len ); set_zero( hCrend->freq_buffer_re_diffuse[1], max_total_ir_len ); #endif } #else #ifdef FIX_CRASH_LONG_BRIR if ( hCrend->freq_buffer_re_diffuse !NULL ) { for ( j = 0; j < max_total_ir_len; j++ ) { hCrend->freq_buffer_re_diffuse[j] = 0.f; } } #else set_zero( hCrend->freq_buffer_re_diffuse, max_total_ir_len ); #endif Loading @@ -1529,30 +1571,55 @@ ivas_error ivas_rend_openCrend( { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } if ( hHrtf->same_inv_diffuse_weight == 0 ) { if ( ( hCrend->freq_buffer_im_diffuse[1] = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } } else { hCrend->freq_buffer_im_diffuse[1] = NULL; } #else if ( ( hCrend->freq_buffer_im_diffuse = (float *) malloc( sizeof( float ) * max_total_ir_len ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend" ); } #endif #ifdef FIX_INV_DIFFUSE_WEIGHT if ( hCrend->freq_buffer_im_diffuse[0] != NULL ) { #ifdef FIX_CRASH_LONG_BRIR for ( j = 0; j < max_total_ir_len; j++ ) { #ifdef FIX_INV_DIFFUSE_WEIGHT hCrend->freq_buffer_im_diffuse[0][j] = 0.f; hCrend->freq_buffer_im_diffuse[1][j] = 0.f; } #else hCrend->freq_buffer_im_diffuse[j] = 0.f; set_zero( hCrend->freq_buffer_im_diffuse[0], max_total_ir_len ); #endif } if ( hCrend->freq_buffer_im_diffuse[1] != NULL ) { #ifdef FIX_CRASH_LONG_BRIR for ( j = 0; j < max_total_ir_len; j++ ) { hCrend->freq_buffer_im_diffuse[1][j] = 0.f; } #else #ifdef FIX_INV_DIFFUSE_WEIGHT set_zero( hCrend->freq_buffer_im_diffuse[0], max_total_ir_len ); set_zero( hCrend->freq_buffer_im_diffuse[1], max_total_ir_len ); #endif } #else #ifdef FIX_CRASH_LONG_BRIR if ( hCrend->freq_buffer_im_diffuse !NULL ) { for ( j = 0; j < max_total_ir_len; j++ ) { hCrend->freq_buffer_im_diffuse[j] = 0.f; } } #else set_zero( hCrend->freq_buffer_im_diffuse, max_total_ir_len ); #endif Loading Loading @@ -1909,8 +1976,11 @@ static ivas_error ivas_rend_crendConvolver( #ifdef FIX_INV_DIFFUSE_WEIGHT set_zero( &hCrend->freq_buffer_re_diffuse[0][offset_diffuse], subframe_length ); set_zero( &hCrend->freq_buffer_im_diffuse[0][offset_diffuse], subframe_length ); if ( pCrend->hHrtfCrend->same_inv_diffuse_weight == 0 ) { set_zero( &hCrend->freq_buffer_re_diffuse[1][offset_diffuse], subframe_length ); set_zero( &hCrend->freq_buffer_im_diffuse[1][offset_diffuse], subframe_length ); } #else set_zero( &hCrend->freq_buffer_re_diffuse[offset_diffuse], subframe_length ); set_zero( &hCrend->freq_buffer_im_diffuse[offset_diffuse], subframe_length ); Loading @@ -1923,33 +1993,55 @@ static ivas_error ivas_rend_crendConvolver( pIn = &pcm_in[idx_in][i_ts * subframe_length]; if ( idx_in != lfe_idx_in ) { #ifdef FIX_INV_DIFFUSE_WEIGHT if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { #ifdef FIX_INV_DIFFUSE_WEIGHT if ( pCrend->hHrtfCrend->same_inv_diffuse_weight ) { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse]; pFreq_filt_re = &hCrend->freq_buffer_re[i][offset]; pFreq_filt_im = &hCrend->freq_buffer_im[i][offset]; for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) { pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i]; pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i]; } } else { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse]; pFreq_buf2_re = &hCrend->freq_buffer_re_diffuse[1][offset_diffuse]; pFreq_buf2_im = &hCrend->freq_buffer_im_diffuse[1][offset_diffuse]; #else pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[offset_diffuse]; #endif pFreq_filt_re = &hCrend->freq_buffer_re[i][offset]; pFreq_filt_im = &hCrend->freq_buffer_im[i][offset]; for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) { #ifdef FIX_INV_DIFFUSE_WEIGHT pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i]; pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[0][i]; pFreq_buf2_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[1][i]; pFreq_buf2_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[1][i]; } } } #else if ( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[offset_diffuse]; pFreq_filt_re = &hCrend->freq_buffer_re[i][offset]; pFreq_filt_im = &hCrend->freq_buffer_im[i][offset]; for ( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) { pFreq_buf_re[k] += pFreq_filt_re[k] * pCrend->hHrtfCrend->inv_diffuse_weight[i]; pFreq_buf_im[k] += pFreq_filt_im[k] * pCrend->hHrtfCrend->inv_diffuse_weight[i]; #endif } } #endif pFreq_buf_re = &hCrend->freq_buffer_re[i][offset]; pFreq_buf_im = &hCrend->freq_buffer_im[i][offset]; Loading Loading @@ -1998,8 +2090,16 @@ static ivas_error ivas_rend_crendConvolver( offset_diffuse = offset_diffuse % pCrend->hHrtfCrend->num_iterations_diffuse[0]; offset_diffuse = offset_diffuse * subframe_length; #ifdef FIX_INV_DIFFUSE_WEIGHT if ( pCrend->hHrtfCrend->same_inv_diffuse_weight ) { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[0][offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[0][offset_diffuse]; } else { pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[j][offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[j][offset_diffuse]; } #else pFreq_buf_re = &hCrend->freq_buffer_re_diffuse[offset_diffuse]; pFreq_buf_im = &hCrend->freq_buffer_im_diffuse[offset_diffuse]; Loading
lib_rend/ivas_stat_rend.h +1 −0 Original line number Diff line number Diff line Loading @@ -1172,6 +1172,7 @@ typedef struct ivas_hrtfs_structure int16_t max_num_iterations; #ifdef FIX_INV_DIFFUSE_WEIGHT float inv_diffuse_weight[BINAURAL_CHANNELS][MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */ int16_t same_inv_diffuse_weight; #else float inv_diffuse_weight[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */ #endif Loading