Loading apps/renderer.c +1 −1 Original line number Diff line number Diff line Loading @@ -839,7 +839,7 @@ int main( exit( -1 ); } #else IF( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) ); exit( -1 ); Loading lib_com/fd_cng_com_fx.c +132 −0 Original line number Diff line number Diff line Loading @@ -2599,6 +2599,138 @@ void SynthesisSTFT( Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 ); } } #ifdef IVAS_FLOAT_FIXED void SynthesisSTFT_ivas_fx( Word32 *fftBuffer, /* i : pointer to FFT bins */ Word16 fftBufferExp, /* i : exponent of FFT bins */ Word16 *timeDomainOutput, /* o : pointer to time domain signal */ Word16 *olapBuffer, /* i/o : pointer to overlap buffer */ const PWord16 *olapWin, /* i : pointer to overlap window */ Word16 tcx_transition, HANDLE_FD_CNG_COM hFdCngCom, /* i/o : pointer to FD_CNG structure containing all buffers and variables */ Word16 gen_exc, Word16 *Q_new, const Word16 element_mode, /* i : element mode */ const Word16 nchan_out /* i : number of output channels */ ) { Word16 i, len, scale, tmp; Word16 len2, len3, len4; Word16 buf[M + 1 + L_FRAME16k]; /* Perform IFFT */ scale = 0; move16(); BASOP_rfft( fftBuffer, hFdCngCom->fftlen, &scale, 1 ); fftBufferExp = add( fftBufferExp, scale ); hFdCngCom->fftBuffer_exp = fftBufferExp; move16(); fftBufferExp = add( fftBufferExp, hFdCngCom->fftlenShift ); /* Perform overlap-add */ /* Handle overlap in P/S domain for stereo */ IF( ( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) && EQ_16( nchan_out, 2 ) ) { Copy( olapBuffer + 3 * hFdCngCom->frameSize / 4 - ( M + 1 ), buf, hFdCngCom->frameSize + M + 1 ); set16_fx( olapBuffer, 0, hFdCngCom->fftlen ); } ELSE { Copy( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); set16_fx( olapBuffer + hFdCngCom->frameSize, 0, hFdCngCom->frameSize ); } len2 = shr( hFdCngCom->fftlen, 2 ); len4 = shr( hFdCngCom->fftlen, 3 ); len3 = add( len2, len4 ); len = add( hFdCngCom->frameSize, len4 ); IF( tcx_transition ) { FOR( i = 0; i < len; i++ ) { olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], fftBufferExp - 15 ) ); move16(); } } ELSE { FOR( i = 0; i < len4; i++ ) { olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 1 * len4], fftBufferExp - 15 ) ), olapWin[i].v.im ) ); move16(); olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 2 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.re ) ); move16(); } FOR( i = len3; i < len; i++ ) { olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], fftBufferExp - 15 ) ); } } FOR( i = 0; i < len4; i++ ) { olapBuffer[i + 5 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 5 * len4], fftBufferExp - 15 ) ), olapWin[i].v.re ); move16(); olapBuffer[i + 6 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 6 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.im ); move16(); } len = add( len, len2 ); FOR( i = len; i < hFdCngCom->fftlen; i++ ) { olapBuffer[i] = 0; move16(); } /* Get time-domain signal */ FOR( i = 0; i < hFdCngCom->frameSize; i++ ) { timeDomainOutput[i] = mult_r( olapBuffer[i + len4], hFdCngCom->fftlenFac ); move16(); } /* Generate excitation */ #ifdef IVAS_CODE_CNG_COM PME() if ( ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) && nchan_out == 2 ) { for ( i = 0; i < hFdCngCom->frameSize / 2; i++ ) { buf[i + ( M + 1 )] += olapBuffer[i + hFdCngCom->frameSize / 4]; } v_multc( buf, (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); } else #endif { FOR( i = 0; i < M + 1 + hFdCngCom->frameSize; i++ ) { buf[i] = mult_r( olapBuffer[i + len4 - M - 1], hFdCngCom->fftlenFac ); move16(); } tmp = buf[0]; } IF( EQ_16( gen_exc, 1 ) ) { Word16 s = getScaleFactor16( buf + 1, M + hFdCngCom->frameSize ); if ( GT_16( *Q_new, s ) ) { *Q_new = s; move16(); } E_UTIL_f_preemph2( *Q_new - 1, buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 ); } IF( EQ_16( gen_exc, 2 ) ) { *Q_new = E_UTIL_f_preemph3( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp, 1 ); Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 ); } } #endif #ifdef IVAS_CODE_CNG_COM /*------------------------------------------------------------------- * SynthesisSTFT_dirac() Loading lib_com/prot_fx.h +14 −0 Original line number Diff line number Diff line Loading @@ -4861,6 +4861,20 @@ void SynthesisSTFT( const Word16 nchan_out /* i : number of output channels */ ); void SynthesisSTFT_ivas_fx( Word32 *fftBuffer, /* i : pointer to FFT bins */ Word16 fftBufferExp, /* i : exponent of FFT bins */ Word16 *timeDomainOutput, /* o : pointer to time domain signal */ Word16 *olapBuffer, /* i/o : pointer to overlap buffer */ const PWord16 *olapWin, /* i : pointer to overlap window */ Word16 tcx_transition, HANDLE_FD_CNG_COM hFdCngCom, /* i/o : pointer to FD_CNG structure containing all buffers and variables */ Word16 gen_exc, Word16 *Q_new, const Word16 element_mode, /* i : element mode */ const Word16 nchan_out /* i : number of output channels */ ); void mhvals( const Word16 d, Word16 *m /*, float * h*/ Loading lib_dec/fd_cng_dec_fx.c +2 −2 Original line number Diff line number Diff line Loading @@ -4032,7 +4032,7 @@ void generate_comfort_noise_dec_ivas_fx( } /* Perform STFT synthesis */ SynthesisSTFT( fftBuffer, fftBuffer_exp, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn, SynthesisSTFT_ivas_fx( fftBuffer, fftBuffer_exp, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn, tcx_transition, hFdCngCom, gen_exc, Q_new, st->element_mode, nchan_out ); scale_sig32( fftBuffer + hFdCngCom->fftlen, sub( FFTLEN, hFdCngCom->fftlen ), sub( fftBuffer_exp, hFdCngCom->fftBuffer_exp ) ); Loading lib_dec/ivas_dirac_output_synthesis_cov.c +1 −1 Original line number Diff line number Diff line Loading @@ -1887,7 +1887,7 @@ Word16 computeMixingMatrices_fx( Cr_p_fx = Cr_fx; Cy_p_fx = Cy_fx; Cy_tilde_p_fx = mat_mult_buffer2_fx; exp = s_max( Cy_fx_e, mat_mult_buffer2_e ); exp = add( s_max( Cy_fx_e, mat_mult_buffer2_e ), 1 ); /* Guard bit */ FOR( i = 0; i < lengthCy * lengthCy; i++ ) { Cy_fx[i] = L_shr( Cy_p_fx[i], exp - Cy_fx_e ); Loading Loading
apps/renderer.c +1 −1 Original line number Diff line number Diff line Loading @@ -839,7 +839,7 @@ int main( exit( -1 ); } #else IF( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) if ( ( error = IVAS_REND_Open( &hIvasRend, args.sampleRate, args.outConfig.audioConfig, args.nonDiegeticPan, args.nonDiegeticPanGain, (int16_t) args.render_framesize ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error opening renderer handle: %s\n", ivas_error_to_string( error ) ); exit( -1 ); Loading
lib_com/fd_cng_com_fx.c +132 −0 Original line number Diff line number Diff line Loading @@ -2599,6 +2599,138 @@ void SynthesisSTFT( Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 ); } } #ifdef IVAS_FLOAT_FIXED void SynthesisSTFT_ivas_fx( Word32 *fftBuffer, /* i : pointer to FFT bins */ Word16 fftBufferExp, /* i : exponent of FFT bins */ Word16 *timeDomainOutput, /* o : pointer to time domain signal */ Word16 *olapBuffer, /* i/o : pointer to overlap buffer */ const PWord16 *olapWin, /* i : pointer to overlap window */ Word16 tcx_transition, HANDLE_FD_CNG_COM hFdCngCom, /* i/o : pointer to FD_CNG structure containing all buffers and variables */ Word16 gen_exc, Word16 *Q_new, const Word16 element_mode, /* i : element mode */ const Word16 nchan_out /* i : number of output channels */ ) { Word16 i, len, scale, tmp; Word16 len2, len3, len4; Word16 buf[M + 1 + L_FRAME16k]; /* Perform IFFT */ scale = 0; move16(); BASOP_rfft( fftBuffer, hFdCngCom->fftlen, &scale, 1 ); fftBufferExp = add( fftBufferExp, scale ); hFdCngCom->fftBuffer_exp = fftBufferExp; move16(); fftBufferExp = add( fftBufferExp, hFdCngCom->fftlenShift ); /* Perform overlap-add */ /* Handle overlap in P/S domain for stereo */ IF( ( EQ_16( element_mode, IVAS_CPE_TD ) || EQ_16( element_mode, IVAS_CPE_DFT ) ) && EQ_16( nchan_out, 2 ) ) { Copy( olapBuffer + 3 * hFdCngCom->frameSize / 4 - ( M + 1 ), buf, hFdCngCom->frameSize + M + 1 ); set16_fx( olapBuffer, 0, hFdCngCom->fftlen ); } ELSE { Copy( olapBuffer + hFdCngCom->frameSize, olapBuffer, hFdCngCom->frameSize ); set16_fx( olapBuffer + hFdCngCom->frameSize, 0, hFdCngCom->frameSize ); } len2 = shr( hFdCngCom->fftlen, 2 ); len4 = shr( hFdCngCom->fftlen, 3 ); len3 = add( len2, len4 ); len = add( hFdCngCom->frameSize, len4 ); IF( tcx_transition ) { FOR( i = 0; i < len; i++ ) { olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], fftBufferExp - 15 ) ); move16(); } } ELSE { FOR( i = 0; i < len4; i++ ) { olapBuffer[i + 1 * len4] = add_sat( olapBuffer[i + 1 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 1 * len4], fftBufferExp - 15 ) ), olapWin[i].v.im ) ); move16(); olapBuffer[i + 2 * len4] = add_sat( olapBuffer[i + 2 * len4], mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 2 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.re ) ); move16(); } FOR( i = len3; i < len; i++ ) { olapBuffer[i] = round_fx_sat( L_shl_sat( fftBuffer[i], fftBufferExp - 15 ) ); } } FOR( i = 0; i < len4; i++ ) { olapBuffer[i + 5 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 5 * len4], fftBufferExp - 15 ) ), olapWin[i].v.re ); move16(); olapBuffer[i + 6 * len4] = mult_r( round_fx_sat( L_shl_sat( fftBuffer[i + 6 * len4], fftBufferExp - 15 ) ), olapWin[len4 - 1 - i].v.im ); move16(); } len = add( len, len2 ); FOR( i = len; i < hFdCngCom->fftlen; i++ ) { olapBuffer[i] = 0; move16(); } /* Get time-domain signal */ FOR( i = 0; i < hFdCngCom->frameSize; i++ ) { timeDomainOutput[i] = mult_r( olapBuffer[i + len4], hFdCngCom->fftlenFac ); move16(); } /* Generate excitation */ #ifdef IVAS_CODE_CNG_COM PME() if ( ( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) && nchan_out == 2 ) { for ( i = 0; i < hFdCngCom->frameSize / 2; i++ ) { buf[i + ( M + 1 )] += olapBuffer[i + hFdCngCom->frameSize / 4]; } v_multc( buf, (float) ( hFdCngCom->fftlen / 2 ), buf, M + 1 + hFdCngCom->frameSize ); } else #endif { FOR( i = 0; i < M + 1 + hFdCngCom->frameSize; i++ ) { buf[i] = mult_r( olapBuffer[i + len4 - M - 1], hFdCngCom->fftlenFac ); move16(); } tmp = buf[0]; } IF( EQ_16( gen_exc, 1 ) ) { Word16 s = getScaleFactor16( buf + 1, M + hFdCngCom->frameSize ); if ( GT_16( *Q_new, s ) ) { *Q_new = s; move16(); } E_UTIL_f_preemph2( *Q_new - 1, buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp ); Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 ); } IF( EQ_16( gen_exc, 2 ) ) { *Q_new = E_UTIL_f_preemph3( buf + 1, PREEMPH_FAC, M + hFdCngCom->frameSize, &tmp, 1 ); Residu3_fx( hFdCngCom->A_cng, buf + 1 + M, hFdCngCom->exc_cng, hFdCngCom->frameSize, 1 ); } } #endif #ifdef IVAS_CODE_CNG_COM /*------------------------------------------------------------------- * SynthesisSTFT_dirac() Loading
lib_com/prot_fx.h +14 −0 Original line number Diff line number Diff line Loading @@ -4861,6 +4861,20 @@ void SynthesisSTFT( const Word16 nchan_out /* i : number of output channels */ ); void SynthesisSTFT_ivas_fx( Word32 *fftBuffer, /* i : pointer to FFT bins */ Word16 fftBufferExp, /* i : exponent of FFT bins */ Word16 *timeDomainOutput, /* o : pointer to time domain signal */ Word16 *olapBuffer, /* i/o : pointer to overlap buffer */ const PWord16 *olapWin, /* i : pointer to overlap window */ Word16 tcx_transition, HANDLE_FD_CNG_COM hFdCngCom, /* i/o : pointer to FD_CNG structure containing all buffers and variables */ Word16 gen_exc, Word16 *Q_new, const Word16 element_mode, /* i : element mode */ const Word16 nchan_out /* i : number of output channels */ ); void mhvals( const Word16 d, Word16 *m /*, float * h*/ Loading
lib_dec/fd_cng_dec_fx.c +2 −2 Original line number Diff line number Diff line Loading @@ -4032,7 +4032,7 @@ void generate_comfort_noise_dec_ivas_fx( } /* Perform STFT synthesis */ SynthesisSTFT( fftBuffer, fftBuffer_exp, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn, SynthesisSTFT_ivas_fx( fftBuffer, fftBuffer_exp, timeDomainOutput, hFdCngCom->olapBufferSynth, hFdCngCom->olapWinSyn, tcx_transition, hFdCngCom, gen_exc, Q_new, st->element_mode, nchan_out ); scale_sig32( fftBuffer + hFdCngCom->fftlen, sub( FFTLEN, hFdCngCom->fftlen ), sub( fftBuffer_exp, hFdCngCom->fftBuffer_exp ) ); Loading
lib_dec/ivas_dirac_output_synthesis_cov.c +1 −1 Original line number Diff line number Diff line Loading @@ -1887,7 +1887,7 @@ Word16 computeMixingMatrices_fx( Cr_p_fx = Cr_fx; Cy_p_fx = Cy_fx; Cy_tilde_p_fx = mat_mult_buffer2_fx; exp = s_max( Cy_fx_e, mat_mult_buffer2_e ); exp = add( s_max( Cy_fx_e, mat_mult_buffer2_e ), 1 ); /* Guard bit */ FOR( i = 0; i < lengthCy * lengthCy; i++ ) { Cy_fx[i] = L_shr( Cy_p_fx[i], exp - Cy_fx_e ); Loading