xref: /aosp_15_r20/external/libopus/silk/fixed/main_FIX.h (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /***********************************************************************
2*a58d3d2aSXin Li Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without
4*a58d3d2aSXin Li modification, are permitted provided that the following conditions
5*a58d3d2aSXin Li are met:
6*a58d3d2aSXin Li - Redistributions of source code must retain the above copyright notice,
7*a58d3d2aSXin Li this list of conditions and the following disclaimer.
8*a58d3d2aSXin Li - Redistributions in binary form must reproduce the above copyright
9*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer in the
10*a58d3d2aSXin Li documentation and/or other materials provided with the distribution.
11*a58d3d2aSXin Li - Neither the name of Internet Society, IETF or IETF Trust, nor the
12*a58d3d2aSXin Li names of specific contributors, may be used to endorse or promote
13*a58d3d2aSXin Li products derived from this software without specific prior written
14*a58d3d2aSXin Li permission.
15*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16*a58d3d2aSXin Li AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*a58d3d2aSXin Li IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*a58d3d2aSXin Li ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19*a58d3d2aSXin Li LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*a58d3d2aSXin Li CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*a58d3d2aSXin Li SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*a58d3d2aSXin Li INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*a58d3d2aSXin Li CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*a58d3d2aSXin Li ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*a58d3d2aSXin Li POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li ***********************************************************************/
27*a58d3d2aSXin Li 
28*a58d3d2aSXin Li #ifndef SILK_MAIN_FIX_H
29*a58d3d2aSXin Li #define SILK_MAIN_FIX_H
30*a58d3d2aSXin Li 
31*a58d3d2aSXin Li #include "SigProc_FIX.h"
32*a58d3d2aSXin Li #include "structs_FIX.h"
33*a58d3d2aSXin Li #include "control.h"
34*a58d3d2aSXin Li #include "main.h"
35*a58d3d2aSXin Li #include "PLC.h"
36*a58d3d2aSXin Li #include "debug.h"
37*a58d3d2aSXin Li #include "entenc.h"
38*a58d3d2aSXin Li 
39*a58d3d2aSXin Li #if ((defined(OPUS_ARM_ASM) && defined(FIXED_POINT)) \
40*a58d3d2aSXin Li    || defined(OPUS_ARM_MAY_HAVE_NEON_INTR))
41*a58d3d2aSXin Li #include "fixed/arm/warped_autocorrelation_FIX_arm.h"
42*a58d3d2aSXin Li #endif
43*a58d3d2aSXin Li 
44*a58d3d2aSXin Li #ifndef FORCE_CPP_BUILD
45*a58d3d2aSXin Li #ifdef __cplusplus
46*a58d3d2aSXin Li extern "C"
47*a58d3d2aSXin Li {
48*a58d3d2aSXin Li #endif
49*a58d3d2aSXin Li #endif
50*a58d3d2aSXin Li 
51*a58d3d2aSXin Li #define silk_encoder_state_Fxx      silk_encoder_state_FIX
52*a58d3d2aSXin Li #define silk_encode_do_VAD_Fxx      silk_encode_do_VAD_FIX
53*a58d3d2aSXin Li #define silk_encode_frame_Fxx       silk_encode_frame_FIX
54*a58d3d2aSXin Li 
55*a58d3d2aSXin Li #define QC  10
56*a58d3d2aSXin Li #define QS  13
57*a58d3d2aSXin Li 
58*a58d3d2aSXin Li /*********************/
59*a58d3d2aSXin Li /* Encoder Functions */
60*a58d3d2aSXin Li /*********************/
61*a58d3d2aSXin Li 
62*a58d3d2aSXin Li /* High-pass filter with cutoff frequency adaptation based on pitch lag statistics */
63*a58d3d2aSXin Li void silk_HP_variable_cutoff(
64*a58d3d2aSXin Li     silk_encoder_state_Fxx          state_Fxx[]                             /* I/O  Encoder states                                                              */
65*a58d3d2aSXin Li );
66*a58d3d2aSXin Li 
67*a58d3d2aSXin Li /* Encoder main function */
68*a58d3d2aSXin Li void silk_encode_do_VAD_FIX(
69*a58d3d2aSXin Li     silk_encoder_state_FIX          *psEnc,                                 /* I/O  Pointer to Silk FIX encoder state                                           */
70*a58d3d2aSXin Li     opus_int                        activity                                /* I    Decision of Opus voice activity detector                                    */
71*a58d3d2aSXin Li );
72*a58d3d2aSXin Li 
73*a58d3d2aSXin Li /* Encoder main function */
74*a58d3d2aSXin Li opus_int silk_encode_frame_FIX(
75*a58d3d2aSXin Li     silk_encoder_state_FIX          *psEnc,                                 /* I/O  Pointer to Silk FIX encoder state                                           */
76*a58d3d2aSXin Li     opus_int32                      *pnBytesOut,                            /* O    Pointer to number of payload bytes;                                         */
77*a58d3d2aSXin Li     ec_enc                          *psRangeEnc,                            /* I/O  compressor data structure                                                   */
78*a58d3d2aSXin Li     opus_int                        condCoding,                             /* I    The type of conditional coding to use                                       */
79*a58d3d2aSXin Li     opus_int                        maxBits,                                /* I    If > 0: maximum number of output bits                                       */
80*a58d3d2aSXin Li     opus_int                        useCBR                                  /* I    Flag to force constant-bitrate operation                                    */
81*a58d3d2aSXin Li );
82*a58d3d2aSXin Li 
83*a58d3d2aSXin Li /* Initializes the Silk encoder state */
84*a58d3d2aSXin Li opus_int silk_init_encoder(
85*a58d3d2aSXin Li     silk_encoder_state_Fxx          *psEnc,                                 /* I/O  Pointer to Silk FIX encoder state                                           */
86*a58d3d2aSXin Li     int                              arch                                   /* I    Run-time architecture                                                       */
87*a58d3d2aSXin Li );
88*a58d3d2aSXin Li 
89*a58d3d2aSXin Li /* Control the Silk encoder */
90*a58d3d2aSXin Li opus_int silk_control_encoder(
91*a58d3d2aSXin Li     silk_encoder_state_Fxx          *psEnc,                                 /* I/O  Pointer to Silk encoder state                                               */
92*a58d3d2aSXin Li     silk_EncControlStruct           *encControl,                            /* I    Control structure                                                           */
93*a58d3d2aSXin Li     const opus_int                  allow_bw_switch,                        /* I    Flag to allow switching audio bandwidth                                     */
94*a58d3d2aSXin Li     const opus_int                  channelNb,                              /* I    Channel number                                                              */
95*a58d3d2aSXin Li     const opus_int                  force_fs_kHz
96*a58d3d2aSXin Li );
97*a58d3d2aSXin Li 
98*a58d3d2aSXin Li /**************************/
99*a58d3d2aSXin Li /* Noise shaping analysis */
100*a58d3d2aSXin Li /**************************/
101*a58d3d2aSXin Li /* Compute noise shaping coefficients and initial gain values */
102*a58d3d2aSXin Li void silk_noise_shape_analysis_FIX(
103*a58d3d2aSXin Li     silk_encoder_state_FIX          *psEnc,                                 /* I/O  Encoder state FIX                                                           */
104*a58d3d2aSXin Li     silk_encoder_control_FIX        *psEncCtrl,                             /* I/O  Encoder control FIX                                                         */
105*a58d3d2aSXin Li     const opus_int16                *pitch_res,                             /* I    LPC residual from pitch analysis                                            */
106*a58d3d2aSXin Li     const opus_int16                *x,                                     /* I    Input signal [ frame_length + la_shape ]                                    */
107*a58d3d2aSXin Li     int                              arch                                   /* I    Run-time architecture                                                       */
108*a58d3d2aSXin Li );
109*a58d3d2aSXin Li 
110*a58d3d2aSXin Li /* Autocorrelations for a warped frequency axis */
111*a58d3d2aSXin Li void silk_warped_autocorrelation_FIX_c(
112*a58d3d2aSXin Li           opus_int32                *corr,                                  /* O    Result [order + 1]                                                          */
113*a58d3d2aSXin Li           opus_int                  *scale,                                 /* O    Scaling of the correlation vector                                           */
114*a58d3d2aSXin Li     const opus_int16                *input,                                 /* I    Input data to correlate                                                     */
115*a58d3d2aSXin Li     const opus_int                  warping_Q16,                            /* I    Warping coefficient                                                         */
116*a58d3d2aSXin Li     const opus_int                  length,                                 /* I    Length of input                                                             */
117*a58d3d2aSXin Li     const opus_int                  order                                   /* I    Correlation order (even)                                                    */
118*a58d3d2aSXin Li );
119*a58d3d2aSXin Li 
120*a58d3d2aSXin Li #if !defined(OVERRIDE_silk_warped_autocorrelation_FIX)
121*a58d3d2aSXin Li #define silk_warped_autocorrelation_FIX(corr, scale, input, warping_Q16, length, order, arch) \
122*a58d3d2aSXin Li         ((void)(arch), silk_warped_autocorrelation_FIX_c(corr, scale, input, warping_Q16, length, order))
123*a58d3d2aSXin Li #endif
124*a58d3d2aSXin Li 
125*a58d3d2aSXin Li /* Calculation of LTP state scaling */
126*a58d3d2aSXin Li void silk_LTP_scale_ctrl_FIX(
127*a58d3d2aSXin Li     silk_encoder_state_FIX          *psEnc,                                 /* I/O  encoder state                                                               */
128*a58d3d2aSXin Li     silk_encoder_control_FIX        *psEncCtrl,                             /* I/O  encoder control                                                             */
129*a58d3d2aSXin Li     opus_int                        condCoding                              /* I    The type of conditional coding to use                                       */
130*a58d3d2aSXin Li );
131*a58d3d2aSXin Li 
132*a58d3d2aSXin Li /**********************************************/
133*a58d3d2aSXin Li /* Prediction Analysis                        */
134*a58d3d2aSXin Li /**********************************************/
135*a58d3d2aSXin Li /* Find pitch lags */
136*a58d3d2aSXin Li void silk_find_pitch_lags_FIX(
137*a58d3d2aSXin Li     silk_encoder_state_FIX          *psEnc,                                 /* I/O  encoder state                                                               */
138*a58d3d2aSXin Li     silk_encoder_control_FIX        *psEncCtrl,                             /* I/O  encoder control                                                             */
139*a58d3d2aSXin Li     opus_int16                      res[],                                  /* O    residual                                                                    */
140*a58d3d2aSXin Li     const opus_int16                x[],                                    /* I    Speech signal                                                               */
141*a58d3d2aSXin Li     int                             arch                                    /* I    Run-time architecture                                                       */
142*a58d3d2aSXin Li );
143*a58d3d2aSXin Li 
144*a58d3d2aSXin Li /* Find LPC and LTP coefficients */
145*a58d3d2aSXin Li void silk_find_pred_coefs_FIX(
146*a58d3d2aSXin Li     silk_encoder_state_FIX          *psEnc,                                 /* I/O  encoder state                                                               */
147*a58d3d2aSXin Li     silk_encoder_control_FIX        *psEncCtrl,                             /* I/O  encoder control                                                             */
148*a58d3d2aSXin Li     const opus_int16                res_pitch[],                            /* I    Residual from pitch analysis                                                */
149*a58d3d2aSXin Li     const opus_int16                x[],                                    /* I    Speech signal                                                               */
150*a58d3d2aSXin Li     opus_int                        condCoding                              /* I    The type of conditional coding to use                                       */
151*a58d3d2aSXin Li );
152*a58d3d2aSXin Li 
153*a58d3d2aSXin Li /* LPC analysis */
154*a58d3d2aSXin Li void silk_find_LPC_FIX(
155*a58d3d2aSXin Li     silk_encoder_state              *psEncC,                                /* I/O  Encoder state                                                               */
156*a58d3d2aSXin Li     opus_int16                      NLSF_Q15[],                             /* O    NLSFs                                                                       */
157*a58d3d2aSXin Li     const opus_int16                x[],                                    /* I    Input signal                                                                */
158*a58d3d2aSXin Li     const opus_int32                minInvGain_Q30                          /* I    Inverse of max prediction gain                                              */
159*a58d3d2aSXin Li );
160*a58d3d2aSXin Li 
161*a58d3d2aSXin Li /* LTP analysis */
162*a58d3d2aSXin Li void silk_find_LTP_FIX(
163*a58d3d2aSXin Li     opus_int32                      XXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER * LTP_ORDER ], /* O    Correlation matrix                                               */
164*a58d3d2aSXin Li     opus_int32                      xXLTP_Q17[ MAX_NB_SUBFR * LTP_ORDER ],  /* O    Correlation vector                                                          */
165*a58d3d2aSXin Li     const opus_int16                r_lpc[],                                /* I    Residual signal after LPC                                                   */
166*a58d3d2aSXin Li     const opus_int                  lag[ MAX_NB_SUBFR ],                    /* I    LTP lags                                                                    */
167*a58d3d2aSXin Li     const opus_int                  subfr_length,                           /* I    Subframe length                                                             */
168*a58d3d2aSXin Li     const opus_int                  nb_subfr,                               /* I    Number of subframes                                                         */
169*a58d3d2aSXin Li     int                             arch                                    /* I    Run-time architecture                                                       */
170*a58d3d2aSXin Li );
171*a58d3d2aSXin Li 
172*a58d3d2aSXin Li void silk_LTP_analysis_filter_FIX(
173*a58d3d2aSXin Li     opus_int16                      *LTP_res,                               /* O    LTP residual signal of length MAX_NB_SUBFR * ( pre_length + subfr_length )  */
174*a58d3d2aSXin Li     const opus_int16                *x,                                     /* I    Pointer to input signal with at least max( pitchL ) preceding samples       */
175*a58d3d2aSXin Li     const opus_int16                LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ],/* I    LTP_ORDER LTP coefficients for each MAX_NB_SUBFR subframe                   */
176*a58d3d2aSXin Li     const opus_int                  pitchL[ MAX_NB_SUBFR ],                 /* I    Pitch lag, one for each subframe                                            */
177*a58d3d2aSXin Li     const opus_int32                invGains_Q16[ MAX_NB_SUBFR ],           /* I    Inverse quantization gains, one for each subframe                           */
178*a58d3d2aSXin Li     const opus_int                  subfr_length,                           /* I    Length of each subframe                                                     */
179*a58d3d2aSXin Li     const opus_int                  nb_subfr,                               /* I    Number of subframes                                                         */
180*a58d3d2aSXin Li     const opus_int                  pre_length                              /* I    Length of the preceding samples starting at &x[0] for each subframe         */
181*a58d3d2aSXin Li );
182*a58d3d2aSXin Li 
183*a58d3d2aSXin Li /* Calculates residual energies of input subframes where all subframes have LPC_order   */
184*a58d3d2aSXin Li /* of preceding samples                                                                 */
185*a58d3d2aSXin Li void silk_residual_energy_FIX(
186*a58d3d2aSXin Li           opus_int32                nrgs[ MAX_NB_SUBFR ],                   /* O    Residual energy per subframe                                                */
187*a58d3d2aSXin Li           opus_int                  nrgsQ[ MAX_NB_SUBFR ],                  /* O    Q value per subframe                                                        */
188*a58d3d2aSXin Li     const opus_int16                x[],                                    /* I    Input signal                                                                */
189*a58d3d2aSXin Li           opus_int16                a_Q12[ 2 ][ MAX_LPC_ORDER ],            /* I    AR coefs for each frame half                                                */
190*a58d3d2aSXin Li     const opus_int32                gains[ MAX_NB_SUBFR ],                  /* I    Quantization gains                                                          */
191*a58d3d2aSXin Li     const opus_int                  subfr_length,                           /* I    Subframe length                                                             */
192*a58d3d2aSXin Li     const opus_int                  nb_subfr,                               /* I    Number of subframes                                                         */
193*a58d3d2aSXin Li     const opus_int                  LPC_order,                              /* I    LPC order                                                                   */
194*a58d3d2aSXin Li     int                             arch                                    /* I    Run-time architecture                                                       */
195*a58d3d2aSXin Li );
196*a58d3d2aSXin Li 
197*a58d3d2aSXin Li /* Residual energy: nrg = wxx - 2 * wXx * c + c' * wXX * c */
198*a58d3d2aSXin Li opus_int32 silk_residual_energy16_covar_FIX(
199*a58d3d2aSXin Li     const opus_int16                *c,                                     /* I    Prediction vector                                                           */
200*a58d3d2aSXin Li     const opus_int32                *wXX,                                   /* I    Correlation matrix                                                          */
201*a58d3d2aSXin Li     const opus_int32                *wXx,                                   /* I    Correlation vector                                                          */
202*a58d3d2aSXin Li     opus_int32                      wxx,                                    /* I    Signal energy                                                               */
203*a58d3d2aSXin Li     opus_int                        D,                                      /* I    Dimension                                                                   */
204*a58d3d2aSXin Li     opus_int                        cQ                                      /* I    Q value for c vector 0 - 15                                                 */
205*a58d3d2aSXin Li );
206*a58d3d2aSXin Li 
207*a58d3d2aSXin Li /* Processing of gains */
208*a58d3d2aSXin Li void silk_process_gains_FIX(
209*a58d3d2aSXin Li     silk_encoder_state_FIX          *psEnc,                                 /* I/O  Encoder state                                                               */
210*a58d3d2aSXin Li     silk_encoder_control_FIX        *psEncCtrl,                             /* I/O  Encoder control                                                             */
211*a58d3d2aSXin Li     opus_int                        condCoding                              /* I    The type of conditional coding to use                                       */
212*a58d3d2aSXin Li );
213*a58d3d2aSXin Li 
214*a58d3d2aSXin Li /******************/
215*a58d3d2aSXin Li /* Linear Algebra */
216*a58d3d2aSXin Li /******************/
217*a58d3d2aSXin Li /* Calculates correlation matrix X'*X */
218*a58d3d2aSXin Li void silk_corrMatrix_FIX(
219*a58d3d2aSXin Li     const opus_int16                *x,                                     /* I    x vector [L + order - 1] used to form data matrix X                         */
220*a58d3d2aSXin Li     const opus_int                  L,                                      /* I    Length of vectors                                                           */
221*a58d3d2aSXin Li     const opus_int                  order,                                  /* I    Max lag for correlation                                                     */
222*a58d3d2aSXin Li     opus_int32                      *XX,                                    /* O    Pointer to X'*X correlation matrix [ order x order ]                        */
223*a58d3d2aSXin Li     opus_int32                      *nrg,                                   /* O    Energy of x vector                                                          */
224*a58d3d2aSXin Li     opus_int                        *rshifts,                               /* O    Right shifts of correlations                                                */
225*a58d3d2aSXin Li     int                              arch                                   /* I    Run-time architecture                                                       */
226*a58d3d2aSXin Li );
227*a58d3d2aSXin Li 
228*a58d3d2aSXin Li /* Calculates correlation vector X'*t */
229*a58d3d2aSXin Li void silk_corrVector_FIX(
230*a58d3d2aSXin Li     const opus_int16                *x,                                     /* I    x vector [L + order - 1] used to form data matrix X                         */
231*a58d3d2aSXin Li     const opus_int16                *t,                                     /* I    Target vector [L]                                                           */
232*a58d3d2aSXin Li     const opus_int                  L,                                      /* I    Length of vectors                                                           */
233*a58d3d2aSXin Li     const opus_int                  order,                                  /* I    Max lag for correlation                                                     */
234*a58d3d2aSXin Li     opus_int32                      *Xt,                                    /* O    Pointer to X'*t correlation vector [order]                                  */
235*a58d3d2aSXin Li     const opus_int                  rshifts,                                /* I    Right shifts of correlations                                                */
236*a58d3d2aSXin Li     int                             arch                                    /* I    Run-time architecture                                                       */
237*a58d3d2aSXin Li );
238*a58d3d2aSXin Li 
239*a58d3d2aSXin Li #ifndef FORCE_CPP_BUILD
240*a58d3d2aSXin Li #ifdef __cplusplus
241*a58d3d2aSXin Li }
242*a58d3d2aSXin Li #endif /* __cplusplus */
243*a58d3d2aSXin Li #endif /* FORCE_CPP_BUILD */
244*a58d3d2aSXin Li #endif /* SILK_MAIN_FIX_H */
245