diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters
index 34135d6613f8a5c8f0e0a01cdfe662f05501b656..b39c6d3cc532e0e3e8944a8ac4e08beaa1de1f75 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 b77c38d3b044050605eaffe6ecc29eec5f6811cf..ed4aa63b5d72df06c7dbf8685a143c6216c75797 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 e36b7432fb618a81de86be3a979c6be8e9ccba20..15c95e49ffe4b3190470c44e2c3fdee115a688fc 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 fd1bb70fdce6bc28348aa623761bc08a79a86988..ddf8fc6ad93bde0a11e3835cffcce42bb11e668c 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 01a76d256816dbb03a7d56a5c9e4dde528f77e30..cb2498379db140b7f8bdd8c02bdada92fe3ec08e 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 3b0ad64850ed17ccc23a3aa84d20cfdd8d88928c..5b00e8f4f3842fbe4f6bdbbd11d21c70b6789b4b 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 9e867840b78c35957c09323b98a91206bead9bf2..50f955071232509af4e1415566942f36c37b016d 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 62fd8d250b3ee2f3680ef756ff652100988e7b6b..3d8e791bd942b0987bf59a7093b5a3e76ebc6436 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 663001a3a54f7f166598a30e0f58023514ed13d0..52241e19482120aafe633ea343bd77759b759653 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 d9f284c8c6298ecc5d17ec86ad3b5d262c9ba6a4..c92e2e43e109685e811c5f15bef70145a3267dc4 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 e864a7a57f7e544f0554964ec60db8137511087d..d0972853f424cec2c6c9a503ef8215b355f61c7f 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 9f9ae61fc480d5b6ec719683974b657930bd6d5e..6daf07b1f75aac8a5bf66c612fdc5a8932326a97 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 44f4f86973ccd7888988a81827b027ce405f4280..d7cf9cfe1ff7fb5869b585756e5025576c5787d9 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 66088863b1871c7a343d0074ac5ffa15e03e5d92..8f427bf85d2a96d89c5f72d1325ca4cca46f321f 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 03f5e905e7ab914d53c1b84a31cbb04b75d09465..4abd44bbb77245d048288fe2d4badf68d6c769d9 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 42ea099a6bfd60e435dbf7c6a30b1b36066c3f64..5f9721f99978320ddfc4bd0ea0fbafd4c0e870bd 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 4f2b630d13458dd5922cbe0eeca179b511b21564..01e6d2b05b1d54a80f21005a1a602f9dc76a03ce 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;