xref: /aosp_15_r20/external/libxaac/encoder/iusace_tns_usac.h (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker  *
5*15dc779aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker  *
9*15dc779aSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker  *
11*15dc779aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker  * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker  *
17*15dc779aSAndroid Build Coastguard Worker  *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker  */
20*15dc779aSAndroid Build Coastguard Worker 
21*15dc779aSAndroid Build Coastguard Worker #pragma once
22*15dc779aSAndroid Build Coastguard Worker #define LN (2048)
23*15dc779aSAndroid Build Coastguard Worker #define SN (256)
24*15dc779aSAndroid Build Coastguard Worker #define LN2 (LN / 2)
25*15dc779aSAndroid Build Coastguard Worker #define NSHORT (LN / SN)
26*15dc779aSAndroid Build Coastguard Worker 
27*15dc779aSAndroid Build Coastguard Worker #define TNS_MAX_ORDER 31
28*15dc779aSAndroid Build Coastguard Worker #define DEF_TNS_GAIN_THRESH 1.41
29*15dc779aSAndroid Build Coastguard Worker #define DEF_TNS_COEFF_THRESH 0.1
30*15dc779aSAndroid Build Coastguard Worker #define DEF_TNS_RES_OFFSET 3
31*15dc779aSAndroid Build Coastguard Worker 
32*15dc779aSAndroid Build Coastguard Worker #ifndef PI
33*15dc779aSAndroid Build Coastguard Worker #define PI 3.14159265358979323846
34*15dc779aSAndroid Build Coastguard Worker #endif
35*15dc779aSAndroid Build Coastguard Worker 
36*15dc779aSAndroid Build Coastguard Worker typedef struct {
37*15dc779aSAndroid Build Coastguard Worker   WORD32 order;                        /**< Filter order */
38*15dc779aSAndroid Build Coastguard Worker   WORD32 direction;                    /**< Filtering direction */
39*15dc779aSAndroid Build Coastguard Worker   WORD32 coef_compress;                /**< Are coeffs compressed? */
40*15dc779aSAndroid Build Coastguard Worker   WORD32 length;                       /**< Length, in bands */
41*15dc779aSAndroid Build Coastguard Worker   FLOAT64 a_coeffs[TNS_MAX_ORDER + 1]; /**< AR Coefficients */
42*15dc779aSAndroid Build Coastguard Worker   FLOAT64 k_coeffs[TNS_MAX_ORDER + 1]; /**< Reflection Coefficients */
43*15dc779aSAndroid Build Coastguard Worker   WORD32 index[TNS_MAX_ORDER + 1];     /**< Coefficient indices */
44*15dc779aSAndroid Build Coastguard Worker } ia_tns_filter_data;
45*15dc779aSAndroid Build Coastguard Worker 
46*15dc779aSAndroid Build Coastguard Worker typedef struct {
47*15dc779aSAndroid Build Coastguard Worker   WORD32 n_filt;                    /**< number of filters */
48*15dc779aSAndroid Build Coastguard Worker   WORD32 coef_res;                  /**< Coefficient resolution */
49*15dc779aSAndroid Build Coastguard Worker   ia_tns_filter_data tns_filter[3]; /**< TNS filters */
50*15dc779aSAndroid Build Coastguard Worker   FLOAT64 tns_pred_gain;
51*15dc779aSAndroid Build Coastguard Worker   WORD32 tns_active;
52*15dc779aSAndroid Build Coastguard Worker } ia_tns_window_data;
53*15dc779aSAndroid Build Coastguard Worker 
54*15dc779aSAndroid Build Coastguard Worker typedef struct {
55*15dc779aSAndroid Build Coastguard Worker   WORD32 tns_data_present;
56*15dc779aSAndroid Build Coastguard Worker   WORD32 tns_min_band_number_long;
57*15dc779aSAndroid Build Coastguard Worker   WORD32 tns_min_band_number_short;
58*15dc779aSAndroid Build Coastguard Worker   WORD32 tns_max_bands_long;
59*15dc779aSAndroid Build Coastguard Worker   WORD32 tns_max_bands_short;
60*15dc779aSAndroid Build Coastguard Worker   WORD32 tns_max_order_long;
61*15dc779aSAndroid Build Coastguard Worker   WORD32 tns_max_order_short;
62*15dc779aSAndroid Build Coastguard Worker   WORD32 lpc_start_band_long;
63*15dc779aSAndroid Build Coastguard Worker   WORD32 lpc_start_band_short;
64*15dc779aSAndroid Build Coastguard Worker   WORD32 lpc_stop_band_long;
65*15dc779aSAndroid Build Coastguard Worker   WORD32 lpc_stop_band_short;
66*15dc779aSAndroid Build Coastguard Worker   ia_tns_window_data window_data[NSHORT]; /**< TNS data per window */
67*15dc779aSAndroid Build Coastguard Worker   WORD32 *sfb_offset_table_short;         /**< Scalefactor band offset table */
68*15dc779aSAndroid Build Coastguard Worker   WORD32 *sfb_offset_table_short_tcx;     /**< Scalefactor band offset table */
69*15dc779aSAndroid Build Coastguard Worker   WORD32 *sfb_offset_table_long;          /**< Scalefactor band offset table */
70*15dc779aSAndroid Build Coastguard Worker   WORD32 max_sfb_short;                   /**< max_sfb */
71*15dc779aSAndroid Build Coastguard Worker   WORD32 max_sfb_long;                    /**< max_sfb */
72*15dc779aSAndroid Build Coastguard Worker   FLOAT32 threshold;
73*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tns_time_res_short;
74*15dc779aSAndroid Build Coastguard Worker   FLOAT32 tns_time_res_long;
75*15dc779aSAndroid Build Coastguard Worker   FLOAT64 win_short[8];
76*15dc779aSAndroid Build Coastguard Worker   FLOAT64 win_long[16];
77*15dc779aSAndroid Build Coastguard Worker   WORD32 block_type;      /**< block type */
78*15dc779aSAndroid Build Coastguard Worker   WORD32 number_of_bands; /**< number of bands per window */
79*15dc779aSAndroid Build Coastguard Worker   FLOAT64 *spec;          /**< Spectral data array */
80*15dc779aSAndroid Build Coastguard Worker } ia_tns_info;
81*15dc779aSAndroid Build Coastguard Worker 
82*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE iusace_tns_init(WORD32 sampling_rate, WORD32 bit_rate, ia_tns_info *pstr_tns_info,
83*15dc779aSAndroid Build Coastguard Worker                              WORD32 num_channels);
84*15dc779aSAndroid Build Coastguard Worker 
85*15dc779aSAndroid Build Coastguard Worker VOID iusace_tns_encode(ia_tns_info *pstr_tns_info_ch2, ia_tns_info *pstr_tns_info,
86*15dc779aSAndroid Build Coastguard Worker                        FLOAT32 *ptr_sfb_energy, WORD32 w, WORD32 i_ch, WORD32 low_pass_line,
87*15dc779aSAndroid Build Coastguard Worker                        FLOAT64 *ptr_scratch_tns_filter, WORD32 core_mode,
88*15dc779aSAndroid Build Coastguard Worker                        FLOAT64 *ptr_tns_scratch);
89