xref: /aosp_15_r20/external/libxaac/encoder/iusace_signal_classifier.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 FD_MODE 2
23*15dc779aSAndroid Build Coastguard Worker #define TD_MODE 0
24*15dc779aSAndroid Build Coastguard Worker #define MIN_POW -200
25*15dc779aSAndroid Build Coastguard Worker #define INDEXOFLOWFREQUENCY 160
26*15dc779aSAndroid Build Coastguard Worker 
27*15dc779aSAndroid Build Coastguard Worker #define NFRAMEAHEAD 1
28*15dc779aSAndroid Build Coastguard Worker #define AVE_TONAL_LENGTH 100
29*15dc779aSAndroid Build Coastguard Worker #define AVE_TONAL_LENGTH_SHORT 10
30*15dc779aSAndroid Build Coastguard Worker #define SPECTRAL_TILT_LENGTH 80
31*15dc779aSAndroid Build Coastguard Worker #define SPECTRAL_TILT_LENGTH_SHORT 20
32*15dc779aSAndroid Build Coastguard Worker #define SMOOTHING_LENGTH 100
33*15dc779aSAndroid Build Coastguard Worker 
34*15dc779aSAndroid Build Coastguard Worker #define NO_BORDER 0
35*15dc779aSAndroid Build Coastguard Worker #define BORDER_MUSIC_SPEECH 1
36*15dc779aSAndroid Build Coastguard Worker #define BORDER_MUSIC_SPEECH_DEFINITE 2
37*15dc779aSAndroid Build Coastguard Worker #define BORDER_SPEECH_MUSIC 3
38*15dc779aSAndroid Build Coastguard Worker #define BORDER_SPEECH_MUSIC_DEFINITE 4
39*15dc779aSAndroid Build Coastguard Worker 
40*15dc779aSAndroid Build Coastguard Worker #define TBD 0
41*15dc779aSAndroid Build Coastguard Worker #define SPEECH_DEFINITE 1
42*15dc779aSAndroid Build Coastguard Worker #define SPEECH 2
43*15dc779aSAndroid Build Coastguard Worker #define MUSIC_DEFINITE 3
44*15dc779aSAndroid Build Coastguard Worker #define MUSIC 4
45*15dc779aSAndroid Build Coastguard Worker #define LOG_1024_BASE_10 3.01029995664f
46*15dc779aSAndroid Build Coastguard Worker #define LOG_768_BASE_10 (2.88536122003f)
47*15dc779aSAndroid Build Coastguard Worker 
48*15dc779aSAndroid Build Coastguard Worker typedef struct {
49*15dc779aSAndroid Build Coastguard Worker   WORD32 smoothing_result_buf[100];            /**<buffer of smoothed mode decisions */
50*15dc779aSAndroid Build Coastguard Worker   WORD32 init_result_behind[100];              /**<buffer of past mode decisions */
51*15dc779aSAndroid Build Coastguard Worker   WORD32 init_result_ahead[NFRAMEAHEAD];       /**<buffer of ahead mode decisions */
52*15dc779aSAndroid Build Coastguard Worker   WORD32 flag_border_buf_behind[10];           /**<buffer of past border flags */
53*15dc779aSAndroid Build Coastguard Worker   WORD32 flag_border_buf_ahead[NFRAMEAHEAD];   /**<buffer of ahead border flags */
54*15dc779aSAndroid Build Coastguard Worker   FLOAT32 frame_energy_buf_behind[10];         /**<buffer of past energies */
55*15dc779aSAndroid Build Coastguard Worker   FLOAT32 frame_energy_buf_ahead[NFRAMEAHEAD]; /**<buffer of ahead energies */
56*15dc779aSAndroid Build Coastguard Worker } ia_classification_buf_struct;
57*15dc779aSAndroid Build Coastguard Worker 
58*15dc779aSAndroid Build Coastguard Worker typedef struct {
59*15dc779aSAndroid Build Coastguard Worker   WORD32 coding_mode; /**< coding mode of the frame */
60*15dc779aSAndroid Build Coastguard Worker   WORD32 pre_mode;    /**< coding mode of the previous frame */
61*15dc779aSAndroid Build Coastguard Worker 
62*15dc779aSAndroid Build Coastguard Worker   FLOAT32 input_samples[3840 * 2];
63*15dc779aSAndroid Build Coastguard Worker   WORD32 n_buffer_samples;
64*15dc779aSAndroid Build Coastguard Worker   WORD32 class_buf[10];
65*15dc779aSAndroid Build Coastguard Worker   WORD32 n_buf_class;
66*15dc779aSAndroid Build Coastguard Worker   WORD32 n_class_frames;
67*15dc779aSAndroid Build Coastguard Worker 
68*15dc779aSAndroid Build Coastguard Worker   WORD32 is_switch_mode;
69*15dc779aSAndroid Build Coastguard Worker 
70*15dc779aSAndroid Build Coastguard Worker   WORD32 framecnt;
71*15dc779aSAndroid Build Coastguard Worker   WORD32 init_flag;
72*15dc779aSAndroid Build Coastguard Worker   WORD32 framecnt_xm;
73*15dc779aSAndroid Build Coastguard Worker 
74*15dc779aSAndroid Build Coastguard Worker   ia_classification_buf_struct buffers;
75*15dc779aSAndroid Build Coastguard Worker   FLOAT32 spec_tilt_buf[100]; /* buffer of spectral tilt */
76*15dc779aSAndroid Build Coastguard Worker   WORD32 n_tonal[100];        /* buffer of tonal */
77*15dc779aSAndroid Build Coastguard Worker   WORD32 n_tonal_low_frequency[100];
78*15dc779aSAndroid Build Coastguard Worker   FLOAT32 msd_spec_tilt_buf[5];
79*15dc779aSAndroid Build Coastguard Worker   FLOAT32 msd_spec_tilt_short_buf[5]; /* buffer of the MSD of spectral tilt */
80*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ave_n_tonal_short_buf[5];
81*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ave_n_tonal_buf[5]; /* buffer of the AVE of tonal */
82*15dc779aSAndroid Build Coastguard Worker } ia_classification_struct;
83*15dc779aSAndroid Build Coastguard Worker 
84*15dc779aSAndroid Build Coastguard Worker typedef struct {
85*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *time_signal;          /**<input signals */
86*15dc779aSAndroid Build Coastguard Worker   WORD32 framecnt_xm;            /**<frame counter
87*15dc779aSAndroid Build Coastguard Worker                                   */
88*15dc779aSAndroid Build Coastguard Worker   WORD32 *n_tonal;               /**<buffer of the numbers of tonal
89*15dc779aSAndroid Build Coastguard Worker                                   */
90*15dc779aSAndroid Build Coastguard Worker   WORD32 *n_tonal_low_frequency; /**<buffer of the numbers of tonal in the low frequency domain
91*15dc779aSAndroid Build Coastguard Worker                                   */
92*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *n_tonal_low_frequency_ratio; /**<the ratio of distribution of the numbers of tonal in
93*15dc779aSAndroid Build Coastguard Worker                                            the low frequency domain*/
94*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ave_n_tonal;                 /**<long - term AVE of tonal
95*15dc779aSAndroid Build Coastguard Worker                                          */
96*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ave_n_tonal_short;           /**<short - term AVE of tonal */
97*15dc779aSAndroid Build Coastguard Worker } ia_tonal_params_struct;
98*15dc779aSAndroid Build Coastguard Worker 
99*15dc779aSAndroid Build Coastguard Worker typedef struct {
100*15dc779aSAndroid Build Coastguard Worker   WORD32 framecnt;                     /**< frame counter*/
101*15dc779aSAndroid Build Coastguard Worker   WORD32 *framecnt_xm;                 /**< frame counter*/
102*15dc779aSAndroid Build Coastguard Worker   WORD32 *flag_border;                 /**< flag of current border*/
103*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ave_n_tonal_short;           /**< short - term AVE of tonal*/
104*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ave_n_tonal;                 /**< long - term AVE of tonal*/
105*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ave_n_tonal_short_buf;      /**< buffer of short - term AVE of tonal*/
106*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ave_n_tonal_buf;            /**< buffer long - term AVE of tonal*/
107*15dc779aSAndroid Build Coastguard Worker   FLOAT32 msd_spec_tilt;               /**< long - term MSD of spectral tilt*/
108*15dc779aSAndroid Build Coastguard Worker   FLOAT32 msd_spec_tilt_short;         /**< short - term MSD of spectral tilt*/
109*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *msd_spec_tilt_buf;          /**< buffer of long - term MSD of spectral tilt*/
110*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *msd_spec_tilt_short_buf;    /**< buffer of short - term MSD of spectral tilt*/
111*15dc779aSAndroid Build Coastguard Worker   FLOAT32 n_tonal_low_frequency_ratio; /**< the ratio of distribution of the numbers of tonal in
112*15dc779aSAndroid Build Coastguard Worker                                           the low frequency domain*/
113*15dc779aSAndroid Build Coastguard Worker   FLOAT32 frame_energy;                /**< the energy of current frame*/
114*15dc779aSAndroid Build Coastguard Worker } ia_mode_params_struct;
115*15dc779aSAndroid Build Coastguard Worker 
116*15dc779aSAndroid Build Coastguard Worker typedef struct {
117*15dc779aSAndroid Build Coastguard Worker   WORD32 init_mode_decision_result; /**<  initial mode decision				*/
118*15dc779aSAndroid Build Coastguard Worker   WORD32 *init_result_behind;       /**<  buffer of past mode decisions		*/
119*15dc779aSAndroid Build Coastguard Worker   WORD32 *init_result_ahead;        /**<  buffer of ahead mode decisions	*/
120*15dc779aSAndroid Build Coastguard Worker   WORD32 flag_border;               /**<  current flag of border			*/
121*15dc779aSAndroid Build Coastguard Worker   WORD32 *flag_border_buf_behind;   /**<  buffer of past flags of border	*/
122*15dc779aSAndroid Build Coastguard Worker   WORD32 *flag_border_buf_ahead;    /**<  buffer of ahead flags of border	*/
123*15dc779aSAndroid Build Coastguard Worker   FLOAT32 frame_energy;             /**<  the energy of current frame		*/
124*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *frame_energy_buf_behind; /**<  buffer of past frame energies		*/
125*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *frame_energy_buf_ahead;  /**<  buffer of ahead frame energies	*/
126*15dc779aSAndroid Build Coastguard Worker   WORD32 *smoothing_result_buf;     /**<  buffer of smoothed mode decision	*/
127*15dc779aSAndroid Build Coastguard Worker   WORD32 flag_speech_definite;
128*15dc779aSAndroid Build Coastguard Worker   WORD32 count_small_energy;
129*15dc779aSAndroid Build Coastguard Worker   WORD32 flag_music_definite;
130*15dc779aSAndroid Build Coastguard Worker   WORD32 num_smoothing;
131*15dc779aSAndroid Build Coastguard Worker } ia_smooth_params_struct; /**<  final mode decision result        */
132*15dc779aSAndroid Build Coastguard Worker 
133*15dc779aSAndroid Build Coastguard Worker typedef struct {
134*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *time_signal;         /**<input signals                    */
135*15dc779aSAndroid Build Coastguard Worker   WORD32 framecnt_xm;           /**<frame counter					*/
136*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *spec_tilt_buf;       /**<buffer of spectral tilt			*/
137*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *msd_spec_tilt;       /**<long - term MSD of spectral tilt	*/
138*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *msd_spec_tilt_short; /**<short - term MSD of spectral tilt*/
139*15dc779aSAndroid Build Coastguard Worker   FLOAT32 frame_energy;
140*15dc779aSAndroid Build Coastguard Worker } ia_spec_tilt_params_struct;
141*15dc779aSAndroid Build Coastguard Worker 
142*15dc779aSAndroid Build Coastguard Worker typedef struct {
143*15dc779aSAndroid Build Coastguard Worker   const FLOAT64 twiddle_table_fft_float[514];
144*15dc779aSAndroid Build Coastguard Worker   const FLOAT64 hanning_window_1024[FRAME_LEN_LONG];
145*15dc779aSAndroid Build Coastguard Worker   const FLOAT64 absolute_threshold_1024[FRAME_LEN_LONG / 2];
146*15dc779aSAndroid Build Coastguard Worker   const FLOAT64 hanning_window_768[LEN_SUPERFRAME_768];
147*15dc779aSAndroid Build Coastguard Worker   const FLOAT64 absolute_threshold_768[LEN_SUPERFRAME_768 / 2];
148*15dc779aSAndroid Build Coastguard Worker } ia_signal_classifier_tables;
149*15dc779aSAndroid Build Coastguard Worker 
150*15dc779aSAndroid Build Coastguard Worker extern const ia_signal_classifier_tables iusace_classify_arrays;
151*15dc779aSAndroid Build Coastguard Worker 
152*15dc779aSAndroid Build Coastguard Worker VOID iusace_init_classification(ia_classification_struct *pstr_sig_class);
153