From ebaf8ffac1bbb076f33a5b689d47fd789c83106a Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 9 Jan 2024 19:49:17 +0530 Subject: [PATCH] ivas_sba_dec_render sub-functions converted to fixed [x] Converted cldfbAnalysis_ts, ivas_get_spar_dec_md_num_subframes, ivas_spar_get_skip_mat, ivas_sba_set_cna_cng_flag, ivas_sba_get_nchan_metadata, ivas_dirac_dec_set_md_map, ivas_jbm_dec_get_adapted_subframes, ivas_jbm_dec_get_md_map and ivas_jbm_dec_get_md_map_even_spacing functions. --- Workspace_msvc/lib_com.vcxproj.filters | 462 +------------------------ lib_com/cldfb.c | 369 +++++++++++++++++++- lib_com/ivas_prot.h | 51 +++ lib_com/ivas_sba_config.c | 30 ++ lib_com/prot.h | 9 + lib_com/prot_fx2.h | 8 + lib_com/rom_com.c | 332 +++++++++++++++++- lib_com/rom_com_fx.h | 36 ++ lib_com/stat_com.h | 23 +- lib_dec/core_dec_init.c | 8 +- lib_dec/ivas_dirac_dec.c | 70 ++++ lib_dec/ivas_jbm_dec.c | 143 +++++++- lib_dec/ivas_masa_dec.c | 4 +- lib_dec/ivas_sba_dec.c | 42 ++- lib_dec/ivas_spar_decoder.c | 127 +++++++ lib_dec/ivas_spar_md_dec.c | 63 ++++ lib_dec/ivas_stat_dec.h | 5 + 17 files changed, 1298 insertions(+), 484 deletions(-) diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters index 34135d661..b39c6d3cc 100644 --- a/Workspace_msvc/lib_com.vcxproj.filters +++ b/Workspace_msvc/lib_com.vcxproj.filters @@ -1,363 +1,6 @@ - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_evs_c - - - common_evs_c - - - common_evs_c - - - common_evs_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_all_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - common_evs_c @@ -370,108 +13,6 @@ common_evs_c - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_ivas_c - - - common_all_c - - - common_all_c - - - common_all_c - @@ -580,7 +121,6 @@ - @@ -835,4 +375,4 @@ - + \ No newline at end of file diff --git a/lib_com/cldfb.c b/lib_com/cldfb.c index b77c38d3b..ed4aa63b5 100644 --- a/lib_com/cldfb.c +++ b/lib_com/cldfb.c @@ -40,7 +40,9 @@ #include #include "stat_dec.h" #include "prot.h" +#include "prot_fx2.h" #include "rom_com.h" +#include "rom_com_fx.h" #include "wmc_auto.h" #include "prot_fx2.h" #if __STDC_VERSION__ >= 199901L @@ -476,6 +478,241 @@ void cldfbAnalysis_ts_ivas( return; } +#ifdef IVAS_FLOAT_FIXED +void cldfbAnalysis_ts_fx( + const Word32 *timeIn_fx, /* i : time buffer */ // q = 27 + Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : real value buffer */ // q = 23 + Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : imag value buffer */ // q = 23 + const Word16 samplesToProcess, /* i : samples to process */ + HANDLE_CLDFB_FILTER_BANK h_cldfb /* i : filterbank state */ +) +{ + Word16 i, k; + Word16 L2, M1, M2, M4; + Word16 no_col = h_cldfb->no_col; + + Word32 r1_fx, r2_fx, rr12_fx, ir12_fx; + Word32 i1_fx, i2_fx, ri12_fx, ii12_fx; + Word32 rBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX]; + Word32 iBuffer_fx[2 * CLDFB_NO_CHANNELS_MAX]; + const Word32 *rot_vctr_re_fx; + const Word32 *rot_vctr_im_fx; + const Word32 *rot_vctr_delay_re_fx; + const Word32 *rot_vctr_delay_im_fx; + const Word16 *ptr_pf_fx; + Word16 ptr_pf_sf; + Word32 *timeBuffer_fx, buffer_fx[( CLDFB_NO_CHANNELS_MAX * CLDFB_NO_COL_MAX ) + ( 9 * CLDFB_NO_CHANNELS_MAX )]; + Word16 offset, frameSize; + + offset = h_cldfb->p_filter_length - h_cldfb->no_channels; + frameSize = h_cldfb->no_channels * h_cldfb->no_col; + + /* prepare input buffer */ + timeBuffer_fx = buffer_fx; + Copy32( h_cldfb->cldfb_state_fx, timeBuffer_fx, offset ); + + if ( samplesToProcess > -1 ) + { + Copy32( timeIn_fx, timeBuffer_fx + offset, samplesToProcess ); + set32_fx( timeBuffer_fx + offset + samplesToProcess, 0, ( frameSize - samplesToProcess ) ); + } + else + { + Copy32( timeIn_fx, timeBuffer_fx + offset, frameSize ); + } + + /* only process needed cols */ + if ( samplesToProcess > -1 ) + { + no_col = min( no_col, ( samplesToProcess + h_cldfb->no_channels - 1 ) / h_cldfb->no_channels ); + assert( no_col == 1 ); + } + + M1 = h_cldfb->no_channels; + M2 = M1 >> 1; + M4 = M1 >> 2; + L2 = M1 << 1; + + if ( M2 & 1 ) + { + M4 += 1; + } + + rot_vctr_re_fx = h_cldfb->rot_vec_ana_re_fx; // q = 29 + rot_vctr_im_fx = h_cldfb->rot_vec_ana_im_fx; // q = 29 + rot_vctr_delay_re_fx = h_cldfb->rot_vec_ana_delay_re_fx; // q = 31 + rot_vctr_delay_im_fx = h_cldfb->rot_vec_ana_delay_im_fx; // q = 31 + + ptr_pf_fx = h_cldfb->p_filter; + ptr_pf_sf = h_cldfb->p_filter_sf; + + for ( i = 0; i < no_col; i++ ) + { + for ( k = 0; k < M4; k++ ) + { + /* prototype filter */ + r1_fx = L_sub(0, Mpy_32_16_1(timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )])); // q = 27 + r1_fx = L_sub(r1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )])); // q = 27 + r1_fx = L_sub(r1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )])); // q = 27 + r1_fx = L_sub(r1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )])); // q = 27 + r1_fx = L_sub(r1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )])); // q = 27 + + r2_fx = L_sub(0, Mpy_32_16_1(timeBuffer_fx[L2 - M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 0 * L2 )])); // q = 27 + r2_fx = L_sub(r2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 1 * L2 )])); // q = 27 + r2_fx = L_sub(r2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 2 * L2 )])); // q = 27 + r2_fx = L_sub(r2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 3 * L2 )])); // q = 27 + r2_fx = L_sub(r2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 + ( 2 * k ) + 4 * L2 )])); // q = 27 + + i1_fx = L_sub(0, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )])); // q = 27 + i1_fx = L_sub(i1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )])); // q = 27 + i1_fx = L_sub(i1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )])); // q = 27 + i1_fx = L_sub(i1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )])); // q = 27 + i1_fx = L_sub(i1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )])); // q = 27 + + i2_fx = L_sub(0, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 0 * L2 )])); // q = 27 + i2_fx = L_sub(i2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 1 * L2 )])); // q = 27 + i2_fx = L_sub(i2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 2 * L2 )])); // q = 27 + i2_fx = L_sub(i2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 3 * L2 )])); // q = 27 + i2_fx = L_sub(i2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 - 1 - ( 2 * k ) + 4 * L2 )])); // q = 27 + + r1_fx = Mpy_32_16_1(r1_fx, ptr_pf_sf); + r2_fx = Mpy_32_16_1(r2_fx, ptr_pf_sf); + i1_fx = Mpy_32_16_1(i1_fx, ptr_pf_sf); + i2_fx = Mpy_32_16_1(i2_fx, ptr_pf_sf); + + /* folding + pre modulation of DST IV */ + rr12_fx = L_sub( r1_fx, r2_fx ); // q = 27 + ri12_fx = L_negate( L_add( i1_fx, i2_fx ) ); // q = 27 + /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ + rBuffer_fx[2 * k] = L_sub(Mpy_32_32(rr12_fx, rot_vctr_re_fx[k]), Mpy_32_32(ri12_fx, rot_vctr_im_fx[k])); // q = 25 + rBuffer_fx[2 * k + 1] = L_add(Mpy_32_32(rr12_fx, rot_vctr_im_fx[k]), Mpy_32_32(ri12_fx, rot_vctr_re_fx[k])); // q = 25 + + ///* folding + pre modulation of DCT IV */ + ir12_fx = L_add(r1_fx, r2_fx); // q = 27 + ii12_fx = L_sub(i1_fx, i2_fx); // q = 27 + /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ + iBuffer_fx[2 * k] = L_sub(Mpy_32_32(ir12_fx, rot_vctr_re_fx[k]), Mpy_32_32(ii12_fx, rot_vctr_im_fx[k])); // q = 25 + iBuffer_fx[2 * k + 1] = L_add(Mpy_32_32(ir12_fx, rot_vctr_im_fx[k]), Mpy_32_32(ii12_fx, rot_vctr_re_fx[k])); // q = 25 + } + + for ( k = M4; k < M2; k++ ) + { + /* prototype filter */ + r1_fx = L_sub(0, Mpy_32_16_1(timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 0 * L2 )])); // q = 27 + r1_fx = L_sub(r1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 1 * L2 )])); // q = 27 + r1_fx = L_sub(r1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 2 * L2 )])); // q = 27 + r1_fx = L_sub(r1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 3 * L2 )])); // q = 27 + r1_fx = L_sub(r1_fx, Mpy_32_16_1(timeBuffer_fx[L2 - M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - M2 - 1 - ( 2 * k ) + 4 * L2 )])); // q = 27 + + r2_fx = L_sub(0, Mpy_32_16_1(timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 0 * L2 )])); // q = 27 + r2_fx = L_sub(r2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 1 * L2 )])); // q = 27 + r2_fx = L_sub(r2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 2 * L2 )])); // q = 27 + r2_fx = L_sub(r2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 3 * L2 )])); // q = 27 + r2_fx = L_sub(r2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 5 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 5 * M2 + ( 2 * k ) + 4 * L2 )])); // q = 27 + + i1_fx = L_sub(0, Mpy_32_16_1(timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 0 * L2 )])); // q = 27 + i1_fx = L_sub(i1_fx, Mpy_32_16_1(timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 1 * L2 )])); // q = 27 + i1_fx = L_sub(i1_fx, Mpy_32_16_1(timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 2 * L2 )])); // q = 27 + i1_fx = L_sub(i1_fx, Mpy_32_16_1(timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 3 * L2 )])); // q = 27 + i1_fx = L_sub(i1_fx, Mpy_32_16_1(timeBuffer_fx[L2 + M2 - 1 - ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 + M2 - 1 - ( 2 * k ) + 4 * L2 )])); // q = 27 + + i2_fx = L_sub(0, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 0 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 0 * L2 )])); // q = 27 + i2_fx = L_sub(i2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 1 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 1 * L2 )])); // q = 27 + i2_fx = L_sub(i2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 2 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 2 * L2 )])); // q = 27 + i2_fx = L_sub(i2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 3 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 3 * L2 )])); // q = 27 + i2_fx = L_sub(i2_fx, Mpy_32_16_1(timeBuffer_fx[L2 - 3 * M2 + ( 2 * k ) + 4 * L2], ptr_pf_fx[( L2 - 3 * M2 + ( 2 * k ) + 4 * L2 )])); // q = 27 + + r1_fx = Mpy_32_16_1(r1_fx, ptr_pf_sf); + r2_fx = Mpy_32_16_1(r2_fx, ptr_pf_sf); + i1_fx = Mpy_32_16_1(i1_fx, ptr_pf_sf); + i2_fx = Mpy_32_16_1(i2_fx, ptr_pf_sf); + + /* folding + pre modulation of DST IV */ + rr12_fx = L_add(r1_fx, r2_fx); // q = 27 + ri12_fx = L_sub(i1_fx, i2_fx); // q = 27 + /*cplxMult(&rBuffer[2*k],&rBuffer[2*k+1],rr12,ri12,rot_vctr_re[k],rot_vctr_im[k]);*/ + rBuffer_fx[2 * k] = L_sub(Mpy_32_32(rr12_fx, rot_vctr_re_fx[k]), Mpy_32_32(ri12_fx, rot_vctr_im_fx[k])); // q = 25 + rBuffer_fx[2 * k + 1] = L_add(Mpy_32_32(rr12_fx, rot_vctr_im_fx[k]), Mpy_32_32(ri12_fx, rot_vctr_re_fx[k])); // q = 25 + + /* folding + pre modulation of DCT IV */ + ir12_fx = L_sub(r1_fx, r2_fx); // q = 27 + ii12_fx = L_add(i1_fx, i2_fx); // q = 27 + /*cplxMult(&iBuffer[2*k],&iBuffer[2*k+1],ir12,ii12,rot_vctr_re[k],rot_vctr_im[k]);*/ + iBuffer_fx[2 * k] = L_sub(Mpy_32_32(ir12_fx, rot_vctr_re_fx[k]), Mpy_32_32(ii12_fx, rot_vctr_im_fx[k])); // q = 25 + iBuffer_fx[2 * k + 1] = L_add(Mpy_32_32(ir12_fx, rot_vctr_im_fx[k]), Mpy_32_32(ii12_fx, rot_vctr_re_fx[k])); // q = 25 + } + + /* FFT of DST IV */ + Word16 q_shift; + q_shift = L_norm_arr(rBuffer_fx, 2 * CLDFB_NO_CHANNELS_MAX) - find_guarded_bits_fx(M2); + for (Word16 ind = 0; ind < 2 * CLDFB_NO_CHANNELS_MAX; ind++) { + rBuffer_fx[ind] = L_shl(rBuffer_fx[ind], q_shift); + } + fft_cldfb_fx( rBuffer_fx, M2 ); + for (Word16 ind = 0; ind < 2 * CLDFB_NO_CHANNELS_MAX; ind++) { + rBuffer_fx[ind] = L_shr(rBuffer_fx[ind], q_shift); + } + + /* post modulation of DST IV */ + for ( k = 0; k < M2; k++ ) + { + /*cplxMult(&realBuffer[M1-1-(2*k)],&realBuffer[2*k],rBuffer[2*k],rBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ + realBuffer_fx[M1 - 1 - ( 2 * k )] = L_sub(Mpy_32_32(rBuffer_fx[2 * k], rot_vctr_re_fx[k]), Mpy_32_32(rBuffer_fx[2 * k + 1], rot_vctr_im_fx[k])); // q = 23 + realBuffer_fx[2 * k] = L_add(Mpy_32_32(rBuffer_fx[2 * k], rot_vctr_im_fx[k]), Mpy_32_32(rBuffer_fx[2 * k + 1], rot_vctr_re_fx[k])); // q = 23 + } + + /* FFT of DCT IV */ + fft_cldfb_fx( iBuffer_fx, M2 ); + + /* post modulation of DCT IV */ + for ( k = 0; k < M2; k++ ) + { + /* do it inplace */ + /*cplxMult(&imagBuffer[2*k],&imagBuffer[M1-1-(2*k)],iBuffer[2*k],iBuffer[2*k+1],rot_vctr_re[k],rot_vctr_im[k]);*/ + imagBuffer_fx[2 * k] = L_sub(Mpy_32_32(iBuffer_fx[2 * k], rot_vctr_re_fx[k]), Mpy_32_32(iBuffer_fx[2 * k + 1], rot_vctr_im_fx[k])); // q = 23 + imagBuffer_fx[M1 - 1 - ( 2 * k )] = L_add(Mpy_32_32(iBuffer_fx[2 * k], rot_vctr_im_fx[k]), Mpy_32_32(iBuffer_fx[2 * k + 1], rot_vctr_re_fx[k])); // q = 23 + } + + if ( h_cldfb->prototype == CLDFB_PROTOTYPE_5_00MS ) + { + /* rotation due to delay*/ + /*if(h_cldfb->da != M1)*/ + if ( rot_vctr_delay_re_fx != NULL ) + { + for ( k = 0; k < M1; k++ ) + { + Word32 cplx_aux_fx; + /* delay */ + /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[i][k], imagBuffer[i][k], cos((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)), + sin((EVS_PI/M1)*(k+0.5)*((h_cldfb->da-M1)*0.5)));*/ + /*cplxMult(&rBuffer[k], &iBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/ + /*cplxMult(&realBuffer[k], &imagBuffer[k], realBuffer[k], imagBuffer[k], rot_vctr_delay_re[k], rot_vctr_delay_im[k]);*/ + /*realBuffer[k] = rBuffer[k]; + imagBuffer[k] = iBuffer[k];*/ + cplx_aux_fx = L_sub(Mpy_32_32(realBuffer_fx[k], rot_vctr_delay_re_fx[k]), Mpy_32_32(imagBuffer_fx[k], rot_vctr_delay_im_fx[k])); // q = 23 + imagBuffer_fx[k] = L_add(Mpy_32_32(realBuffer_fx[k], rot_vctr_delay_im_fx[k]), Mpy_32_32(imagBuffer_fx[k], rot_vctr_delay_re_fx[k])); // q = 23 + realBuffer_fx[k] = cplx_aux_fx; + } + } + } + + timeBuffer_fx += L2 * 5; + timeBuffer_fx += h_cldfb->no_channels - h_cldfb->p_filter_length; + } + + /* update memory */ + if ( samplesToProcess > -1 ) + { + Copy32( buffer_fx + samplesToProcess, h_cldfb->cldfb_state_fx, offset ); + } + else + { + Copy32( buffer_fx + frameSize, h_cldfb->cldfb_state_fx, offset ); + } + + return; +} +#endif /*-------------------------------------------------------------------* * cldfbSynthesis_ivas() * @@ -723,17 +960,18 @@ ivas_error openCldfb_ivas( { buf_len = hs->p_filter_length; } -#ifdef IVAS_FLOAT_FIXED - if ( ( hs->cldfb_state_fx = (Word16 *) malloc( buf_len * sizeof( Word16 ) ) ) == NULL ) + + if ( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } -#endif // IVAS_FLOAT_FIXED - - if ( ( hs->cldfb_state = (float *) malloc( buf_len * sizeof( float ) ) ) == NULL ) +#ifdef IVAS_FLOAT_FIXED + if ( ( hs->cldfb_state_fx = (Word32 *) malloc( buf_len * sizeof( Word32 ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for CLDFB" ); } + set32_fx(hs->cldfb_state_fx, 0, buf_len); +#endif // IVAS_FLOAT_FIXED set_f( hs->cldfb_state, 0.0f, buf_len ); @@ -894,6 +1132,9 @@ void deleteCldfb_ivas( if ( hs->cldfb_state ) { free( hs->cldfb_state ); +#ifdef IVAS_FLOAT_FIXED + free( hs->cldfb_state_fx ); +#endif } free( hs ); @@ -921,6 +1162,10 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_im = rot_vec_ana_im_L10; hs->rot_vec_syn_re = rot_vec_syn_re_L10; hs->rot_vec_syn_im = rot_vec_syn_im_L10; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L10_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L10_fx; +#endif if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) { @@ -932,6 +1177,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = NULL; hs->rot_vec_syn_delay_re = NULL; hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = NULL; + hs->rot_vec_ana_delay_im_fx = NULL; + hs->p_filter_sf = (Word16)17036; + hs->p_filter = CLDFB80_10_fx; +#endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) { @@ -943,6 +1194,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; + hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; + hs->p_filter_sf = (Word16)15388; + hs->p_filter = LDQMF_10_fx; +#endif } break; @@ -951,6 +1208,10 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_im = rot_vec_ana_im_L16; hs->rot_vec_syn_re = rot_vec_syn_re_L16; hs->rot_vec_syn_im = rot_vec_syn_im_L16; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L16_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L16_fx; +#endif if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) { hs->p_filter_flt = CLDFB80_16_flt; @@ -961,6 +1222,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = NULL; hs->rot_vec_syn_delay_re = NULL; hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = NULL; + hs->rot_vec_ana_delay_im_fx = NULL; + hs->p_filter_sf = (Word16)17051; + hs->p_filter = CLDFB80_16_fx; +#endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) { @@ -972,6 +1239,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; + hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; + hs->p_filter_sf = (Word16)15388; + hs->p_filter = LDQMF_16_fx; +#endif } break; @@ -980,6 +1253,10 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_im = rot_vec_ana_im_L20; hs->rot_vec_syn_re = rot_vec_syn_re_L20; hs->rot_vec_syn_im = rot_vec_syn_im_L20; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L20_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L20_fx; +#endif if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) { hs->p_filter_flt = CLDFB80_20_flt; @@ -990,6 +1267,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = NULL; hs->rot_vec_syn_delay_re = NULL; hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = NULL; + hs->rot_vec_ana_delay_im_fx = NULL; + hs->p_filter_sf = (Word16)17050; + hs->p_filter = CLDFB80_20_fx; +#endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) { @@ -1001,6 +1284,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; + hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; + hs->p_filter_sf = (Word16)15390; + hs->p_filter = LDQMF_20_fx; +#endif } break; @@ -1009,6 +1298,10 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_im = rot_vec_ana_im_L30; hs->rot_vec_syn_re = rot_vec_syn_re_L30; hs->rot_vec_syn_im = rot_vec_syn_im_L30; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L30_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L30_fx; +#endif if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) { hs->p_filter_flt = CLDFB80_30_flt; @@ -1019,6 +1312,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = NULL; hs->rot_vec_syn_delay_re = NULL; hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = NULL; + hs->rot_vec_ana_delay_im_fx = NULL; + hs->p_filter_sf = (Word16)17051; + hs->p_filter = CLDFB80_30_fx; +#endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) { @@ -1030,6 +1329,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; + hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; + hs->p_filter_sf = (Word16)15388; + hs->p_filter = LDQMF_30_fx; +#endif } break; @@ -1038,6 +1343,10 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_im = rot_vec_ana_im_L32; hs->rot_vec_syn_re = rot_vec_syn_re_L32; hs->rot_vec_syn_im = rot_vec_syn_im_L32; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L32_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L32_fx; +#endif if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) { hs->p_filter_flt = CLDFB80_32_flt; @@ -1048,6 +1357,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = NULL; hs->rot_vec_syn_delay_re = NULL; hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = NULL; + hs->rot_vec_ana_delay_im_fx = NULL; + hs->p_filter_sf = (Word16)17050; + hs->p_filter = CLDFB80_32_fx; +#endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) { @@ -1059,6 +1374,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; + hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; + hs->p_filter_sf = (Word16)15392; + hs->p_filter = LDQMF_32_fx; +#endif } break; @@ -1067,6 +1388,10 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_im = rot_vec_ana_im_L40; hs->rot_vec_syn_re = rot_vec_syn_re_L40; hs->rot_vec_syn_im = rot_vec_syn_im_L40; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L40_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L40_fx; +#endif if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) { hs->p_filter_flt = CLDFB80_40_flt; @@ -1077,6 +1402,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = NULL; hs->rot_vec_syn_delay_re = NULL; hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = NULL; + hs->rot_vec_ana_delay_im_fx = NULL; + hs->p_filter_sf = (Word16)17051; + hs->p_filter = CLDFB80_40_fx; +#endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) { @@ -1088,6 +1419,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; + hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; + hs->p_filter_sf = (Word16)15391; + hs->p_filter = LDQMF_40_fx; +#endif } break; @@ -1096,6 +1433,10 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_im = rot_vec_ana_im_L60; hs->rot_vec_syn_re = rot_vec_syn_re_L60; hs->rot_vec_syn_im = rot_vec_syn_im_L60; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_re_fx = rot_vec_ana_re_L60_fx; + hs->rot_vec_ana_im_fx = rot_vec_ana_im_L60_fx; +#endif if ( hs->prototype == CLDFB_PROTOTYPE_1_25MS ) { hs->p_filter_flt = CLDFB80_60_flt; @@ -1106,6 +1447,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = NULL; hs->rot_vec_syn_delay_re = NULL; hs->rot_vec_syn_delay_im = NULL; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = NULL; + hs->rot_vec_ana_delay_im_fx = NULL; + hs->p_filter_sf = (Word16)17051; + hs->p_filter = CLDFB80_60_fx; +#endif } else if ( hs->prototype == CLDFB_PROTOTYPE_5_00MS ) { @@ -1117,6 +1464,12 @@ static void cldfb_init_proto_and_twiddles( hs->rot_vec_ana_delay_im = rot_vec_delay_im_LDQMF; hs->rot_vec_syn_delay_re = rot_vec_delay_re_LDQMF; hs->rot_vec_syn_delay_im = rot_vec_delay_im_LDQMF; +#ifdef IVAS_FLOAT_FIXED + hs->rot_vec_ana_delay_re_fx = rot_vec_delay_re_LDQMF_fx; + hs->rot_vec_ana_delay_im_fx = rot_vec_delay_im_LDQMF_fx; + hs->p_filter_sf = (Word16)15391; + hs->p_filter = LDQMF_60_fx; +#endif } break; } @@ -1236,6 +1589,7 @@ void cldfb_reset_memory_ivas( return; } +#ifdef IVAS_FLOAT_FIXED void cldfb_reset_memory_fx( HANDLE_CLDFB_FILTER_BANK hs /* i/o: filter bank handle */, Word16* memory_length @@ -1253,7 +1607,8 @@ void cldfb_reset_memory_fx( } /* save the memory */ - set16_fx(hs->cldfb_state_fx, 0, *memory_length); + set32_fx(hs->cldfb_state_fx, 0, *memory_length); return; -} \ No newline at end of file +} +#endif diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index e36b7432f..15c95e49f 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -809,12 +809,30 @@ void ivas_jbm_dec_get_adapted_linear_interpolator( float *interpolator /* o : the interpolator */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_jbm_dec_get_adapted_subframes( + const Word16 nCldfbTs, /* i : number of time slots in the current frame */ + Word16 *subframe_nbslots, /* i/o: subframe grid */ + Word16 *nb_subframes /* i/o: number of subframes in the frame */ +); +#else void ivas_jbm_dec_get_adapted_subframes( const int16_t nCldfbTs, /* i : number of time slots in the current frame */ int16_t *subframe_nbslots, /* i/o: subframe grid */ int16_t *nb_subframes /* i/o: number of subframes in the frame */ ); +#endif +#ifdef IVAS_FLOAT_FIXED +void ivas_jbm_dec_get_md_map( + const Word16 default_len, /* i : default frame length in metadata slots */ + const Word16 len, /* i : length of the modfied frames in metadata slots */ + const Word16 subframe_len, /* i : default length of a subframe */ + const Word16 offset, /* i : current read offset into the md buffer */ + const Word16 buf_len, /* i : length of the metadata buffer */ + Word16 *map /* o : metadata index map */ +); +#else void ivas_jbm_dec_get_md_map( const int16_t default_len, /* i : default frame length in metadata slots */ const int16_t len, /* i : length of the modfied frames in metadata slots */ @@ -823,6 +841,7 @@ void ivas_jbm_dec_get_md_map( const int16_t buf_len, /* i : length of the metadata buffer */ int16_t *map /* o : metadata index map */ ); +#endif int16_t ivas_jbm_dec_get_num_tc_channels( Decoder_Struct *st_ivas /* i : IVAS decoder handle */ @@ -834,6 +853,15 @@ void ivas_jbm_dec_copy_tc_no_tsm( const int16_t output_frame /* i : output frame size */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_jbm_dec_get_md_map_even_spacing( + const Word16 len, /* i : length of the modfied frames in metadata slots */ + const Word16 subframe_len, /* i : default length of a subframe */ + const Word16 offset, /* i : current read offset into the md buffer */ + const Word16 buf_len, /* i : length of the metadata buffer */ + Word16 *map /* o : metadata index map */ +); +#else void ivas_jbm_dec_get_md_map_even_spacing( const int16_t len, /* i : length of the modfied frames in metadata slots */ const int16_t subframe_len, /* i : default length of a subframe */ @@ -841,6 +869,7 @@ void ivas_jbm_dec_get_md_map_even_spacing( const int16_t buf_len, /* i : length of the metadata buffer */ int16_t *map /* o : metadata index map */ ); +#endif TC_BUFFER_MODE ivas_jbm_dec_get_tc_buffer_mode( Decoder_Struct *st_ivas /* i : IVAS decoder handle */ @@ -3518,10 +3547,17 @@ int16_t ivas_sba_get_nchan( ); /*! r: number of ambisonics metadata channels */ +#ifdef IVAS_FLOAT_FIXED +Word16 ivas_sba_get_nchan_metadata( + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ +); +#else int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate /* i : IVAS total bitrate */ ); +#endif void ivas_sba_get_spar_hoa_ch_ind( const int16_t num_md_chs, /* i : number of MD channels */ @@ -3690,10 +3726,17 @@ void generate_masking_noise_lb_dirac( const int16_t cna_flag /* i : CNA flag for LB and HB */ ); +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_dec_set_md_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 nCldfbTs /* i : number of CLDFB time slots */ +); +#else void ivas_dirac_dec_set_md_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nCldfbTs /* i : number of CLDFB time slots */ ); +#endif void ivas_dirac_dec_render( Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ @@ -4475,11 +4518,19 @@ void ivas_get_spar_md_from_dirac( ); /*! r: number of MD subframes */ +#ifdef IVAS_FLOAT_FIXED +Word16 ivas_get_spar_dec_md_num_subframes( + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word32 ivas_last_active_brate /* i : IVAS last active bitrate */ +); +#else int16_t ivas_get_spar_dec_md_num_subframes( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ const int32_t ivas_last_active_brate /* i : IVAS last active bitrate */ ); +#endif ivas_error ivas_spar_md_dec_matrix_open( ivas_spar_md_dec_state_t *hMdDec, /* i/o: SPAR MD decoder handle */ diff --git a/lib_com/ivas_sba_config.c b/lib_com/ivas_sba_config.c index fd1bb70fd..ddf8fc6ad 100644 --- a/lib_com/ivas_sba_config.c +++ b/lib_com/ivas_sba_config.c @@ -206,6 +206,35 @@ int16_t ivas_sba_get_nchan( *-------------------------------------------------------------------*/ /*! r: number of ambisonics metadata channels */ +#ifdef IVAS_FLOAT_FIXED +Word16 ivas_sba_get_nchan_metadata( + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word32 ivas_total_brate /* i : IVAS total bitrate */ +) +{ + Word16 nb_channels; + + IF ( sba_order == SBA_FOA_ORDER ) + { + nb_channels = FOA_CHANNELS; + } + ELSE + { + IF ( ivas_total_brate >= IVAS_512k ) + { + nb_channels = IVAS_SPAR_MAX_CH; + nb_channels = min( nb_channels, ( sba_order + 1 ) * ( sba_order + 1 ) ); + } + ELSE + { + /* FOA + planar HOA */ + nb_channels = FOA_CHANNELS + 2 * ( sba_order - 1 ); + } + } + + return ( nb_channels ); +} +#else int16_t ivas_sba_get_nchan_metadata( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate /* i : IVAS total bitrate */ @@ -233,6 +262,7 @@ int16_t ivas_sba_get_nchan_metadata( return ( nb_channels ); } +#endif /*-------------------------------------------------------------------* diff --git a/lib_com/prot.h b/lib_com/prot.h index 01a76d256..cb2498379 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -458,6 +458,15 @@ void delay_signal_float( const int16_t delay /* i : delay in samples */ ); +#ifdef IVAS_FLOAT_FIXED +void delay_signal_fx( + Word32 x[], /* i/o: signal to be delayed */ + const int16_t len, /* i : length of the input signal */ + Word32 mem[], /* i/o: synchronization memory */ + const int16_t delay /* i : delay in samples */ +); +#endif + ivas_error push_indice( BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ int16_t id, /* i : ID of the indice */ diff --git a/lib_com/prot_fx2.h b/lib_com/prot_fx2.h index 3b0ad6485..5b00e8f4f 100644 --- a/lib_com/prot_fx2.h +++ b/lib_com/prot_fx2.h @@ -7872,4 +7872,12 @@ void v_add_fx( Word32 y[], /* o : Output vector that contains vector 1 + vector 2 */ const int16_t N /* i : Vector length */ ); + +void cldfbAnalysis_ts_fx( + const Word32 *timeIn_fx, /* i : time buffer */ // q = 31 + Word32 realBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : real value buffer */ // q = 29 + Word32 imagBuffer_fx[CLDFB_NO_CHANNELS_MAX], /* o : imag value buffer */ // q = 29 + const Word16 samplesToProcess, /* i : samples to process */ + HANDLE_CLDFB_FILTER_BANK h_cldfb +); #endif \ No newline at end of file diff --git a/lib_com/rom_com.c b/lib_com/rom_com.c index 9e867840b..50f955071 100644 --- a/lib_com/rom_com.c +++ b/lib_com/rom_com.c @@ -8883,6 +8883,336 @@ const float LDQMF_60[] = { -0.0025271603f, -0.0020749648f, -0.0016621647f, -0.0012705614f, -0.0008115423f }; +#ifdef IVAS_FLOAT_FIXED +/* SNR: 109.44, PHASE: 3.500000000000000 */ +const Word16 CLDFB80_10_fx[100] = // q = 15 sf = 17036 qsf = 14 +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7, -2, 0, 0, 0, -1, 0, 0, 0, -8, -31, + -4, 0, 0, -6, 5, 0, 0, -1, 33, -63, -24, 11, 49, 54, 49, 69, 89, 95, 52, -44, -50, 24, 80, 71, 8, + -103, -205, -300, -429, 587, 764, 1010, 1347, 1783, 2309, 2880, 3411, 3810, 4001, 3950, 3582, 2797, + 1568, -98, -2200, -4710, -7582, -10752, -14132, 17583, 20974, 24169, 27024, 29400, 31176, 32302, + 32767, 32696, 32027, 30287, 27571, 24530, 21358, 18039, 14649, 11219, 7832, 4369, 1312 +}; + + +/* SNR: 292.49, PHASE: 2.000000000000000 */ +const Word16 CLDFB80_16_fx[160] = // q = 15 sf = 17051 qsf = 14 +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, + -4, -1, -1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, -2, -13, -38, -16, -5, -3, -1, 0, -1, 1, -7, 1, 0, 1, 1, 1, + 10, 52, -67, -48, -23, -3, 22, 47, 56, 36, 50, 57, 70, 87, 93, 95, 80, 40, -34, -61, -46, 0, 45, 78, + 82, 65, 29, -38, -110, -175, -233, -293, -368, -457, 559, 658, 776, 923, 1104, 1322, 1579, 1873, 2203, + 2556, 2913, 3252, 3551, 3787, 3943, 4005, 3975, 3832, 3542, 3087, 2458, 1656, 683, -459, -1772, -3248, + -4875, -6643, -8536, -10537, -12624, -14766, 16922, 19062, 21161, 23180, 25080, 26833, 28403, 29754, + 30863, 31722, 32320, 32657, 32767, 32685, 32379, 31797, 30709, 29137, 27361, 25471, 23533, 21541, 19486, + 17392, 15275, 13136, 10996, 8882, 6757, 4582, 2509, 876, +}; + +/* SNR: 89.77, PHASE: 1.500000000000000 */ +const Word16 CLDFB80_20_fx[200] = // q = 15 sf = 17050 qsf = 14 +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -9, -6, -1, -2, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, -3, -15, -37, -20, -4, -5, -3, -1, 0, 0, + -4, 8, -15, 4, 0, 1, 1, 1, 2, -4, 10, 57, -62, -58, -27, -19, -1, 19, 39, 52, 57, 24, 52, 53, 60, 75, 87, 92, + 96, 88, 69, 33, -29, -56, -59, -34, 4, 41, 72, 87, 78, 64, 37, -18, -75, -131, -181, -228, -275, -328, -394, + -466, 549, 627, 713, 817, 939, 1085, 1253, 1446, 1664, 1904, 2168, 2449, 2736, 3018, 3284, 3524, 3724, 3876, + 3972, 4006, 3982, 3890, 3707, 3424, 3032, 2528, 1914, 1191, 358, -583, -1633, -2789, -4043, -5392, -6827, -8342, + -9927, -11572, -13263, -14983, 16709, 18424, 20121, 21779, 23377, 24898, 26326, 27645, 28834, 29878, 30765, + 31493, 32056, 32450, 32679, 32767, 32733, 32567, 32235, 31727, 30857, 29634, 28272, 26803, 25281, 23730, 22147, + 20522, 18862, 17182, 15489, 13781, 12065, 10360, 8671, 6973, 5237, 3512, 1961, 735, +}; + + +/* SNR: 89.29, PHASE: 0.833333333333333 */ +const Word16 CLDFB80_30_fx[300] = // q = 15 sf = 17051 qsf = 14 +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -7, -4, -2, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, + 0, -1, -1, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, -2, -8, -19, -31, -31, -20, -7, -4, -5, -3, 0, -1, 0, 0, 1, -3, -6, 18, + -23, 5, 3, -3, 0, 1, 2, 0, 1, 2, -1, 0, 11, 33, 61, -57, -63, -54, -33, -24, -16, -4, 11, 23, 36, 49, 54, 56, 54, + 8, 52, 49, 55, 60, 69, 78, 86, 89, 93, 96, 95, 87, 75, 52, 22, -19, -44, -59, -60, -50, -28, -2, 24, 47, 67, 80, + 86, 80, 71, 62, 48, 8, -27, -65, -103, -139, -173, -205, -235, -266, -300, -338, -382, -429, -478, 534, 587, 641, + 698, 763, 836, 917, 1009, 1111, 1223, 1346, 1480, 1626, 1781, 1945, 2122, 2307, 2496, 2688, 2878, 3063, 3241, 3408, + 3560, 3694, 3806, 3896, 3960, 3997, 4003, 3987, 3946, 3866, 3744, 3579, 3366, 3105, 2794, 2434, 2024, 1566, 1060, + 505, -98, -750, -1450, -2198, -2991, -3827, -4706, -5625, -6582, -7575, -8601, -9658, -10742, -11850, -12978, -14119, + -15271, 16422, 17566, 18707, 19838, 20954, 22048, 23114, 24147, 25141, 26094, 26999, 27851, 28644, 29373, 30034, 30626, + 31147, 31596, 31972, 32272, 32496, 32649, 32737, 32767, 32744, 32665, 32521, 32301, 31997, 31636, 31056, 30259, 29415, + 28506, 27545, 26550, 25535, 24507, 23467, 22412, 21338, 20246, 19139, 18023, 16900, 15771, 14635, 13494, 12350, 11209, + 10077, 8952, 7825, 6685, 5527, 4365, 3235, 2198, 1311, 541, +}; + +/* SNR: 85.69, PHASE: 0.750000000000000 */ +const Word16 CLDFB80_32_fx[320] = // q = 15 sf = 17050 qsf = 14 +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -8, -5, -2, -1, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, + -1, -1, 0, 1, 0, 0, -1, 0, 0, 0, 0, 1, -1, -3, -9, -20, -31, -32, -20, -10, -2, -5, -4, -2, 0, 0, 0, 0, 0, -3, -5, 18, -24, 4, + 3, -2, 2, 1, 2, 0, 1, 2, 2, -5, 4, 11, 37, 61, -56, -65, -57, -38, -23, -20, -9, 2, 16, 29, 40, 51, 55, 57, 52, 6, 52, 49, 54, + 59, 65, 74, 84, 88, 91, 94, 96, 93, 85, 71, 50, 21, -18, -43, -57, -61, -54, -36, -13, 12, 35, 55, 73, 84, 85, 79, 69, 62, 50, + 11, -21, -56, -93, -127, -159, -190, -219, -248, -278, -310, -348, -389, -433, -480, 532, 582, 632, 685, 744, 810, 883, 965, + 1056, 1156, 1264, 1383, 1511, 1649, 1796, 1951, 2117, 2290, 2467, 2646, 2825, 3000, 3170, 3332, 3482, 3617, 3735, 3834, 3912, + 3968, 4000, 4003, 3988, 3952, 3881, 3775, 3630, 3445, 3217, 2946, 2631, 2273, 1872, 1429, 943, 413, -157, -771, -1428, -2126, + -2864, -3641, -4455, -5305, -6189, -7106, -8052, -9027, -10028, -11053, -12097, -13156, -14228, -15309, 16387, 17461, 18531, + 19594, 20644, 21677, 22687, 23669, 24620, 25536, 26413, 27246, 28032, 28765, 29440, 30056, 30611, 31104, 31534, 31899, 32198, + 32430, 32598, 32706, 32761, 32767, 32727, 32635, 32483, 32262, 31968, 31629, 31085, 30337, 29554, 28712, 27822, 26897, 25951, + 24992, 24023, 23042, 22047, 21034, 20006, 18967, 17919, 16866, 15808, 14744, 13674, 12601, 11530, 10466, 9409, 8355, 7294, 6217, + 5127, 4042, 2998, 2049, 1236, 515, +}; + +/* SNR: 81.55, PHASE: 0.500000000000000 */ +const Word16 CLDFB80_40_fx[400] = // q = 15 sf = 17051 qsf = 14 +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -10, -9, -6, -4, + -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -2, 0, 0, 0, 1, -1, 0, 0, -1, 0, 0, 0, 0, 0, 2, -1, -2, -5, -12, -22, -29, + -37, -24, -18, -9, -2, -6, -4, -3, -2, 0, -1, 0, 0, 0, 1, -2, -6, -2, 20, -24, 0, 5, 2, -2, 2, 0, 2, 2, 0, 1, 2, 2, 2, -6, 3, 11, + 18, 47, 61, -57, -68, -60, -52, -36, -23, -22, -14, -6, 3, 16, 25, 35, 44, 51, 54, 56, 56, 44, 3, 49, 49, 51, 56, 59, 64, 72, 79, + 86, 88, 90, 93, 96, 96, 92, 86, 77, 59, 45, 17, -14, -38, -50, -60, -61, -55, -42, -25, -5, 15, 33, 49, 65, 77, 85, 85, 81, 75, 67, + 62, 54, 22, -4, -31, -60, -90, -117, -144, -169, -193, -216, -239, -262, -287, -313, -344, -377, -411, -447, -485, 527, 569, 606, + 648, 690, 737, 790, 845, 906, 973, 1046, 1125, 1209, 1299, 1395, 1498, 1607, 1722, 1842, 1966, 2099, 2237, 2378, 2520, 2664, 2807, + 2948, 3086, 3219, 3347, 3467, 3578, 3678, 3766, 3843, 3905, 3953, 3987, 4003, 4001, 3989, 3967, 3921, 3853, 3762, 3646, 3505, 3336, + 3140, 2916, 2665, 2385, 2078, 1744, 1382, 993, 577, 133, -337, -835, -1360, -1913, -2490, -3093, -3720, -4372, -5046, -5743, -6460, + -7198, -7956, -8731, -9524, -10332, -11155, -11990, -12836, -13690, -14550, -15416, 16279, 17137, 17995, 18849, 19698, 20538, 21367, + 22183, 22983, 23764, 24524, 25263, 25977, 26665, 27325, 27953, 28548, 29107, 29629, 30112, 30556, 30960, 31324, 31647, 31929, 32168, + 32365, 32519, 32634, 32711, 32755, 32767, 32750, 32702, 32620, 32498, 32333, 32121, 31865, 31595, 31160, 30560, 29950, 29304, 28623, + 27911, 27175, 26424, 25662, 24894, 24118, 23336, 22544, 21743, 20930, 20108, 19278, 18442, 17602, 16759, 15912, 15062, 14208, 13351, + 12493, 11636, 10783, 9936, 9092, 8249, 7400, 6542, 5673, 4799, 3934, 3099, 2320, 1623, 1018, 436, +}; + + +/* SNR: 85.15, PHASE: 0.166666666666667 */ +const Word16 CLDFB80_60_fx[600] = // q = 15 sf = 17051 qsf = 14 +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, -11, -9, -9, -6, -6, -4, -3, -1, -1, -1, -2, + -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -2, -3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, -1, + -2, -3, -5, -11, -15, -25, -27, -37, -35, -26, -20, -17, -11, -4, -2, -6, -5, -4, -4, -3, -2, 0, -1, -1, 0, 0, 0, 0, 0, 0, -2, -4, -6, + -3, 8, 18, -21, -15, 2, 6, 4, 2, -2, 0, 2, 0, 1, 2, 2, 1, 0, 0, 1, 2, 2, 2, 1, -4, -4, 5, 10, 10, 23, 42, 57, 61, -58, -62, -67, -60, + -58, -49, -39, -27, -23, -23, -19, -13, -7, -1, 5, 15, 19, 26, 34, 39, 46, 50, 52, 55, 56, 57, 56, 48, 24, 2, 43, 52, 49, 50, 53, 56, + 59, 60, 66, 71, 75, 80, 85, 87, 88, 90, 92, 94, 95, 96, 96, 93, 88, 85, 79, 69, 56, 47, 33, 12, -8, -29, -41, -48, -56, -61, -61, -59, + -54, -45, -34, -22, -9, 4, 18, 30, 41, 52, 62, 72, 78, 83, 87, 85, 82, 78, 73, 68, 64, 62, 58, 37, 17, 0, -18, -36, -55, -75, -94, -112, + -131, -148, -165, -181, -197, -212, -228, -243, -258, -275, -291, -309, -328, -349, -371, -394, -417, -441, -466, -492, 520, 549, 575, 599, + 627, 655, 683, 713, 746, 781, 817, 855, 896, 939, 985, 1033, 1085, 1138, 1194, 1253, 1315, 1379, 1446, 1516, 1588, 1663, 1741, 1822, 1904, + 1987, 2076, 2168, 2261, 2354, 2449, 2544, 2640, 2735, 2830, 2925, 3018, 3109, 3198, 3284, 3368, 3448, 3524, 3595, 3662, 3724, 3780, 3831, + 3876, 3914, 3947, 3972, 3991, 4002, 4005, 3999, 3991, 3981, 3960, 3930, 3890, 3839, 3779, 3707, 3624, 3530, 3424, 3306, 3175, 3032, 2877, + 2709, 2528, 2336, 2131, 1914, 1685, 1444, 1191, 926, 648, 358, 56, -257, -583, -920, -1270, -1633, -2007, -2392, -2789, -3196, -3614, -4043, + -4483, -4932, -5392, -5861, -6339, -6827, -7324, -7828, -8341, -8862, -9391, -9926, -10469, -11017, -11572, -12131, -12695, -13262, -13833, + -14406, -14982, -15561, 16136, 16708, 17280, 17853, 18423, 18991, 19557, 20120, 20678, 21230, 21778, 22318, 22851, 23376, 23892, 24400, 24897, + 25384, 25860, 26325, 26778, 27217, 27644, 28055, 28452, 28833, 29197, 29545, 29876, 30189, 30485, 30764, 31024, 31267, 31492, 31698, 31886, + 32055, 32205, 32336, 32448, 32542, 32618, 32678, 32722, 32751, 32766, 32767, 32756, 32731, 32692, 32637, 32565, 32475, 32364, 32233, 32082, + 31911, 31726, 31551, 31261, 30855, 30461, 30055, 29633, 29194, 28739, 28271, 27790, 27300, 26802, 26298, 25790, 25279, 24765, 24249, 23729, + 23205, 22678, 22145, 21608, 21067, 20521, 19971, 19417, 18861, 18303, 17743, 17181, 16618, 16054, 15488, 14920, 14351, 13780, 13208, 12636, + 12064, 11494, 10925, 10359, 9795, 9233, 8671, 8108, 7542, 6972, 6398, 5818, 5236, 4654, 4077, 3512, 2965, 2445, 1961, 1516, 1114, 735, 325, +}; + + +/* 5ms delay prototype */ +const Word16 LDQMF_10_fx[] = // q = 15 sf = 15388 qsf = 14 +{ + 4, 2, -2, -7, -11, -13, -14, -14, -16, -21, -31, -44, -56, -66, -70, -67, -57, -39, -15, 12, -43, -75, -104, -132, -156, -178, -196, -210, + -221, -229, -238, -248, -262, -281, -306, -332, -353, -359, -340, -281, 168, -11, -267, -606, -1030, -1534, -2105, -2724, -3361, -3979, -4533, + -4973, -5242, -5284, -5046, -4480, -3551, -2234, -523, 1572, -4024, -6784, -9789, -12957, -16197, -19406, -22478, -25307, -27793, -29846, -31391, + -32374, -32768, -32565, -31782, -30462, -28663, -26465, -23956, -21234, 18397, 15542, 12766, 10150, 7762, 5656, 3864, 2396, 1242, 371, -221, + -567, -753, -808, -763, -646, -489, -322, -174, -64, +}; + +const Word16 LDQMF_16_fx[] = // q = 15 sf = 15388 qsf = 14 +{ + 4, 3, 1, 0, -3, -7, -9, -12, -13, -14, -14, -14, -14, -16, -19, -23, -29, -37, -45, -53, -60, -65, -69, -70, -68, -64, -56, -45, -32, -16, 0, 18, + -38, -57, -76, -95, -113, -130, -146, -161, -174, -186, -197, -206, -214, -220, -226, -231, -236, -242, -248, -257, -267, -280, -295, -311, -327, + -342, -353, -359, -357, -342, -312, -264, 194, 98, -24, -178, -364, -583, -835, -1119, -1434, -1777, -2143, -2527, -2922, -3321, -3714, -4089, + -4437, -4743, -4995, -5179, -5282, -5289, -5188, -4966, -4613, -4120, -3480, -2688, -1742, -641, 610, 2006, -3539, -5197, -6965, -8828, -10765, + -12756, -14777, -16804, -18811, -20773, -22663, -24455, -26125, -27649, -29006, -30177, -31143, -31892, -32415, -32708, -32768, -32594, -32193, + -31574, -30747, -29729, -28536, -27189, -25709, -24120, -22444, -20707, 18934, 17143, 15365, 13619, 11927, 10307, 8775, 7345, 6028, 4832, 3762, + 2820, 2002, 1305, 720, 235, -135, -394, -583, -710, -783, -808, -793, -746, -672, -581, -479, -374, -273, -182, -107, -49, +}; + +const Word16 LDQMF_20_fx[] = // q = 15 sf = 15390 qsf = 14 +{ + 4, 4, 3, 1, -1, -3, -6, -8, -10, -12, -13, -13, -14, -14, -14, -14, -15, -17, -20, -23, -28, -34, -41, -47, -53, -59, -64, -67, -70, -70, -69, -65, + -60, -53, -44, -33, -21, -8, 5, 20, -36, -51, -67, -82, -97, -111, -125, -138, -150, -162, -173, -182, -191, -199, -207, -213, -218, -223, -227, + -231, -235, -240, -245, -251, -258, -266, -276, -287, -299, -312, -325, -338, -348, -356, -360, -357, -348, -329, -300, -258, 202, 130, 40, -67, + -195, -344, -513, -704, -916, -1149, -1401, -1671, -1957, -2256, -2566, -2882, -3201, -3518, -3828, -4125, -4403, -4655, -4876, -5057, -5193, -5275, + -5297, -5252, -5134, -4936, -4654, -4283, -3818, -3258, -2600, -1843, -987, -34, 1014, 2153, -3380, -4687, -6068, -7514, -9017, -10567, -12153, -13762, + -15383, -17003, -18609, -20188, -21726, -23209, -24625, -25961, -27205, -28346, -29373, -30279, -31052, -31686, -32178, -32523, -32720, -32768, -32666, + -32417, -32026, -31496, -30835, -30049, -29149, -28143, -27043, -25859, -24603, -23288, -21925, -20528, 19110, 17678, 16249, 14835, 13446, 12092, 10783, + 9528, 8333, 7207, 6153, 5177, 4281, 3466, 2732, 2078, 1502, 999, 565, 191, -105, -324, -497, -627, -719, -777, -805, -805, -782, -739, -680, -609, -530, + -447, -363, -283, -208, -142, -88, -44, +}; + +const Word16 LDQMF_30_fx[] = // q = 15 sf = 15388 qsf = 14 +{ + 3, 4, 4, 3, 2, 0, 0, -2, -4, -5, -7, -8, -10, -11, -12, -13, -13, -13, -14, -14, -14, -14, -14, -14, -15, -16, -17, -19, -21, -24, -27, -31, -35, -40, + -44, -48, -52, -56, -60, -63, -66, -68, -69, -70, -70, -69, -67, -65, -61, -57, -51, -45, -39, -31, -23, -15, -6, 3, 12, 22, -33, -43, -54, -64, -75, + -85, -95, -104, -114, -123, -132, -140, -148, -156, -164, -171, -178, -184, -190, -196, -201, -205, -210, -214, -217, -221, -224, -227, -229, -232, -235, + -238, -241, -244, -248, -252, -257, -262, -268, -274, -281, -289, -297, -306, -314, -323, -332, -339, -347, -353, -357, -359, -359, -356, -350, -340, -325, + -306, -281, -250, 212, 168, 116, 56, -11, -87, -172, -267, -370, -484, -606, -738, -880, -1030, -1190, -1358, -1534, -1718, -1908, -2105, -2307, -2514, + -2724, -2936, -3149, -3361, -3571, -3778, -3979, -4173, -4359, -4533, -4695, -4842, -4973, -5084, -5175, -5242, -5284, -5298, -5284, -5238, -5159, -5046, + -4896, -4708, -4480, -4212, -3903, -3551, -3156, -2717, -2234, -1707, -1137, -523, 133, 832, 1572, 2352, -3170, -4024, -4913, -5833, -6784, -7762, -8765, + -9789, -10831, -11888, -12957, -14034, -15115, -16197, -17275, -18346, -19406, -20451, -21476, -22478, -23453, -24398, -25307, -26179, -27008, -27793, + -28529, -29215, -29846, -30422, -30938, -31391, -31783, -32111, -32374, -32571, -32703, -32768, -32766, -32698, -32565, -32367, -32105, -31782, -31399, + -30958, -30462, -29912, -29311, -28663, -27971, -27237, -26465, -25658, -24821, -23956, -23067, -22159, -21234, -20296, 19352, 18397, 17442, 16489, 15542, + 14603, 13677, 12766, 11872, 10999, 10150, 9326, 8529, 7762, 7027, 6324, 5656, 5023, 4425, 3864, 3338, 2849, 2396, 1977, 1593, 1242, 922, 633, 371, 134, -63, + -221, -356, -471, -567, -645, -707, -753, -784, -802, -808, -803, -788, -763, -730, -691, -646, -597, -544, -489, -433, -377, -322, -270, -220, -174, -132, + -96, -64, -36, +}; + +const Word16 LDQMF_32_fx[] = // q = 15 sf = 15392 qsf = 14 +{ + 3, 4, 4, 3, 2, 1, 0, -1, -3, -4, -6, -7, -9, -10, -11, -12, -13, -13, -13, -14, -14, -14, -14, -14, -14, -15, -15, -16, -18, -19, -22, -24, -27, -31, -35, + -39, -43, -47, -51, -54, -58, -61, -64, -66, -68, -70, -70, -70, -69, -67, -65, -62, -58, -53, -48, -42, -35, -28, -20, -12, -4, 4, 13, 22, -33, -42, -52, + -62, -72, -81, -91, -100, -109, -117, -126, -134, -142, -150, -157, -164, -171, -177, -183, -189, -194, -199, -204, -208, -212, -215, -219, -222, -224, + -227, -230, -232, -235, -237, -240, -243, -246, -250, -254, -259, -264, -270, -277, -283, -291, -298, -306, -315, -323, -331, -338, -345, -351, -356, -359, + -360, -358, -354, -347, -336, -321, -302, -278, -248, 213, 172, 125, 70, 8, -60, -137, -221, -314, -415, -525, -642, -768, -902, -1045, -1195, -1352, -1517, + -1688, -1866, -2049, -2237, -2429, -2625, -2822, -3021, -3221, -3419, -3616, -3809, -3997, -4178, -4352, -4516, -4670, -4811, -4937, -5047, -5139, -5212, -5263, + -5292, -5296, -5273, -5223, -5143, -5032, -4889, -4713, -4502, -4256, -3973, -3653, -3296, -2900, -2465, -1992, -1481, -930, -342, 283, 945, 1644, 2377, -3143, + -3942, -4771, -5628, -6512, -7421, -8353, -9304, -10273, -11256, -12252, -13256, -14267, -15281, -16294, -17305, -18309, -19303, -20284, -21249, -22194, -23116, + -24013, -24880, -25715, -26515, -27277, -27999, -28677, -29310, -29896, -30432, -30916, -31344, -31718, -32037, -32299, -32503, -32650, -32738, -32768, -32739, + -32652, -32508, -32308, -32052, -31742, -31379, -30966, -30504, -29994, -29440, -28844, -28207, -27533, -26825, -26085, -25316, -24521, -23703, -22865, -22010, + -21141, -20262, 19377, 18482, 17587, 16693, 15804, 14921, 14049, 13188, 12342, 11512, 10702, 9913, 9147, 8405, 7690, 7003, 6344, 5716, 5118, 4552, 4017, 3514, + 3043, 2603, 2195, 1817, 1468, 1149, 856, 590, 348, 127, -58, -207, -337, -448, -542, -620, -683, -733, -769, -793, -806, -808, -800, -784, -760, -729, -692, -651, + -605, -556, -505, -452, -400, -348, -297, -249, -203, -162, -124, -91, -62, -35, +}; + +const Word16 LDQMF_40_fx[] = // q = 15 sf = 15391 qsf = 14 +{ + 3, 4, 4, 4, 3, 2, 1, 0, 0, -1, -2, -4, -5, -6, -7, -9, -10, -11, -11, -12, -13, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, -14, -15, -16, -16, -18, -19, -20, + -22, -24, -27, -30, -33, -36, -39, -42, -46, -49, -52, -55, -58, -60, -63, -65, -67, -68, -69, -70, -70, -70, -69, -68, -66, -64, -61, -58, -55, -51, -46, -41, -36, + -30, -24, -18, -11, -5, 1, 9, 16, 23, -32, -39, -47, -55, -63, -71, -78, -86, -93, -101, -108, -115, -122, -128, -135, -141, -147, -153, -159, -165, -170, -175, -180, + -185, -189, -193, -197, -201, -205, -208, -211, -214, -217, -219, -222, -224, -226, -228, -230, -232, -234, -236, -239, -241, -243, -246, -249, -252, -256, -260, -264, + -268, -273, -279, -284, -290, -296, -302, -309, -315, -322, -328, -335, -340, -346, -350, -354, -357, -359, -360, -358, -356, -351, -344, -335, -323, -308, -291, -270, + -245, 217, 185, 149, 109, 64, 15, -38, -97, -161, -230, -304, -384, -469, -559, -655, -755, -861, -973, -1089, -1210, -1336, -1467, -1602, -1741, -1884, -2030, -2180, + -2333, -2487, -2644, -2802, -2962, -3121, -3281, -3439, -3596, -3751, -3903, -4052, -4196, -4335, -4468, -4595, -4714, -4824, -4925, -5016, -5096, -5163, -5218, -5259, + -5286, -5297, -5292, -5269, -5229, -5170, -5091, -4993, -4873, -4732, -4569, -4384, -4175, -3943, -3687, -3407, -3103, -2774, -2420, -2041, -1638, -1210, -758, -281, + 218, 743, 1290, 1860, 2452, -3065, -3699, -4352, -5025, -5715, -6423, -7146, -7884, -8636, -9400, -10175, -10960, -11753, -12552, -13357, -14166, -14976, -15788, -16598, + -17406, -18209, -19006, -19795, -20575, -21344, -22101, -22842, -23568, -24276, -24965, -25633, -26279, -26901, -27498, -28069, -28612, -29126, -29610, -30062, -30483, + -30870, -31222, -31539, -31820, -32066, -32276, -32448, -32584, -32683, -32744, -32768, -32754, -32703, -32615, -32491, -32330, -32135, -31904, -31639, -31341, -31010, + -30648, -30255, -29833, -29383, -28905, -28402, -27875, -27325, -26753, -26160, -25550, -24921, -24278, -23620, -22950, -22268, -21577, -20879, -20174, 19467, 18751, + 18035, 17319, 16604, 15892, 15185, 14484, 13789, 13103, 12426, 11759, 11105, 10463, 9835, 9222, 8625, 8045, 7481, 6936, 6409, 5901, 5413, 4945, 4497, 4069, 3662, 3275, + 2908, 2561, 2234, 1927, 1639, 1370, 1118, 884, 667, 466, 279, 107, -41, -164, -274, -372, -458, -533, -598, -654, -700, -737, -766, -787, -801, -807, -807, -801, -790, + -773, -751, -726, -696, -664, -628, -590, -551, -510, -468, -426, -384, -343, -302, -263, -226, -191, -158, -127, -100, -76, -54, -32, +}; + +const Word16 LDQMF_60_fx[] = // q = 15 sf = 15391 qsf = 14 +{ + 3, 4, 4, 4, 4, 3, 3, 3, 2, 1, 1, 0, 0, -1, -1, -2, -3, -4, -5, -6, -6, -7, -8, -9, -9, -10, -11, -11, -12, -12, -12, -13, -13, -13, -13, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -15, -15, -16, -16, -17, -18, -19, -20, -21, -22, -23, -25, -26, -28, -30, -32, -34, -36, -39, -41, -43, -45, -47, -49, -51, -53, -55, -57, -59, + -61, -62, -64, -65, -66, -67, -68, -69, -70, -70, -70, -70, -70, -69, -69, -68, -67, -65, -64, -62, -60, -58, -55, -53, -50, -47, -44, -40, -37, -33, -29, -25, -21, -17, -13, + -8, -3, 0, 5, 10, 15, 20, 25, -30, -36, -41, -46, -51, -57, -62, -67, -72, -77, -82, -87, -92, -97, -102, -107, -111, -116, -121, -125, -129, -134, -138, -142, -146, -150, + -154, -158, -162, -166, -169, -173, -176, -179, -182, -186, -189, -191, -194, -197, -199, -202, -204, -207, -209, -211, -213, -215, -216, -218, -220, -221, -223, -224, -226, + -227, -229, -230, -231, -233, -234, -235, -237, -238, -240, -241, -243, -245, -247, -249, -251, -253, -255, -258, -260, -263, -266, -269, -273, -276, -280, -283, -287, -291, + -295, -299, -304, -308, -312, -317, -321, -325, -329, -334, -337, -341, -345, -348, -351, -354, -356, -358, -359, -360, -359, -359, -357, -355, -352, -348, -343, -337, -329, + -321, -311, -300, -287, -273, -258, -241, 222, 202, 180, 156, 130, 102, 72, 40, 6, -29, -67, -107, -150, -195, -242, -292, -344, -398, -454, -513, -575, -638, -704, -773, -843, + -916, -992, -1069, -1149, -1231, -1315, -1401, -1489, -1579, -1671, -1765, -1860, -1957, -2055, -2155, -2256, -2358, -2462, -2566, -2671, -2776, -2882, -2988, -3095, -3201, + -3307, -3413, -3518, -3622, -3726, -3828, -3929, -4028, -4125, -4220, -4313, -4403, -4490, -4574, -4655, -4733, -4806, -4876, -4941, -5002, -5057, -5108, -5153, -5193, -5226, + -5254, -5275, -5289, -5297, -5297, -5289, -5275, -5252, -5221, -5181, -5133, -5077, -5011, -4936, -4851, -4757, -4654, -4540, -4416, -4283, -4138, -3984, -3818, -3642, -3456, + -3258, -3050, -2830, -2600, -2359, -2106, -1843, -1569, -1283, -987, -680, -362, -34, 304, 654, 1013, 1383, 1763, 2153, 2553, -2962, -3380, -3807, -4242, -4687, -5139, -5599, + -6067, -6543, -7025, -7514, -8009, -8510, -9017, -9529, -10046, -10567, -11092, -11620, -12152, -12687, -13223, -13762, -14301, -14842, -15383, -15924, -16464, -17003, -17541, + -18076, -18609, -19139, -19665, -20187, -20705, -21218, -21725, -22226, -22721, -23208, -23688, -24160, -24624, -25079, -25524, -25960, -26386, -26800, -27204, -27596, -27977, + -28345, -28701, -29043, -29373, -29688, -29990, -30278, -30552, -30810, -31052, -31278, -31489, -31685, -31865, -32029, -32177, -32308, -32424, -32522, -32605, -32670, -32719, + -32752, -32768, -32767, -32749, -32715, -32665, -32598, -32515, -32416, -32302, -32171, -32025, -31863, -31687, -31495, -31289, -31068, -30834, -30585, -30324, -30049, -29761, + -29461, -29148, -28824, -28489, -28143, -27786, -27419, -27042, -26656, -26262, -25858, -25447, -25028, -24603, -24170, -23732, -23287, -22838, -22383, -21925, -21462, -20997, + -20528, -20057, 19586, 19110, 18633, 18155, 17677, 17200, 16724, 16248, 15775, 15303, 14834, 14368, 13905, 13445, 12990, 12538, 12092, 11650, 11214, 10783, 10358, 9939, 9527, + 9122, 8724, 8333, 7950, 7574, 7207, 6847, 6496, 6153, 5819, 5493, 5177, 4869, 4570, 4281, 4000, 3728, 3466, 3212, 2968, 2732, 2505, 2287, 2078, 1878, 1686, 1502, 1326, 1159, + 999, 847, 702, 565, 434, 310, 191, 80, -19, -105, -183, -257, -324, -387, -444, -497, -545, -588, -627, -662, -693, -719, -742, -762, -777, -790, -799, -805, -808, -808, -805, + -800, -792, -782, -770, -755, -739, -721, -701, -680, -658, -634, -609, -584, -557, -530, -503, -475, -447, -419, -391, -363, -336, -309, -283, -257, -232, -208, -185, -163, + -142, -123, -104, -88, -72, -57, -44, -28, +}; + +const Word32 rot_vec_delay_re_LDQMF_fx[60] = // q = 31 +{ + -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, + 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, + -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, + 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, + -1518500224, 1518500224, 1518500224, -1518500224 +}; + +const Word32 rot_vec_delay_im_LDQMF_fx[60] = // q = 31 +{ + -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, + 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, + -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, + 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, -1518500224, -1518500224, 1518500224, 1518500224, + -1518500224, -1518500224, 1518500224, 1518500224 +}; + +const Word32 rot_vec_ana_re_L10_fx[5] = // q = 29 +{ + 1517329536, 1424643840, 1192503936, 843633536, 412182400 +}; + +const Word32 rot_vec_ana_im_L10_fx[5] = // q = 29 +{ + -59616040, -525578848, -940094336, -1262586752, -1461488512 +}; + +const Word32 rot_vec_ana_re_L16_fx[8] = // q = 29 +{ + 1200118272, 1171310720, 1097490432, 981494080, 827779520, 642253888, 432046752, 205236304 +}; + +const Word32 rot_vec_ana_im_L16_fx[8] = // q = 29 +{ + -29461250, -263026624, -486484032, -691246144, -869444032, -1014229696, -1120039040, -1182806016 +}; + +const Word32 rot_vec_ana_re_L20_fx[10] = // q = 29 +{ + 1073534848, 1057019968, 1014477760, 946955776, 856116544, 744196864, 613952640, 468590848, 311690784, 147115888 +}; + +const Word32 rot_vec_ana_im_L20_fx[10] = // q = 29 +{ + -21081516, -188759824, -351790240, -506158400, -648063232, -774010624, -880899328, -966097344, -1027506880, -1063615744 +}; + +const Word32 rot_vec_ana_re_L30_fx[15] = // q = 29 +{ + 876631424, 870629568, 855088960, 830179840, 796175040, 753447232, 702464448, 643785344, 578052800, 505986944, 428377440, 346074528, 259979936, 171036960, 80220064 +}; + +const Word32 rot_vec_ana_im_L30_fx[15] = // q = 29 +{ + -11475734, -103045800, -193486880, -281808064, -367041728, -448253984, -524555072, -595109056, -659142848, -715955008, -764922944, -805510272, -837272192, -859860864, -873028672 +}; + +const Word32 rot_vec_ana_re_L32_fx[16] = // q = 29 +{ + 848803520, 843695296, 830461760, 809230464, 780205824, 743667392, 699967040, 649525568, 592828864, 530422880, 462908640, 390936320, 315199072, 236426304, 155376608, 72830544 +}; + +const Word32 rot_vec_ana_im_L32_fx[16] = // q = 29 +{ + -10416909, -93564040, -175810112, -256363024, -334447008, -409310112, -480231328, -546527616, -607560576, -662742400, -711541696, -753488384, -788178560, -815278208, -834526272, -845737344 +}; + +const Word32 rot_vec_ana_re_L40_fx[20] = // q = 29 +{ + 759213504, 756288320, 748700352, 736496320, 719751616, 698569408, 673080256, 643441344, 609835392, 572469632, 531574400, 487401824, 440224256, 390332576, 338034336, + 283652032, 227520896, 169987024, 111405128, 52136384 +}; + +const Word32 rot_vec_ana_im_L40_fx[20] = // q = 29 +{ + -7453801, -66998032, -126129192, -184482736, -241698864, -297424864, -351317120, -403043392, -452284768, -498737664, -542115648, -582151360, -618597888, -651230528, + -679848192, -704274304, -724358336, -739976448, -751032384, -757457984 +}; + +const Word32 rot_vec_ana_re_L60_fx[30] = // q = 29 +{ + 619911872, 618849920, 616091776, 611644992, 605521728, 597738752, 588317440, 577283520, 564667392, 550503488, 534830720, 517692032, 499134368, 479208608, 457969376, 435474880, 411786784, + 386970016, 361092576, 334225408, 306442144, 277818944, 248434272, 218368656, 187704512, 156525872, 124918216, 92968160, 60763288, 28391868 +}; + +const Word32 rot_vec_ana_im_L60_fx[30] = // q = 29 +{ + -4057371, -36495492, -68833576, -100983000, -132855632, -164364112, -195422080, -225944416, -255847456, -285049248, -313469728, -341030976, -367657536, -393276352, -417817216, -441212864, + -463399200, -484315392, -503904096, -522111616, -538888128, -554187520, -567967936, -580191616, -590825024, -599838976, -607208896, -612914432, -616940032, -619274624 +}; +#endif + const float rot_vec_delay_re_LDQMF[60] = { -0.7071067812f,0.7071067812f,0.7071067812f,-0.7071067812f,-0.7071067812f, @@ -39450,4 +39780,4 @@ const Word16 T_DIV_L_Frame[] = /*0Q15 * 2^-7 */ ,8738 /*480*/ ,8192 /*512*/ ,6553 /*640*/ -}; \ No newline at end of file +}; diff --git a/lib_com/rom_com_fx.h b/lib_com/rom_com_fx.h index 62fd8d250..3d8e791bd 100644 --- a/lib_com/rom_com_fx.h +++ b/lib_com/rom_com_fx.h @@ -67,4 +67,40 @@ extern const Word16 sin_twiddle_table_25_5_5[ 25 ]; extern const Word16 cos_twiddle_table_16_8_2[ 16 ]; extern const Word16 sin_twiddle_table_16_8_2[ 16 ]; + +extern const Word16 CLDFB80_10_fx[100]; +extern const Word16 CLDFB80_16_fx[160]; +extern const Word16 CLDFB80_20_fx[200]; +extern const Word16 CLDFB80_30_fx[300]; +extern const Word16 CLDFB80_32_fx[320]; +extern const Word16 CLDFB80_40_fx[400]; +extern const Word16 CLDFB80_60_fx[600]; + +/*5ms delay*/ +extern const Word16 LDQMF_10_fx[100]; +extern const Word16 LDQMF_16_fx[160]; +extern const Word16 LDQMF_20_fx[200]; +extern const Word16 LDQMF_30_fx[300]; +extern const Word16 LDQMF_32_fx[320]; +extern const Word16 LDQMF_40_fx[400]; +extern const Word16 LDQMF_60_fx[600]; + +extern const Word32 rot_vec_delay_re_LDQMF_fx[60]; +extern const Word32 rot_vec_delay_im_LDQMF_fx[60]; + +extern const Word32 rot_vec_ana_re_L10_fx[5]; +extern const Word32 rot_vec_ana_im_L10_fx[5]; +extern const Word32 rot_vec_ana_re_L16_fx[8]; +extern const Word32 rot_vec_ana_im_L16_fx[8]; +extern const Word32 rot_vec_ana_re_L20_fx[10]; +extern const Word32 rot_vec_ana_im_L20_fx[10]; +extern const Word32 rot_vec_ana_re_L30_fx[15]; +extern const Word32 rot_vec_ana_im_L30_fx[15]; +extern const Word32 rot_vec_ana_re_L32_fx[16]; +extern const Word32 rot_vec_ana_im_L32_fx[16]; +extern const Word32 rot_vec_ana_re_L40_fx[20]; +extern const Word32 rot_vec_ana_im_L40_fx[20]; +extern const Word32 rot_vec_ana_re_L60_fx[30]; +extern const Word32 rot_vec_ana_im_L60_fx[30]; + #endif diff --git a/lib_com/stat_com.h b/lib_com/stat_com.h index 663001a3a..52241e194 100644 --- a/lib_com/stat_com.h +++ b/lib_com/stat_com.h @@ -678,6 +678,7 @@ typedef struct cldfb_filter_bank_struct const float *p_filter_flt; const Word16 *p_filter; /*!< Pointer to filter coefficients */ + Word16 p_filter_sf; /* rotation vectors */ @@ -691,7 +692,14 @@ typedef struct cldfb_filter_bank_struct const float *rot_vec_ana_delay_im; const float *rot_vec_syn_delay_re; const float *rot_vec_syn_delay_im; + +#ifdef IVAS_FLOAT_FIXED + const Word32 *rot_vec_ana_re_fx; + const Word32 *rot_vec_ana_im_fx; + const Word32 *rot_vec_ana_delay_re_fx; + const Word32 *rot_vec_ana_delay_im_fx; +#endif //Fix variables Word16 *FilterStates; /*!< Pointer to buffer of filter states */ Word16 FilterStates_e[CLDFB_NO_COL_MAX + 9]; /*!< Filter states time slot exponents */ @@ -701,11 +709,11 @@ typedef struct cldfb_filter_bank_struct const Word16 *iRotVctr; Word16 filterScale; /*!< filter scale */ - Word16 synGain; /*!< gain for synthesis filterbank */ - Word16 anaScalefactor; /*!< Scale factor of analysis cldfb */ - Word16 synScalefactor; /*!< Scale factor of synthesis cldfb */ - Word16 outScalefactor; /*!< Scale factor of output data (syn only) */ - Word16 synFilterHeadroom; /*!< Headroom for states in synthesis cldfb filterbank */ + Word16 synGain; /*!< gain for synthesis filterbank */ + Word16 anaScalefactor; /*!< Scale factor of analysis cldfb */ + Word16 synScalefactor; /*!< Scale factor of synthesis cldfb */ + Word16 outScalefactor; /*!< Scale factor of output data (syn only) */ + Word16 synFilterHeadroom; /*!< Headroom for states in synthesis cldfb filterbank */ /* memory helper states */ @@ -717,9 +725,12 @@ typedef struct cldfb_filter_bank_struct uint16_t memory_length; /* main filter state */ - Word16 *cldfb_state_fx; float *cldfb_state; +#ifdef IVAS_FLOAT_FIXED + Word32 *cldfb_state_fx; +#endif + /* other parameters */ int16_t bandsToZero; /* bands not synthesized */ int16_t nab; /* number of active bands */ diff --git a/lib_dec/core_dec_init.c b/lib_dec/core_dec_init.c index d9f284c8c..c92e2e43e 100644 --- a/lib_dec/core_dec_init.c +++ b/lib_dec/core_dec_init.c @@ -471,11 +471,11 @@ void open_decoder_LPD_flt( #ifdef IVAS_FLOAT_FIXED Word16 memory_length=0; cldfb_reset_memory_fx(st->cldfbAna,&memory_length); - fixedToFloat_arr(st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_state, 0, memory_length); + fixedToFloat_arrL(st->cldfbAna->cldfb_state_fx, st->cldfbAna->cldfb_state, 0, memory_length); cldfb_reset_memory_fx(st->cldfbBPF,&memory_length); - fixedToFloat_arr(st->cldfbBPF->cldfb_state_fx, st->cldfbBPF->cldfb_state, 0, memory_length); + fixedToFloat_arrL(st->cldfbBPF->cldfb_state_fx, st->cldfbBPF->cldfb_state, 0, memory_length); cldfb_reset_memory_fx(st->cldfbSyn,&memory_length); - fixedToFloat_arr(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_state, 0, memory_length); + fixedToFloat_arrL(st->cldfbSyn->cldfb_state_fx, st->cldfbSyn->cldfb_state, 0, memory_length); #else cldfb_reset_memory_ivas(st->cldfbAna); cldfb_reset_memory_ivas(st->cldfbBPF); @@ -485,7 +485,7 @@ void open_decoder_LPD_flt( { #ifdef IVAS_FLOAT_FIXED cldfb_reset_memory_fx(st->cldfbSynHB,&memory_length); - fixedToFloat_arr(st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->cldfb_state, 0, memory_length); + fixedToFloat_arrL(st->cldfbSynHB->cldfb_state_fx, st->cldfbSynHB->cldfb_state, 0, memory_length); #else cldfb_reset_memory_ivas(st->cldfbSynHB); #endif diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index e864a7a57..d0972853f 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1431,6 +1431,75 @@ void ivas_qmetadata_to_dirac( * Set metadata index mapping for DirAC *------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_dirac_dec_set_md_map( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ + const Word16 nCldfbTs /* i : number of CLDFB time slots */ +) +{ + Word16 num_slots_in_subfr; + DIRAC_DEC_HANDLE hDirAC; + SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; + + hDirAC = st_ivas->hDirAC; + hSpatParamRendCom = st_ivas->hSpatParamRendCom; + + /* adapt subframes */ + hSpatParamRendCom->num_slots = nCldfbTs; + hSpatParamRendCom->slots_rendered = 0; + num_slots_in_subfr = CLDFB_NO_COL_MAX / MAX_PARAM_SPATIAL_SUBFRAMES; + hSpatParamRendCom->subframes_rendered = 0; + + ivas_jbm_dec_get_adapted_subframes( nCldfbTs, hSpatParamRendCom->subframe_nbslots, &hSpatParamRendCom->nb_subframes ); + + /* copy also to tc buffer */ + /* only for non-combined formats and combinded formats w/o discrete objects */ + IF ( ( st_ivas->ivas_format != MASA_ISM_FORMAT || st_ivas->ism_mode != ISM_MASA_MODE_DISC ) && !( st_ivas->ivas_format == SBA_ISM_FORMAT && st_ivas->ism_mode == ISM_SBA_MODE_DISC ) ) + { + st_ivas->hTcBuffer->nb_subframes = hSpatParamRendCom->nb_subframes; + mvs2s( hSpatParamRendCom->subframe_nbslots, st_ivas->hTcBuffer->subframe_nbslots, hSpatParamRendCom->nb_subframes ); + } + + /* set mapping according to dirac_read_idx */ + + set_s( hSpatParamRendCom->render_to_md_map, 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME ); + + IF ( st_ivas->ivas_format == MASA_FORMAT ) + { + ivas_jbm_dec_get_md_map_even_spacing( nCldfbTs, num_slots_in_subfr, 0, hSpatParamRendCom->dirac_md_buffer_length, hSpatParamRendCom->render_to_md_map ); + } + ELSE IF ( hDirAC == NULL || hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) + { + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, 0, hSpatParamRendCom->dirac_md_buffer_length, hSpatParamRendCom->render_to_md_map ); + } + ELSE + { + ivas_jbm_dec_get_md_map( DEFAULT_JBM_CLDFB_TIMESLOTS, nCldfbTs, num_slots_in_subfr, hSpatParamRendCom->dirac_read_idx, hSpatParamRendCom->dirac_md_buffer_length, hSpatParamRendCom->render_to_md_map ); + } + + IF ( hDirAC == NULL || hDirAC->hConfig == NULL || hDirAC->hConfig->dec_param_estim == 0 ) + { + Word64 tmp_fx; + Word16 sf_idx, slot_idx, slot_idx_abs; + + slot_idx_abs = 0; + FOR ( sf_idx = 0; sf_idx < hSpatParamRendCom->nb_subframes; sf_idx++ ) + { + tmp_fx = 0; + FOR ( slot_idx = 0; slot_idx < hSpatParamRendCom->subframe_nbslots[sf_idx]; slot_idx++ ) + { + tmp_fx += hSpatParamRendCom->render_to_md_map[slot_idx_abs]; + slot_idx_abs++; + } + hSpatParamRendCom->render_to_md_map[sf_idx] = (round_fx((Word32)(tmp_fx << 16) / hSpatParamRendCom->subframe_nbslots[sf_idx]) + hSpatParamRendCom->dirac_read_idx) % hSpatParamRendCom->dirac_md_buffer_length; + } + + set_s( &hSpatParamRendCom->render_to_md_map[hSpatParamRendCom->nb_subframes], 0, MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME - hSpatParamRendCom->nb_subframes ); + } + + return; +} +#else void ivas_dirac_dec_set_md_map( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ const int16_t nCldfbTs /* i : number of CLDFB time slots */ @@ -1498,6 +1567,7 @@ void ivas_dirac_dec_set_md_map( return; } +#endif /*------------------------------------------------------------------------- diff --git a/lib_dec/ivas_jbm_dec.c b/lib_dec/ivas_jbm_dec.c index 9f9ae61fc..6daf07b1f 100644 --- a/lib_dec/ivas_jbm_dec.c +++ b/lib_dec/ivas_jbm_dec.c @@ -1737,6 +1737,45 @@ void ivas_jbm_dec_get_adapted_linear_interpolator( * Get an interpolator that is adapted to time scale modified IVAS frame *--------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_jbm_dec_get_adapted_subframes( + const Word16 nCldfbTs, /* i : number of time slots in the current frame */ + Word16 *subframe_nbslots, /* i/o: subframe grid */ + Word16 *nb_subframes /* i/o: number of subframes in the frame */ +) +{ + UWord16 nSlotsInLastSubframe, nSlotsInFirstSubframe; + UWord16 nCldfbSlotsLocal = nCldfbTs; + + /* get last subframe size from previous frame, determine how many slots have to be processed + in the first subframe (i.e. potential leftover of a 5ms subframe) */ + nSlotsInFirstSubframe = ( PARAM_MC_MAX_NSLOTS_IN_SUBFRAME - subframe_nbslots[*nb_subframes - 1] ); + *nb_subframes = 0; + IF ( nSlotsInFirstSubframe > 0 ) + { + *nb_subframes = 1; + nCldfbSlotsLocal -= nSlotsInFirstSubframe; + } + + *nb_subframes += (nCldfbSlotsLocal + PARAM_MC_MAX_NSLOTS_IN_SUBFRAME - 1) / PARAM_MC_MAX_NSLOTS_IN_SUBFRAME; + nSlotsInLastSubframe = nCldfbSlotsLocal % PARAM_MC_MAX_NSLOTS_IN_SUBFRAME; + + set_s( subframe_nbslots, 0, MAX_JBM_SUBFRAMES_5MS ); + set_s( subframe_nbslots, PARAM_MC_MAX_NSLOTS_IN_SUBFRAME, *nb_subframes ); + + IF ( nSlotsInFirstSubframe > 0 ) + { + subframe_nbslots[0] = nSlotsInFirstSubframe; + } + + IF ( nSlotsInLastSubframe > 0 ) + { + subframe_nbslots[*nb_subframes - 1] = nSlotsInLastSubframe; + } + + return; +} +#else void ivas_jbm_dec_get_adapted_subframes( const int16_t nCldfbTs, /* i : number of time slots in the current frame */ int16_t *subframe_nbslots, /* i/o: subframe grid */ @@ -1774,14 +1813,56 @@ void ivas_jbm_dec_get_adapted_subframes( return; } - +#endif /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_adapted_linear_interpolator() * * Get an meta data map adapted to a time scale modified IVAS frame *--------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_jbm_dec_get_md_map( + const Word16 default_len, /* i : default frame length in metadata slots */ + const Word16 len, /* i : length of the modfied frames in metadata slots */ + const Word16 subframe_len, /* i : default length of a subframe */ + const Word16 offset, /* i : current read offset into the md buffer */ + const Word16 buf_len, /* i : length of the metadata buffer */ + Word16 *map /* o : metadata index map */ +) +{ + Word16 jbm_segment_len, map_idx, src_idx, src_idx_map; + Word32 dec_fx, src_idx_fx; + + jbm_segment_len = ( default_len >> 1 ); + // dec = 1.0f / default_len; + + FOR ( (map_idx = len - 1, src_idx = default_len - 1); map_idx >= jbm_segment_len; (map_idx--, src_idx--) ) + { + src_idx_map = max( 0, src_idx / subframe_len ); + map[map_idx] = ( offset + src_idx_map ) % buf_len; + } + + /* changed part (first segment), interpolate index to parameters + (we do not want to interpolate and smooth acutal direction/diffuseness values even more) */ + IF ( src_idx >= 0 ) + { + dec_fx = L_shl(src_idx + 1, 16) / jbm_segment_len; + src_idx_fx = L_shl(src_idx + 1, 16) - dec_fx; + FOR ( ; map_idx >= 0; map_idx-- ) + { + src_idx = max( 0, round_fx( src_idx_fx ) / subframe_len ); + map[map_idx] = ( offset + src_idx ) % buf_len; + src_idx_fx -= dec_fx; + } + } + ELSE + { + set_s( map, offset, map_idx + 1 ); + } + return; +} +#else void ivas_jbm_dec_get_md_map( const int16_t default_len, /* i : default frame length in metadata slots */ const int16_t len, /* i : length of the modfied frames in metadata slots */ @@ -1823,7 +1904,7 @@ void ivas_jbm_dec_get_md_map( return; } - +#endif /*--------------------------------------------------------------------------* * ivas_jbm_dec_get_md_map_even_spacing() @@ -1831,6 +1912,63 @@ void ivas_jbm_dec_get_md_map( * Get an meta data map adapted to a time scale modified IVAS frame. Distribute slots evenly across the modified frame. *--------------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_jbm_dec_get_md_map_even_spacing( + const Word16 len, /* i : length of the modfied frames in metadata slots */ + const Word16 subframe_len, /* i : default length of a subframe */ + const Word16 offset, /* i : current read offset into the md buffer */ + const Word16 buf_len, /* i : length of the metadata buffer */ + Word16 *map /* o : metadata index map */ +) +{ + Word16 map_idx, sf_idx, sf_length, increment, subframes_written; + Word32 decimal_fx, decimal_sum_fx, eps_fx; // q = 16 + Word16 subframe_map_length[MAX_PARAM_SPATIAL_SUBFRAMES]; + + /* subframe map length */ + sf_length = len / subframe_len; + IF ( len % subframe_len == 0 ) + { + /* even subframes */ + FOR ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + subframe_map_length[sf_idx] = sf_length; + } + } + ELSE + { + /* uneven subframes */ + decimal_fx = ( L_shl(len, 16) / subframe_len ) - L_shl(sf_length, 16); + decimal_sum_fx = decimal_fx; + eps_fx = 65; + FOR ( sf_idx = 0; sf_idx < MAX_PARAM_SPATIAL_SUBFRAMES; sf_idx++ ) + { + increment = (Word16)L_shr(decimal_sum_fx + eps_fx, 16); + subframe_map_length[sf_idx] = sf_length + increment; + IF ( increment > 0 ) + { + decimal_sum_fx -= (1 << 16); + } + decimal_sum_fx += decimal_fx; + } + } + + /* map slots to subframes */ + sf_idx = 0; + subframes_written = 0; + FOR ( map_idx = 0; map_idx < len; map_idx++ ) + { + map[map_idx] = ( offset + sf_idx ) % buf_len; + IF ( map_idx - subframes_written >= subframe_map_length[sf_idx] - 1 ) + { + subframes_written += subframe_map_length[sf_idx]; + ++sf_idx; + } + } + + return; +} +#else void ivas_jbm_dec_get_md_map_even_spacing( const int16_t len, /* i : length of the modfied frames in metadata slots */ const int16_t subframe_len, /* i : default length of a subframe */ @@ -1886,6 +2024,7 @@ void ivas_jbm_dec_get_md_map_even_spacing( return; } +#endif /*--------------------------------------------------------------------------* diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 44f4f8697..d7cf9cfe1 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -2307,11 +2307,11 @@ static int16_t ivas_decode_masaism_metadata( ivas_omasa_decode_masa_to_total_fx( bit_stream, next_bit_pos, hMasaIsmData->masa_to_total_energy_ratio_fx, nbands, nblocks, &q ); - FOR( int i = 0; i < nblocks; i++ ) + FOR( int k = 0; k < nblocks; k++ ) { FOR( int j = 0; j < nbands; j++ ) { - hMasaIsmData->masa_to_total_energy_ratio[i][j] = (float) hMasaIsmData->masa_to_total_energy_ratio_fx[i][j] / (float) ( 1 << q ); + hMasaIsmData->masa_to_total_energy_ratio[k][j] = (float) hMasaIsmData->masa_to_total_energy_ratio_fx[k][j] / (float) ( 1 << q ); } } diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 66088863b..8f427bf85 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -49,7 +49,47 @@ * * Set CNA/CNG flags in IVAS SBA decoder *-------------------------------------------------------------------*/ +#ifdef IVAS_FLOAT_FIXED +void ivas_sba_set_cna_cng_flag( + Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +) +{ + Word16 n, cpe_id; + IF ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->nchan_transport == 1 ) + { + /* skip as done in init function */ + /* st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 0; */ + /* st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 0; */ + } + ELSE IF ( st_ivas->nchan_transport == 1 && ( ( st_ivas->renderer_type == RENDERER_DIRAC && st_ivas->hDirACRend->synthesisConf == DIRAC_SYNTHESIS_GAIN_SHD ) || ( st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC || st_ivas->renderer_type == RENDERER_BINAURAL_PARAMETRIC_ROOM || st_ivas->renderer_type == RENDERER_STEREO_PARAMETRIC ) ) ) + { + st_ivas->hSCE[0]->hCoreCoder[0]->cna_dirac_flag = 1; + st_ivas->hSCE[0]->hCoreCoder[0]->cng_sba_flag = 1; + } + ELSE IF ( st_ivas->nchan_transport == 2 ) + { + FOR ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[0]->hCoreCoder[n]->cna_dirac_flag = 0; + st_ivas->hCPE[0]->hCoreCoder[n]->cng_sba_flag = 1; + } + } + ELSE + { + FOR ( cpe_id = 0; cpe_id < st_ivas->nCPE; cpe_id++ ) + { + FOR ( n = 0; n < CPE_CHANNELS; n++ ) + { + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cna_dirac_flag = 0; + st_ivas->hCPE[cpe_id]->hCoreCoder[n]->cng_sba_flag = 0; + } + } + } + + return; +} +#else void ivas_sba_set_cna_cng_flag( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ) @@ -89,7 +129,7 @@ void ivas_sba_set_cna_cng_flag( return; } - +#endif /*-------------------------------------------------------------------* * ivas_sba_dec_reconfigure() diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 03f5e905e..4abd44bbb 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -34,12 +34,14 @@ #include "options.h" #include "ivas_stat_dec.h" #include "prot.h" +#include "prot_fx2.h" #include "string.h" #include "ivas_prot.h" #include "ivas_prot_rend.h" #include "ivas_rom_com.h" #include "ivas_rom_dec.h" #include "ivas_stat_com.h" +#include "stat_com.h" #include #include #include "wmc_auto.h" @@ -658,7 +660,28 @@ void ivas_spar_get_cldfb_gains( ts_inout[sample] = x; } +#ifdef IVAS_FLOAT_FIXED + Word32 ts_inout_fx[CLDFB_NO_CHANNELS_MAX], ts_re_fx[CLDFB_NO_CHANNELS_MAX], ts_im_fx[CLDFB_NO_CHANNELS_MAX]; + for (Word16 i = 0; i < CLDFB_NO_CHANNELS_MAX; i++) { + ts_inout_fx[i] = (Word32)(ts_inout[i] * (1LL << (31-4))); + ts_im_fx[i] = (Word32)(ts_im[i] * (1LL << (29-4))); + ts_re_fx[i] = (Word32)(ts_re[i] * (1LL << (29-4))); + } + for (Word16 i = 0; i < cldfbAnaDec0->p_filter_length - cldfbAnaDec0->no_channels; i++) { + cldfbAnaDec0->cldfb_state_fx[i] = (Word32)(cldfbAnaDec0->cldfb_state[i] * (1LL << (31-4))); + } + cldfbAnalysis_ts_fx( ts_inout_fx, ts_re_fx, ts_im_fx, num_cldfb_bands, cldfbAnaDec0 ); + for (Word16 i = 0; i < CLDFB_NO_CHANNELS_MAX; i++) { + ts_inout[i] = (float)(ts_inout_fx[i]) / (float)(1LL << (31-4)); + ts_im[i] = (float)(ts_im_fx[i]) / (float)(1LL << (29-4)); + ts_re[i] = (float)(ts_re_fx[i]) / (float)(1LL << (29-4)); + } + for (Word16 i = 0; i < cldfbAnaDec0->p_filter_length - cldfbAnaDec0->no_channels; i++) { + cldfbAnaDec0->cldfb_state_fx[i] = (Word32)(cldfbAnaDec0->cldfb_state[i] * (1LL << (31-4))); + } +#else cldfbAnalysis_ts_ivas( ts_inout, ts_re, ts_im, num_cldfb_bands, cldfbAnaDec0 ); +#endif cldfb_reset_memory_ivas( cldfbSynDec0 ); cldfbSynthesis_ivas( pp_ts_re, pp_ts_im, ts_inout, num_cldfb_bands, cldfbSynDec0 ); @@ -1064,6 +1087,68 @@ static void ivas_spar_get_skip_mat( return; } +#ifdef IVAS_FLOAT_FIXED +static void ivas_spar_get_skip_mat_fx( + SPAR_DEC_HANDLE hSpar, /* i/o: SPAR decoder handle */ + const Word16 num_ch_out, + const Word16 num_ch_in, + const Word16 num_spar_bands, + Word16 skip_mat[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], + const Word16 num_md_sub_frames ) +{ + Word16 spar_band, out_ch, in_ch; + Word16 i_ts, skip_flag; + + FOR ( out_ch = 0; out_ch < num_ch_out; out_ch++ ) + { + FOR ( in_ch = 0; in_ch < num_ch_in; in_ch++ ) + { + skip_mat[out_ch][in_ch] = 1; + skip_flag = 1; + FOR ( i_ts = 0; i_ts < MAX_PARAM_SPATIAL_SUBFRAMES; i_ts++ ) + { + FOR ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + IF ( hSpar->hMdDec->mixer_mat_prev_fx[1 + i_ts][out_ch][in_ch][spar_band] != 0 ) + { + skip_flag = 0; + BREAK; + } + } + + IF ( skip_flag == 0 ) + { + skip_mat[out_ch][in_ch] = 0; + BREAK; + } + } + + IF ( skip_mat[out_ch][in_ch] == 1 ) + { + FOR ( i_ts = 0; i_ts < num_md_sub_frames; i_ts++ ) + { + FOR ( spar_band = 0; spar_band < num_spar_bands; spar_band++ ) + { + IF ( hSpar->hMdDec->mixer_mat_fx[out_ch][in_ch][spar_band + i_ts * IVAS_MAX_NUM_BANDS] != 0 ) + { + skip_flag = 0; + BREAK; + } + } + + IF ( skip_flag == 0 ) + { + skip_mat[out_ch][in_ch] = 0; + BREAK; + } + } + } + } + } + + return; +} +#endif static void ivas_spar_calc_smooth_facs( float *cldfb_in_ts_re[CLDFB_NO_COL_MAX], @@ -1722,7 +1807,49 @@ void ivas_spar_dec_upmixer_sf( /* apply parameters */ /* determine if we can skip certain data */ +#ifdef IVAS_FLOAT_FIXED + Word16 q1 = 31; + for (int l = 0; l < numch_out; l++) { + for (int j = 0; j < numch_in; j++) { + for (int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++) { + if (abs((Word32)hSpar->hMdDec->mixer_mat[l][j][k]) != 0) { + q1 = min(norm_l((Word32)(hSpar->hMdDec->mixer_mat[l][j][k])), q1); + } + } + } + } + for (int l = 0; l < numch_out; l++) { + for (int j = 0; j < numch_in; j++) { + for (int k = 0; k < num_md_sub_frames * IVAS_MAX_NUM_BANDS; k++) { + hSpar->hMdDec->mixer_mat_fx[l][j][k] = (Word32)(hSpar->hMdDec->mixer_mat[l][j][k] * (1 << q1)); + } + } + } + Word16 q2 = 31; + for (int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++) { + for (int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++) { + for (int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++) { + for (int l = 0; l < IVAS_MAX_NUM_BANDS; l++) { + if (abs((Word32)hSpar->hMdDec->mixer_mat_prev[m][j][k][l]) != 0) { + q2 = min(norm_l((Word32)hSpar->hMdDec->mixer_mat_prev[m][j][k][l]), q2); + } + } + } + } + } + for (int m = 0; m < MAX_PARAM_SPATIAL_SUBFRAMES + 1; m++) { + for (int j = 0; j < IVAS_MAX_FB_MIXER_OUT_CH; j++) { + for (int k = 0; k < IVAS_MAX_SPAR_FB_MIXER_IN_CH; k++) { + for (int l = 0; l < IVAS_MAX_NUM_BANDS; l++) { + hSpar->hMdDec->mixer_mat_prev_fx[m][j][k][l] = (Word32) (hSpar->hMdDec->mixer_mat_prev[m][j][k][l] * (1 << q2)); + } + } + } + } + ivas_spar_get_skip_mat_fx( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat, num_md_sub_frames ); /* this can be precomputed based on bitrate and format*/ +#else ivas_spar_get_skip_mat( hSpar, numch_out, numch_in, num_spar_bands, b_skip_mat, num_md_sub_frames ); /* this can be precomputed based on bitrate and format*/ +#endif numch_out_dirac = hDecoderConfig->nchan_out; diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 42ea099a6..5f9721f99 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -125,6 +125,26 @@ ivas_error ivas_spar_md_dec_matrix_open( } } +#ifdef IVAS_FLOAT_FIXED + if ( ( hMdDec->mixer_mat_fx = (Word32 ***) malloc( num_channels * sizeof( Word32 ** ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( i = 0; i < num_channels; i++ ) + { + if ( ( hMdDec->mixer_mat_fx[i] = (Word32 **) malloc( num_channels * sizeof( Word32 * ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + for ( j = 0; j < num_channels; j++ ) + { + if ( ( hMdDec->mixer_mat_fx[i][j] = (Word32 *) malloc( num_md_sub_frames * IVAS_MAX_NUM_BANDS * sizeof( Word32 ) ) ) == NULL ) + { + return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); + } + } + } +#endif if ( ( hMdDec->spar_coeffs.C_re = (float ***) malloc( num_channels * sizeof( float ** ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for SPAR MD matrix" ); @@ -263,6 +283,33 @@ ivas_error ivas_spar_md_dec_matrix_open( *------------------------------------------------------------------------*/ /*! r: number of MD subframes */ +#ifdef IVAS_FLOAT_FIXED +Word16 ivas_get_spar_dec_md_num_subframes( + const Word16 sba_order, /* i : Ambisonic (SBA) order */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate */ + const Word32 ivas_last_active_brate /* i : IVAS last active bitrate */ +) +{ + Word16 num_subframes; + + num_subframes = MAX_PARAM_SPATIAL_SUBFRAMES; + IF ( sba_order > SBA_FOA_ORDER ) + { + IF ( ivas_total_brate >= IVAS_512k ) + { + num_subframes = 1; + } + } + + IF ( ( ivas_total_brate <= IVAS_SID_5k2 && ivas_last_active_brate < IVAS_24k4 ) || ( ivas_total_brate > IVAS_SID_5k2 && ivas_total_brate < IVAS_24k4 ) ) + { + + num_subframes = 1; + } + + return ( num_subframes ); +} +#else int16_t ivas_get_spar_dec_md_num_subframes( const int16_t sba_order, /* i : Ambisonic (SBA) order */ const int32_t ivas_total_brate, /* i : IVAS total bitrate */ @@ -288,6 +335,7 @@ int16_t ivas_get_spar_dec_md_num_subframes( return ( num_subframes ); } +#endif /*------------------------------------------------------------------------- @@ -387,6 +435,21 @@ void ivas_spar_md_dec_matrix_close( free( hMdDecoder->mixer_mat ); } +#ifdef IVAS_FLOAT_FIXED + if ( hMdDecoder->mixer_mat_fx != NULL ) + { + for ( i = 0; i < num_channels; i++ ) + { + for ( j = 0; j < num_channels; j++ ) + { + free( hMdDecoder->mixer_mat_fx[i][j] ); + } + free( hMdDecoder->mixer_mat_fx[i] ); + } + free( hMdDecoder->mixer_mat_fx ); + } +#endif + if ( hMdDecoder->spar_coeffs.C_re != NULL ) { for ( i = 0; i < num_channels; i++ ) diff --git a/lib_dec/ivas_stat_dec.h b/lib_dec/ivas_stat_dec.h index 4f2b630d1..01e6d2b05 100644 --- a/lib_dec/ivas_stat_dec.h +++ b/lib_dec/ivas_stat_dec.h @@ -646,6 +646,11 @@ typedef struct ivas_spar_md_dec_state_t int16_t first_valid_frame; ivas_band_coeffs_t *band_coeffs_prev; int16_t base_band_coeffs_age[IVAS_MAX_NUM_BANDS]; + +#ifdef IVAS_FLOAT_FIXED + Word32 ***mixer_mat_fx; + Word32 mixer_mat_prev_fx[MAX_PARAM_SPATIAL_SUBFRAMES + 1][IVAS_MAX_FB_MIXER_OUT_CH][IVAS_MAX_SPAR_FB_MIXER_IN_CH][IVAS_MAX_NUM_BANDS]; +#endif } ivas_spar_md_dec_state_t; -- GitLab