Review conditions in tcx_encoder_memory_update_ivas_fx(), tcx_encoder_memory_update_fx()
# Bug description The memory update conditions in tcx_encoder_memory_update() differ between float and BASOP: Float: ``` if ( !st->tcxonly || ( L_frame_glob == L_FRAME16k ) ) { /* Update excitation */ if ( L_frame_glob < L_EXC_MEM ) { mvr2r( LPDmem->old_exc + ( L_frame_glob ), LPDmem->old_exc, L_EXC_MEM - L_frame_glob ); residu( A, M, synth, LPDmem->old_exc + L_EXC_MEM - ( L_frame_glob ), L_frame_glob ); } else { residu( A, M, synth + (L_frame_glob) -L_EXC_MEM, LPDmem->old_exc, L_EXC_MEM ); } } ``` BASOP, tcx_encoder_memory_update_fx() ``` IF( st->tcxonly == 0 || LE_16( L_frame_glob, L_FRAME16k ) ) { /* Update excitation */ IF( LT_16( L_frame_glob, L_EXC_MEM ) ) { Copy( LPDmem->old_exc + L_frame_glob, LPDmem->old_exc, sub( L_EXC_MEM, L_frame_glob ) ); Residu3_fx( A, synth, LPDmem->old_exc + sub( L_EXC_MEM, L_frame_glob ), L_frame_glob, 1 ); } ELSE { Residu3_fx( A, synth + sub( L_frame_glob, L_EXC_MEM ), LPDmem->old_exc, L_EXC_MEM, 1 ); } } ``` BASOP, tcx_encoder_memory_update_ivas_fx() ``` IF( st->tcxonly == 0 || LE_16( L_frame_glob, L_FRAME16k ) ) { /* Update excitation */ IF( LT_16( L_frame_glob, L_EXC_MEM ) ) { Word16 shift = norm_arr( LPDmem->old_exc + L_frame_glob, sub( L_EXC_MEM, L_frame_glob ) ); IF( LT_16( shift, sub( Q_new, LPDmem->q_lpd_old_exc ) ) ) { Copy_Scale_sig( LPDmem->old_exc + L_frame_glob, LPDmem->old_exc, sub( L_EXC_MEM, L_frame_glob ), shift ); LPDmem->q_lpd_old_exc = add( LPDmem->q_lpd_old_exc, shift ); move16(); Residu3_fx( A, synth, LPDmem->old_exc + sub( L_EXC_MEM, L_frame_glob ), L_frame_glob, sub( LPDmem->q_lpd_old_exc, Q_new ) ); // LPDmem->q_lpd_old_exc } ELSE { Copy_Scale_sig( LPDmem->old_exc + L_frame_glob, LPDmem->old_exc, sub( L_EXC_MEM, L_frame_glob ), sub( Q_new, LPDmem->q_lpd_old_exc ) ); Residu3_fx( A, synth, LPDmem->old_exc + sub( L_EXC_MEM, L_frame_glob ), L_frame_glob, 0 ); // Q_new LPDmem->q_lpd_old_exc = Q_new; move16(); } } ELSE { Residu3_fx( A, synth + sub( L_frame_glob, L_EXC_MEM ), LPDmem->old_exc, L_EXC_MEM, 0 ); // Q_new LPDmem->q_lpd_old_exc = Q_new; move16(); } } ``` While float compares `L_frame_glob == L_FRAME16k`, in BASOP the comparison is `LE_16( L_frame_glob, L_FRAME16k )`. I.e., BASOP also seems to copy/scale for L_frame_glob == 256, whereas float doesn't.
issue