Loading lib_enc/ivas_sns_enc_fx.c +100 −2 Original line number Diff line number Diff line Loading @@ -171,6 +171,103 @@ static Word16 sns_1st_cod_fx( return index; } static Word16 sns_1st_cod_fx_q15( const Word32 *sns_fx, /* i : vector to quantize */ const Word16 L_frame, const Word16 core, Word32 *snsq_fx /* o : quantized sns Q16 */ ) { Word16 index; const Word16 split_len = M / 2; move16(); const Word16 *means; const Word16 means_fix = 2; // Q15 push_wmops("sns_1st_cod_fx_q15"); move16(); /* remove means */ means = NULL; SWITCH( L_frame ) { case L_FRAME16k: means = &sns_1st_means_16k[core - 1][0]; break; case L_FRAME25_6k: means = &sns_1st_means_25k6[core - 1][0]; break; case L_FRAME32k: means = &sns_1st_means_32k[core - 1][0]; break; default: assert( !"illegal frame length in sns_1st_cod" ); } FOR( Word16 i = 0; i < M; ++i ) { Word32 tmp = L_mult( means[i], means_fix ); // Q16 snsq_fx[i] = L_add(sns_fx[i], L_negate( tmp ) ); move32(); } index = 0; move16(); FOR( Word16 split = 0; split < 2; ++split ) { const Word16 *cdbk_ptr; Word16 j0, j1; Word16 dist_split; Word64 dist_min_fx; const Word16 cdbk_fix = 8; // 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC ) in Q15 move16(); const Word16 *const cdbk = &sns_1st_cdbk[split][core - 1][0]; j0 = imult1616( split, split_len ); j1 = add( j0, split_len ); cdbk_ptr = cdbk; dist_min_fx = 0x7fffffffffffffffull; dist_split = 0; FOR( Word16 i = 0; i < 32; ++i ) { Word64 dist_fx = 0; move64(); FOR( Word16 j = j0; j < j1; ++j ) { Word32 dist; Word32 tmp_1 = L_mult( ( *cdbk_ptr++ ), cdbk_fix ); // Q16 move16(); dist = ( L_add(snsq_fx[j], L_negate( tmp_1 ) ) ); dist_fx = W_mac_32_32( dist_fx, dist, dist ); } if ( LT_64( dist_fx, dist_min_fx ) ) { dist_min_fx= dist_fx; dist_split =i ; } } /* set quantized vector */ cdbk_ptr = &cdbk[imult1616( dist_split, split_len )]; FOR( Word16 j = j0; j < j1; ++j ) { Word32 tmp_3 = L_mult( means[j], means_fix ); // Q16 Word32 tmp_4 = L_mult( ( *cdbk_ptr++ ), cdbk_fix ); // Q16 snsq_fx[j] = L_add( tmp_4, tmp_3 ); // Q16 move32(); } /* for second split shift by five bits to store both indices as one 10 bit value */ IF( EQ_16( split, 1 ) ) { dist_split = shl( dist_split, 5 ); } index = add( index, dist_split ); } pop_wmops(); return index; } /*------------------------------------------------------------------- * sns_2st_cod() * Loading Loading @@ -276,7 +373,7 @@ void sns_avq_cod_fx( Word16 indxt[256], nbits, nbt, nit; Word32 snsmid_q0_fx[M]; index[0] = sns_1st_cod_fx( sns_fx, exp_sns, L_frame, core, sns_q_fx ); index[0] = sns_1st_cod_fx_q15( sns_fx, L_frame, core, sns_q_fx ); move16(); nit = 1 + 2; move16(); Loading @@ -303,7 +400,8 @@ void sns_avq_cod_fx( { index++; index[0] = sns_1st_cod_fx( snsmid_fx, exp_snsmid, L_frame, core, snsmid_q_fx ); index[0] = sns_1st_cod_fx_q15( snsmid_fx, L_frame, core, snsmid_q_fx ); // index[0] = sns_1st_cod_fx( snsmid_fx, exp_snsmid, L_frame, core, snsmid_q_fx ); move16(); nit = 1 + 2; move16(); Loading Loading
lib_enc/ivas_sns_enc_fx.c +100 −2 Original line number Diff line number Diff line Loading @@ -171,6 +171,103 @@ static Word16 sns_1st_cod_fx( return index; } static Word16 sns_1st_cod_fx_q15( const Word32 *sns_fx, /* i : vector to quantize */ const Word16 L_frame, const Word16 core, Word32 *snsq_fx /* o : quantized sns Q16 */ ) { Word16 index; const Word16 split_len = M / 2; move16(); const Word16 *means; const Word16 means_fix = 2; // Q15 push_wmops("sns_1st_cod_fx_q15"); move16(); /* remove means */ means = NULL; SWITCH( L_frame ) { case L_FRAME16k: means = &sns_1st_means_16k[core - 1][0]; break; case L_FRAME25_6k: means = &sns_1st_means_25k6[core - 1][0]; break; case L_FRAME32k: means = &sns_1st_means_32k[core - 1][0]; break; default: assert( !"illegal frame length in sns_1st_cod" ); } FOR( Word16 i = 0; i < M; ++i ) { Word32 tmp = L_mult( means[i], means_fix ); // Q16 snsq_fx[i] = L_add(sns_fx[i], L_negate( tmp ) ); move32(); } index = 0; move16(); FOR( Word16 split = 0; split < 2; ++split ) { const Word16 *cdbk_ptr; Word16 j0, j1; Word16 dist_split; Word64 dist_min_fx; const Word16 cdbk_fix = 8; // 1.f / powf( 2, SNS_CDBKS_BITS_4_FRAC ) in Q15 move16(); const Word16 *const cdbk = &sns_1st_cdbk[split][core - 1][0]; j0 = imult1616( split, split_len ); j1 = add( j0, split_len ); cdbk_ptr = cdbk; dist_min_fx = 0x7fffffffffffffffull; dist_split = 0; FOR( Word16 i = 0; i < 32; ++i ) { Word64 dist_fx = 0; move64(); FOR( Word16 j = j0; j < j1; ++j ) { Word32 dist; Word32 tmp_1 = L_mult( ( *cdbk_ptr++ ), cdbk_fix ); // Q16 move16(); dist = ( L_add(snsq_fx[j], L_negate( tmp_1 ) ) ); dist_fx = W_mac_32_32( dist_fx, dist, dist ); } if ( LT_64( dist_fx, dist_min_fx ) ) { dist_min_fx= dist_fx; dist_split =i ; } } /* set quantized vector */ cdbk_ptr = &cdbk[imult1616( dist_split, split_len )]; FOR( Word16 j = j0; j < j1; ++j ) { Word32 tmp_3 = L_mult( means[j], means_fix ); // Q16 Word32 tmp_4 = L_mult( ( *cdbk_ptr++ ), cdbk_fix ); // Q16 snsq_fx[j] = L_add( tmp_4, tmp_3 ); // Q16 move32(); } /* for second split shift by five bits to store both indices as one 10 bit value */ IF( EQ_16( split, 1 ) ) { dist_split = shl( dist_split, 5 ); } index = add( index, dist_split ); } pop_wmops(); return index; } /*------------------------------------------------------------------- * sns_2st_cod() * Loading Loading @@ -276,7 +373,7 @@ void sns_avq_cod_fx( Word16 indxt[256], nbits, nbt, nit; Word32 snsmid_q0_fx[M]; index[0] = sns_1st_cod_fx( sns_fx, exp_sns, L_frame, core, sns_q_fx ); index[0] = sns_1st_cod_fx_q15( sns_fx, L_frame, core, sns_q_fx ); move16(); nit = 1 + 2; move16(); Loading @@ -303,7 +400,8 @@ void sns_avq_cod_fx( { index++; index[0] = sns_1st_cod_fx( snsmid_fx, exp_snsmid, L_frame, core, snsmid_q_fx ); index[0] = sns_1st_cod_fx_q15( snsmid_fx, L_frame, core, snsmid_q_fx ); // index[0] = sns_1st_cod_fx( snsmid_fx, exp_snsmid, L_frame, core, snsmid_q_fx ); move16(); nit = 1 + 2; move16(); Loading