xref: /aosp_15_r20/external/webrtc/modules/audio_coding/codecs/ilbc/frame_classify.c (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 /******************************************************************
12 
13  iLBC Speech Coder ANSI-C Source Code
14 
15  WebRtcIlbcfix_FrameClassify.c
16 
17 ******************************************************************/
18 
19 #include "modules/audio_coding/codecs/ilbc/frame_classify.h"
20 
21 #include "modules/audio_coding/codecs/ilbc/constants.h"
22 #include "modules/audio_coding/codecs/ilbc/defines.h"
23 
24 /*----------------------------------------------------------------*
25  *  Classification of subframes to localize start state
26  *---------------------------------------------------------------*/
27 
WebRtcIlbcfix_FrameClassify(IlbcEncoder * iLBCenc_inst,int16_t * residualFIX)28 size_t WebRtcIlbcfix_FrameClassify(
29     /* (o) Index to the max-energy sub frame */
30     IlbcEncoder *iLBCenc_inst,
31     /* (i/o) the encoder state structure */
32     int16_t *residualFIX /* (i) lpc residual signal */
33                                                 ){
34   int16_t max, scale;
35   int32_t ssqEn[NSUB_MAX-1];
36   int16_t *ssqPtr;
37   int32_t *seqEnPtr;
38   int32_t maxW32;
39   int16_t scale1;
40   size_t pos;
41   size_t n;
42 
43   /*
44     Calculate the energy of each of the 80 sample blocks
45     in the draft the 4 first and last samples are windowed with 1/5...4/5
46     and 4/5...1/5 respectively. To simplify for the fixpoint we have changed
47     this to 0 0 1 1 and 1 1 0 0
48   */
49 
50   max = WebRtcSpl_MaxAbsValueW16(residualFIX, iLBCenc_inst->blockl);
51   scale = WebRtcSpl_GetSizeInBits((uint32_t)(max * max));
52 
53   /* Scale to maximum 24 bits so that it won't overflow for 76 samples */
54   scale = scale-24;
55   scale1 = WEBRTC_SPL_MAX(0, scale);
56 
57   /* Calculate energies */
58   ssqPtr=residualFIX + 2;
59   seqEnPtr=ssqEn;
60   for (n=(iLBCenc_inst->nsub-1); n>0; n--) {
61     (*seqEnPtr) = WebRtcSpl_DotProductWithScale(ssqPtr, ssqPtr, 76, scale1);
62     ssqPtr += 40;
63     seqEnPtr++;
64   }
65 
66   /* Scale to maximum 20 bits in order to allow for the 11 bit window */
67   maxW32 = WebRtcSpl_MaxValueW32(ssqEn, iLBCenc_inst->nsub - 1);
68   scale = WebRtcSpl_GetSizeInBits(maxW32) - 20;
69   scale1 = WEBRTC_SPL_MAX(0, scale);
70 
71   /* Window each 80 block with the ssqEn_winTbl window to give higher probability for
72      the blocks in the middle
73   */
74   seqEnPtr=ssqEn;
75   if (iLBCenc_inst->mode==20) {
76     ssqPtr=(int16_t*)WebRtcIlbcfix_kStartSequenceEnrgWin+1;
77   } else {
78     ssqPtr=(int16_t*)WebRtcIlbcfix_kStartSequenceEnrgWin;
79   }
80   for (n=(iLBCenc_inst->nsub-1); n>0; n--) {
81     (*seqEnPtr)=WEBRTC_SPL_MUL(((*seqEnPtr)>>scale1), (*ssqPtr));
82     seqEnPtr++;
83     ssqPtr++;
84   }
85 
86   /* Extract the best choise of start state */
87   pos = WebRtcSpl_MaxIndexW32(ssqEn, iLBCenc_inst->nsub - 1) + 1;
88 
89   return(pos);
90 }
91