Coverage Report

Created: 2025-11-16 07:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/opus/celt/pitch.c
Line
Count
Source
1
/* Copyright (c) 2007-2008 CSIRO
2
   Copyright (c) 2007-2009 Xiph.Org Foundation
3
   Written by Jean-Marc Valin */
4
/**
5
   @file pitch.c
6
   @brief Pitch analysis
7
 */
8
9
/*
10
   Redistribution and use in source and binary forms, with or without
11
   modification, are permitted provided that the following conditions
12
   are met:
13
14
   - Redistributions of source code must retain the above copyright
15
   notice, this list of conditions and the following disclaimer.
16
17
   - Redistributions in binary form must reproduce the above copyright
18
   notice, this list of conditions and the following disclaimer in the
19
   documentation and/or other materials provided with the distribution.
20
21
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
25
   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
*/
33
34
#ifdef HAVE_CONFIG_H
35
#include "config.h"
36
#endif
37
38
#include "pitch.h"
39
#include "os_support.h"
40
#include "modes.h"
41
#include "stack_alloc.h"
42
#include "mathops.h"
43
#include "celt_lpc.h"
44
45
static void find_best_pitch(opus_val32 *xcorr, opus_val16 *y, int len,
46
                            int max_pitch, int *best_pitch
47
#ifdef FIXED_POINT
48
                            , int yshift, opus_val32 maxcorr
49
#endif
50
                            )
51
12.4M
{
52
12.4M
   int i, j;
53
12.4M
   opus_val32 Syy=1;
54
12.4M
   opus_val16 best_num[2];
55
12.4M
   opus_val32 best_den[2];
56
#ifdef FIXED_POINT
57
   int xshift;
58
59
   xshift = celt_ilog2(maxcorr)-14;
60
#endif
61
62
12.4M
   best_num[0] = -1;
63
12.4M
   best_num[1] = -1;
64
12.4M
   best_den[0] = 0;
65
12.4M
   best_den[1] = 0;
66
12.4M
   best_pitch[0] = 0;
67
12.4M
   best_pitch[1] = 1;
68
3.12G
   for (j=0;j<len;j++)
69
3.11G
      Syy = ADD32(Syy, SHR32(MULT16_16(y[j],y[j]), yshift));
70
4.55G
   for (i=0;i<max_pitch;i++)
71
4.54G
   {
72
4.54G
      if (xcorr[i]>0)
73
1.23G
      {
74
1.23G
         opus_val16 num;
75
1.23G
         opus_val32 xcorr16;
76
1.23G
         xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift));
77
#ifndef FIXED_POINT
78
         /* Considering the range of xcorr16, this should avoid both underflows
79
            and overflows (inf) when squaring xcorr16 */
80
         xcorr16 *= 1e-12f;
81
#endif
82
1.23G
         num = MULT16_16_Q15(xcorr16,xcorr16);
83
1.23G
         if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy))
84
62.3M
         {
85
62.3M
            if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy))
86
40.2M
            {
87
40.2M
               best_num[1] = best_num[0];
88
40.2M
               best_den[1] = best_den[0];
89
40.2M
               best_pitch[1] = best_pitch[0];
90
40.2M
               best_num[0] = num;
91
40.2M
               best_den[0] = Syy;
92
40.2M
               best_pitch[0] = i;
93
40.2M
            } else {
94
22.0M
               best_num[1] = num;
95
22.0M
               best_den[1] = Syy;
96
22.0M
               best_pitch[1] = i;
97
22.0M
            }
98
62.3M
         }
99
1.23G
      }
100
4.54G
      Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift);
101
4.54G
      Syy = MAX32(1, Syy);
102
4.54G
   }
103
12.4M
}
pitch.c:find_best_pitch
Line
Count
Source
51
10.8M
{
52
10.8M
   int i, j;
53
10.8M
   opus_val32 Syy=1;
54
10.8M
   opus_val16 best_num[2];
55
10.8M
   opus_val32 best_den[2];
56
10.8M
#ifdef FIXED_POINT
57
10.8M
   int xshift;
58
59
10.8M
   xshift = celt_ilog2(maxcorr)-14;
60
10.8M
#endif
61
62
10.8M
   best_num[0] = -1;
63
10.8M
   best_num[1] = -1;
64
10.8M
   best_den[0] = 0;
65
10.8M
   best_den[1] = 0;
66
10.8M
   best_pitch[0] = 0;
67
10.8M
   best_pitch[1] = 1;
68
2.86G
   for (j=0;j<len;j++)
69
2.85G
      Syy = ADD32(Syy, SHR32(MULT16_16(y[j],y[j]), yshift));
70
3.97G
   for (i=0;i<max_pitch;i++)
71
3.96G
   {
72
3.96G
      if (xcorr[i]>0)
73
1.13G
      {
74
1.13G
         opus_val16 num;
75
1.13G
         opus_val32 xcorr16;
76
1.13G
         xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift));
77
#ifndef FIXED_POINT
78
         /* Considering the range of xcorr16, this should avoid both underflows
79
            and overflows (inf) when squaring xcorr16 */
80
         xcorr16 *= 1e-12f;
81
#endif
82
1.13G
         num = MULT16_16_Q15(xcorr16,xcorr16);
83
1.13G
         if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy))
84
49.8M
         {
85
49.8M
            if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy))
86
31.8M
            {
87
31.8M
               best_num[1] = best_num[0];
88
31.8M
               best_den[1] = best_den[0];
89
31.8M
               best_pitch[1] = best_pitch[0];
90
31.8M
               best_num[0] = num;
91
31.8M
               best_den[0] = Syy;
92
31.8M
               best_pitch[0] = i;
93
31.8M
            } else {
94
17.9M
               best_num[1] = num;
95
17.9M
               best_den[1] = Syy;
96
17.9M
               best_pitch[1] = i;
97
17.9M
            }
98
49.8M
         }
99
1.13G
      }
100
3.96G
      Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift);
101
3.96G
      Syy = MAX32(1, Syy);
102
3.96G
   }
103
10.8M
}
pitch.c:find_best_pitch
Line
Count
Source
51
1.62M
{
52
1.62M
   int i, j;
53
1.62M
   opus_val32 Syy=1;
54
1.62M
   opus_val16 best_num[2];
55
1.62M
   opus_val32 best_den[2];
56
#ifdef FIXED_POINT
57
   int xshift;
58
59
   xshift = celt_ilog2(maxcorr)-14;
60
#endif
61
62
1.62M
   best_num[0] = -1;
63
1.62M
   best_num[1] = -1;
64
1.62M
   best_den[0] = 0;
65
1.62M
   best_den[1] = 0;
66
1.62M
   best_pitch[0] = 0;
67
1.62M
   best_pitch[1] = 1;
68
268M
   for (j=0;j<len;j++)
69
266M
      Syy = ADD32(Syy, SHR32(MULT16_16(y[j],y[j]), yshift));
70
586M
   for (i=0;i<max_pitch;i++)
71
584M
   {
72
584M
      if (xcorr[i]>0)
73
96.1M
      {
74
96.1M
         opus_val16 num;
75
96.1M
         opus_val32 xcorr16;
76
96.1M
         xcorr16 = EXTRACT16(VSHR32(xcorr[i], xshift));
77
96.1M
#ifndef FIXED_POINT
78
         /* Considering the range of xcorr16, this should avoid both underflows
79
            and overflows (inf) when squaring xcorr16 */
80
96.1M
         xcorr16 *= 1e-12f;
81
96.1M
#endif
82
96.1M
         num = MULT16_16_Q15(xcorr16,xcorr16);
83
96.1M
         if (MULT16_32_Q15(num,best_den[1]) > MULT16_32_Q15(best_num[1],Syy))
84
12.5M
         {
85
12.5M
            if (MULT16_32_Q15(num,best_den[0]) > MULT16_32_Q15(best_num[0],Syy))
86
8.39M
            {
87
8.39M
               best_num[1] = best_num[0];
88
8.39M
               best_den[1] = best_den[0];
89
8.39M
               best_pitch[1] = best_pitch[0];
90
8.39M
               best_num[0] = num;
91
8.39M
               best_den[0] = Syy;
92
8.39M
               best_pitch[0] = i;
93
8.39M
            } else {
94
4.13M
               best_num[1] = num;
95
4.13M
               best_den[1] = Syy;
96
4.13M
               best_pitch[1] = i;
97
4.13M
            }
98
12.5M
         }
99
96.1M
      }
100
584M
      Syy += SHR32(MULT16_16(y[i+len],y[i+len]),yshift) - SHR32(MULT16_16(y[i],y[i]),yshift);
101
584M
      Syy = MAX32(1, Syy);
102
584M
   }
103
1.62M
}
104
105
static void celt_fir5(opus_val16 *x,
106
         const opus_val16 *num,
107
         int N)
108
12.4M
{
109
12.4M
   int i;
110
12.4M
   opus_val16 num0, num1, num2, num3, num4;
111
12.4M
   opus_val32 mem0, mem1, mem2, mem3, mem4;
112
12.4M
   num0=num[0];
113
12.4M
   num1=num[1];
114
12.4M
   num2=num[2];
115
12.4M
   num3=num[3];
116
12.4M
   num4=num[4];
117
12.4M
   mem0=0;
118
12.4M
   mem1=0;
119
12.4M
   mem2=0;
120
12.4M
   mem3=0;
121
12.4M
   mem4=0;
122
10.5G
   for (i=0;i<N;i++)
123
10.5G
   {
124
10.5G
      opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT);
125
10.5G
      sum = MAC16_16(sum,num0,mem0);
126
10.5G
      sum = MAC16_16(sum,num1,mem1);
127
10.5G
      sum = MAC16_16(sum,num2,mem2);
128
10.5G
      sum = MAC16_16(sum,num3,mem3);
129
10.5G
      sum = MAC16_16(sum,num4,mem4);
130
10.5G
      mem4 = mem3;
131
10.5G
      mem3 = mem2;
132
10.5G
      mem2 = mem1;
133
10.5G
      mem1 = mem0;
134
10.5G
      mem0 = x[i];
135
10.5G
      x[i] = ROUND16(sum, SIG_SHIFT);
136
10.5G
   }
137
12.4M
}
pitch.c:celt_fir5
Line
Count
Source
108
6.23M
{
109
6.23M
   int i;
110
6.23M
   opus_val16 num0, num1, num2, num3, num4;
111
6.23M
   opus_val32 mem0, mem1, mem2, mem3, mem4;
112
6.23M
   num0=num[0];
113
6.23M
   num1=num[1];
114
6.23M
   num2=num[2];
115
6.23M
   num3=num[3];
116
6.23M
   num4=num[4];
117
6.23M
   mem0=0;
118
6.23M
   mem1=0;
119
6.23M
   mem2=0;
120
6.23M
   mem3=0;
121
6.23M
   mem4=0;
122
5.26G
   for (i=0;i<N;i++)
123
5.25G
   {
124
5.25G
      opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT);
125
5.25G
      sum = MAC16_16(sum,num0,mem0);
126
5.25G
      sum = MAC16_16(sum,num1,mem1);
127
5.25G
      sum = MAC16_16(sum,num2,mem2);
128
5.25G
      sum = MAC16_16(sum,num3,mem3);
129
5.25G
      sum = MAC16_16(sum,num4,mem4);
130
5.25G
      mem4 = mem3;
131
5.25G
      mem3 = mem2;
132
5.25G
      mem2 = mem1;
133
5.25G
      mem1 = mem0;
134
5.25G
      mem0 = x[i];
135
5.25G
      x[i] = ROUND16(sum, SIG_SHIFT);
136
5.25G
   }
137
6.23M
}
pitch.c:celt_fir5
Line
Count
Source
108
6.23M
{
109
6.23M
   int i;
110
6.23M
   opus_val16 num0, num1, num2, num3, num4;
111
6.23M
   opus_val32 mem0, mem1, mem2, mem3, mem4;
112
6.23M
   num0=num[0];
113
6.23M
   num1=num[1];
114
6.23M
   num2=num[2];
115
6.23M
   num3=num[3];
116
6.23M
   num4=num[4];
117
6.23M
   mem0=0;
118
6.23M
   mem1=0;
119
6.23M
   mem2=0;
120
6.23M
   mem3=0;
121
6.23M
   mem4=0;
122
5.26G
   for (i=0;i<N;i++)
123
5.25G
   {
124
5.25G
      opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT);
125
5.25G
      sum = MAC16_16(sum,num0,mem0);
126
5.25G
      sum = MAC16_16(sum,num1,mem1);
127
5.25G
      sum = MAC16_16(sum,num2,mem2);
128
5.25G
      sum = MAC16_16(sum,num3,mem3);
129
5.25G
      sum = MAC16_16(sum,num4,mem4);
130
5.25G
      mem4 = mem3;
131
5.25G
      mem3 = mem2;
132
5.25G
      mem2 = mem1;
133
5.25G
      mem1 = mem0;
134
5.25G
      mem0 = x[i];
135
5.25G
      x[i] = ROUND16(sum, SIG_SHIFT);
136
5.25G
   }
137
6.23M
}
138
139
140
void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x_lp,
141
      int len, int C, int factor, int arch)
142
6.23M
{
143
6.23M
   int i;
144
6.23M
   opus_val32 ac[5];
145
6.23M
   opus_val16 tmp=Q15ONE;
146
6.23M
   opus_val16 lpc[4];
147
6.23M
   opus_val16 lpc2[5];
148
6.23M
   opus_val16 c1 = QCONST16(.8f,15);
149
6.23M
   int offset;
150
#ifdef FIXED_POINT
151
   int shift;
152
   opus_val32 maxabs;
153
#endif
154
6.23M
   offset = factor/2;
155
#ifdef FIXED_POINT
156
   maxabs = celt_maxabs32(x[0], len*factor);
157
5.42M
   if (C==2)
158
1.42M
   {
159
1.42M
      opus_val32 maxabs_1 = celt_maxabs32(x[1], len*factor);
160
1.42M
      maxabs = MAX32(maxabs, maxabs_1);
161
1.42M
   }
162
5.42M
   if (maxabs<1)
163
1.43k
      maxabs=1;
164
   shift = celt_ilog2(maxabs)-10;
165
5.42M
   if (shift<0)
166
4.55M
      shift=0;
167
5.42M
   if (C==2)
168
1.42M
      shift++;
169
4.66G
   for (i=1;i<len;i++)
170
4.66G
      x_lp[i] = SHR32(x[0][(factor*i-offset)], shift+2) + SHR32(x[0][(factor*i+offset)], shift+2) + SHR32(x[0][factor*i], shift+1);
171
5.42M
   x_lp[0] = SHR32(x[0][offset], shift+2) + SHR32(x[0][0], shift+1);
172
5.42M
   if (C==2)
173
1.42M
   {
174
1.31G
      for (i=1;i<len;i++)
175
1.31G
         x_lp[i] += SHR32(x[1][(factor*i-offset)], shift+2) + SHR32(x[1][(factor*i+offset)], shift+2) + SHR32(x[1][factor*i], shift+1);
176
1.42M
      x_lp[0] += SHR32(x[1][offset], shift+2) + SHR32(x[1][0], shift+1);
177
1.42M
   }
178
#else
179
587M
   for (i=1;i<len;i++)
180
586M
      x_lp[i] = .25f*x[0][(factor*i-offset)] + .25f*x[0][(factor*i+offset)] + .5f*x[0][factor*i];
181
   x_lp[0] = .25f*x[0][offset] + .5f*x[0][0];
182
810k
   if (C==2)
183
271k
   {
184
208M
      for (i=1;i<len;i++)
185
208M
         x_lp[i] += .25f*x[1][(factor*i-offset)] + .25f*x[1][(factor*i+offset)] + .5f*x[1][factor*i];
186
271k
      x_lp[0] += .25f*x[1][offset] + .5f*x[1][0];
187
271k
   }
188
#endif
189
6.23M
   _celt_autocorr(x_lp, ac, NULL, 0,
190
6.23M
                  4, len, arch);
191
192
   /* Noise floor -40 dB */
193
#ifdef FIXED_POINT
194
5.42M
   ac[0] += SHR32(ac[0],13);
195
#else
196
   ac[0] *= 1.0001f;
197
#endif
198
   /* Lag windowing */
199
31.1M
   for (i=1;i<=4;i++)
200
24.9M
   {
201
      /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
202
#ifdef FIXED_POINT
203
21.6M
      ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
204
#else
205
      ac[i] -= ac[i]*(.008f*i)*(.008f*i);
206
#endif
207
24.9M
   }
208
209
6.23M
   _celt_lpc(lpc, ac, 4);
210
31.1M
   for (i=0;i<4;i++)
211
24.9M
   {
212
24.9M
      tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp);
213
24.9M
      lpc[i] = MULT16_16_Q15(lpc[i], tmp);
214
24.9M
   }
215
   /* Add a zero */
216
6.23M
   lpc2[0] = lpc[0] + QCONST16(.8f,SIG_SHIFT);
217
6.23M
   lpc2[1] = lpc[1] + MULT16_16_Q15(c1,lpc[0]);
218
6.23M
   lpc2[2] = lpc[2] + MULT16_16_Q15(c1,lpc[1]);
219
6.23M
   lpc2[3] = lpc[3] + MULT16_16_Q15(c1,lpc[2]);
220
6.23M
   lpc2[4] = MULT16_16_Q15(c1,lpc[3]);
221
6.23M
   celt_fir5(x_lp, lpc2, len);
222
6.23M
}
pitch_downsample
Line
Count
Source
142
5.42M
{
143
5.42M
   int i;
144
5.42M
   opus_val32 ac[5];
145
5.42M
   opus_val16 tmp=Q15ONE;
146
5.42M
   opus_val16 lpc[4];
147
5.42M
   opus_val16 lpc2[5];
148
5.42M
   opus_val16 c1 = QCONST16(.8f,15);
149
5.42M
   int offset;
150
5.42M
#ifdef FIXED_POINT
151
5.42M
   int shift;
152
5.42M
   opus_val32 maxabs;
153
5.42M
#endif
154
5.42M
   offset = factor/2;
155
5.42M
#ifdef FIXED_POINT
156
5.42M
   maxabs = celt_maxabs32(x[0], len*factor);
157
5.42M
   if (C==2)
158
1.42M
   {
159
1.42M
      opus_val32 maxabs_1 = celt_maxabs32(x[1], len*factor);
160
1.42M
      maxabs = MAX32(maxabs, maxabs_1);
161
1.42M
   }
162
5.42M
   if (maxabs<1)
163
1.43k
      maxabs=1;
164
5.42M
   shift = celt_ilog2(maxabs)-10;
165
5.42M
   if (shift<0)
166
4.55M
      shift=0;
167
5.42M
   if (C==2)
168
1.42M
      shift++;
169
4.66G
   for (i=1;i<len;i++)
170
4.66G
      x_lp[i] = SHR32(x[0][(factor*i-offset)], shift+2) + SHR32(x[0][(factor*i+offset)], shift+2) + SHR32(x[0][factor*i], shift+1);
171
5.42M
   x_lp[0] = SHR32(x[0][offset], shift+2) + SHR32(x[0][0], shift+1);
172
5.42M
   if (C==2)
173
1.42M
   {
174
1.31G
      for (i=1;i<len;i++)
175
1.31G
         x_lp[i] += SHR32(x[1][(factor*i-offset)], shift+2) + SHR32(x[1][(factor*i+offset)], shift+2) + SHR32(x[1][factor*i], shift+1);
176
1.42M
      x_lp[0] += SHR32(x[1][offset], shift+2) + SHR32(x[1][0], shift+1);
177
1.42M
   }
178
#else
179
   for (i=1;i<len;i++)
180
      x_lp[i] = .25f*x[0][(factor*i-offset)] + .25f*x[0][(factor*i+offset)] + .5f*x[0][factor*i];
181
   x_lp[0] = .25f*x[0][offset] + .5f*x[0][0];
182
   if (C==2)
183
   {
184
      for (i=1;i<len;i++)
185
         x_lp[i] += .25f*x[1][(factor*i-offset)] + .25f*x[1][(factor*i+offset)] + .5f*x[1][factor*i];
186
      x_lp[0] += .25f*x[1][offset] + .5f*x[1][0];
187
   }
188
#endif
189
5.42M
   _celt_autocorr(x_lp, ac, NULL, 0,
190
5.42M
                  4, len, arch);
191
192
   /* Noise floor -40 dB */
193
5.42M
#ifdef FIXED_POINT
194
5.42M
   ac[0] += SHR32(ac[0],13);
195
#else
196
   ac[0] *= 1.0001f;
197
#endif
198
   /* Lag windowing */
199
27.1M
   for (i=1;i<=4;i++)
200
21.6M
   {
201
      /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
202
21.6M
#ifdef FIXED_POINT
203
21.6M
      ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
204
#else
205
      ac[i] -= ac[i]*(.008f*i)*(.008f*i);
206
#endif
207
21.6M
   }
208
209
5.42M
   _celt_lpc(lpc, ac, 4);
210
27.1M
   for (i=0;i<4;i++)
211
21.6M
   {
212
21.6M
      tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp);
213
21.6M
      lpc[i] = MULT16_16_Q15(lpc[i], tmp);
214
21.6M
   }
215
   /* Add a zero */
216
5.42M
   lpc2[0] = lpc[0] + QCONST16(.8f,SIG_SHIFT);
217
5.42M
   lpc2[1] = lpc[1] + MULT16_16_Q15(c1,lpc[0]);
218
5.42M
   lpc2[2] = lpc[2] + MULT16_16_Q15(c1,lpc[1]);
219
5.42M
   lpc2[3] = lpc[3] + MULT16_16_Q15(c1,lpc[2]);
220
5.42M
   lpc2[4] = MULT16_16_Q15(c1,lpc[3]);
221
5.42M
   celt_fir5(x_lp, lpc2, len);
222
5.42M
}
pitch_downsample
Line
Count
Source
142
810k
{
143
810k
   int i;
144
810k
   opus_val32 ac[5];
145
810k
   opus_val16 tmp=Q15ONE;
146
810k
   opus_val16 lpc[4];
147
810k
   opus_val16 lpc2[5];
148
810k
   opus_val16 c1 = QCONST16(.8f,15);
149
810k
   int offset;
150
#ifdef FIXED_POINT
151
   int shift;
152
   opus_val32 maxabs;
153
#endif
154
810k
   offset = factor/2;
155
#ifdef FIXED_POINT
156
   maxabs = celt_maxabs32(x[0], len*factor);
157
   if (C==2)
158
   {
159
      opus_val32 maxabs_1 = celt_maxabs32(x[1], len*factor);
160
      maxabs = MAX32(maxabs, maxabs_1);
161
   }
162
   if (maxabs<1)
163
      maxabs=1;
164
   shift = celt_ilog2(maxabs)-10;
165
   if (shift<0)
166
      shift=0;
167
   if (C==2)
168
      shift++;
169
   for (i=1;i<len;i++)
170
      x_lp[i] = SHR32(x[0][(factor*i-offset)], shift+2) + SHR32(x[0][(factor*i+offset)], shift+2) + SHR32(x[0][factor*i], shift+1);
171
   x_lp[0] = SHR32(x[0][offset], shift+2) + SHR32(x[0][0], shift+1);
172
   if (C==2)
173
   {
174
      for (i=1;i<len;i++)
175
         x_lp[i] += SHR32(x[1][(factor*i-offset)], shift+2) + SHR32(x[1][(factor*i+offset)], shift+2) + SHR32(x[1][factor*i], shift+1);
176
      x_lp[0] += SHR32(x[1][offset], shift+2) + SHR32(x[1][0], shift+1);
177
   }
178
#else
179
587M
   for (i=1;i<len;i++)
180
586M
      x_lp[i] = .25f*x[0][(factor*i-offset)] + .25f*x[0][(factor*i+offset)] + .5f*x[0][factor*i];
181
810k
   x_lp[0] = .25f*x[0][offset] + .5f*x[0][0];
182
810k
   if (C==2)
183
271k
   {
184
208M
      for (i=1;i<len;i++)
185
208M
         x_lp[i] += .25f*x[1][(factor*i-offset)] + .25f*x[1][(factor*i+offset)] + .5f*x[1][factor*i];
186
271k
      x_lp[0] += .25f*x[1][offset] + .5f*x[1][0];
187
271k
   }
188
810k
#endif
189
810k
   _celt_autocorr(x_lp, ac, NULL, 0,
190
810k
                  4, len, arch);
191
192
   /* Noise floor -40 dB */
193
#ifdef FIXED_POINT
194
   ac[0] += SHR32(ac[0],13);
195
#else
196
810k
   ac[0] *= 1.0001f;
197
810k
#endif
198
   /* Lag windowing */
199
4.05M
   for (i=1;i<=4;i++)
200
3.24M
   {
201
      /*ac[i] *= exp(-.5*(2*M_PI*.002*i)*(2*M_PI*.002*i));*/
202
#ifdef FIXED_POINT
203
      ac[i] -= MULT16_32_Q15(2*i*i, ac[i]);
204
#else
205
3.24M
      ac[i] -= ac[i]*(.008f*i)*(.008f*i);
206
3.24M
#endif
207
3.24M
   }
208
209
810k
   _celt_lpc(lpc, ac, 4);
210
4.05M
   for (i=0;i<4;i++)
211
3.24M
   {
212
3.24M
      tmp = MULT16_16_Q15(QCONST16(.9f,15), tmp);
213
3.24M
      lpc[i] = MULT16_16_Q15(lpc[i], tmp);
214
3.24M
   }
215
   /* Add a zero */
216
810k
   lpc2[0] = lpc[0] + QCONST16(.8f,SIG_SHIFT);
217
810k
   lpc2[1] = lpc[1] + MULT16_16_Q15(c1,lpc[0]);
218
810k
   lpc2[2] = lpc[2] + MULT16_16_Q15(c1,lpc[1]);
219
810k
   lpc2[3] = lpc[3] + MULT16_16_Q15(c1,lpc[2]);
220
810k
   lpc2[4] = MULT16_16_Q15(c1,lpc[3]);
221
810k
   celt_fir5(x_lp, lpc2, len);
222
810k
}
223
224
/* Pure C implementation. */
225
#ifdef FIXED_POINT
226
opus_val32
227
#else
228
void
229
#endif
230
celt_pitch_xcorr_c(const opus_val16 *_x, const opus_val16 *_y,
231
      opus_val32 *xcorr, int len, int max_pitch, int arch)
232
633M
{
233
234
#if 0 /* This is a simple version of the pitch correlation that should work
235
         well on DSPs like Blackfin and TI C5x/C6x */
236
   int i, j;
237
#ifdef FIXED_POINT
238
   opus_val32 maxcorr=1;
239
#endif
240
#if !defined(OVERRIDE_PITCH_XCORR)
241
   (void)arch;
242
#endif
243
   for (i=0;i<max_pitch;i++)
244
   {
245
      opus_val32 sum = 0;
246
      for (j=0;j<len;j++)
247
         sum = MAC16_16(sum, _x[j], _y[i+j]);
248
      xcorr[i] = sum;
249
#ifdef FIXED_POINT
250
      maxcorr = MAX32(maxcorr, sum);
251
#endif
252
   }
253
#ifdef FIXED_POINT
254
   return maxcorr;
255
#endif
256
257
#else /* Unrolled version of the pitch correlation -- runs faster on x86 and ARM */
258
633M
   int i;
259
   /*The EDSP version requires that max_pitch is at least 1, and that _x is
260
      32-bit aligned.
261
     Since it's hard to put asserts in assembly, put them here.*/
262
#ifdef FIXED_POINT
263
   opus_val32 maxcorr=1;
264
#endif
265
633M
   celt_assert(max_pitch>0);
266
633M
   celt_sig_assert(((size_t)_x&3)==0);
267
2.47G
   for (i=0;i<max_pitch-3;i+=4)
268
1.84G
   {
269
1.84G
      opus_val32 sum[4]={0,0,0,0};
270
#if defined(OPUS_CHECK_ASM) && defined(FIXED_POINT)
271
      {
272
         opus_val32 sum_c[4]={0,0,0,0};
273
         xcorr_kernel_c(_x, _y+i, sum_c, len);
274
#endif
275
1.84G
         xcorr_kernel(_x, _y+i, sum, len, arch);
276
#if defined(OPUS_CHECK_ASM) && defined(FIXED_POINT)
277
1.84G
         celt_assert(memcmp(sum, sum_c, sizeof(sum)) == 0);
278
1.84G
      }
279
0
#endif
280
0
      xcorr[i]=sum[0];
281
1.84G
      xcorr[i+1]=sum[1];
282
1.84G
      xcorr[i+2]=sum[2];
283
1.84G
      xcorr[i+3]=sum[3];
284
#ifdef FIXED_POINT
285
1.84G
      sum[0] = MAX32(sum[0], sum[1]);
286
1.84G
      sum[2] = MAX32(sum[2], sum[3]);
287
1.84G
      sum[0] = MAX32(sum[0], sum[2]);
288
1.84G
      maxcorr = MAX32(maxcorr, sum[0]);
289
#endif
290
1.84G
   }
291
   /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */
292
1.72G
   for (;i<max_pitch;i++)
293
1.08G
   {
294
1.08G
      opus_val32 sum;
295
1.08G
      sum = celt_inner_prod(_x, _y+i, len, arch);
296
1.08G
      xcorr[i] = sum;
297
#ifdef FIXED_POINT
298
1.08G
      maxcorr = MAX32(maxcorr, sum);
299
#endif
300
1.08G
   }
301
#ifdef FIXED_POINT
302
   return maxcorr;
303
#endif
304
633M
#endif
305
633M
}
celt_pitch_xcorr_c
Line
Count
Source
232
633M
{
233
234
#if 0 /* This is a simple version of the pitch correlation that should work
235
         well on DSPs like Blackfin and TI C5x/C6x */
236
   int i, j;
237
#ifdef FIXED_POINT
238
   opus_val32 maxcorr=1;
239
#endif
240
#if !defined(OVERRIDE_PITCH_XCORR)
241
   (void)arch;
242
#endif
243
   for (i=0;i<max_pitch;i++)
244
   {
245
      opus_val32 sum = 0;
246
      for (j=0;j<len;j++)
247
         sum = MAC16_16(sum, _x[j], _y[i+j]);
248
      xcorr[i] = sum;
249
#ifdef FIXED_POINT
250
      maxcorr = MAX32(maxcorr, sum);
251
#endif
252
   }
253
#ifdef FIXED_POINT
254
   return maxcorr;
255
#endif
256
257
#else /* Unrolled version of the pitch correlation -- runs faster on x86 and ARM */
258
633M
   int i;
259
   /*The EDSP version requires that max_pitch is at least 1, and that _x is
260
      32-bit aligned.
261
     Since it's hard to put asserts in assembly, put them here.*/
262
633M
#ifdef FIXED_POINT
263
633M
   opus_val32 maxcorr=1;
264
633M
#endif
265
633M
   celt_assert(max_pitch>0);
266
633M
   celt_sig_assert(((size_t)_x&3)==0);
267
2.47G
   for (i=0;i<max_pitch-3;i+=4)
268
1.84G
   {
269
1.84G
      opus_val32 sum[4]={0,0,0,0};
270
1.84G
#if defined(OPUS_CHECK_ASM) && defined(FIXED_POINT)
271
1.84G
      {
272
1.84G
         opus_val32 sum_c[4]={0,0,0,0};
273
1.84G
         xcorr_kernel_c(_x, _y+i, sum_c, len);
274
1.84G
#endif
275
1.84G
         xcorr_kernel(_x, _y+i, sum, len, arch);
276
1.84G
#if defined(OPUS_CHECK_ASM) && defined(FIXED_POINT)
277
1.84G
         celt_assert(memcmp(sum, sum_c, sizeof(sum)) == 0);
278
1.84G
      }
279
0
#endif
280
0
      xcorr[i]=sum[0];
281
1.84G
      xcorr[i+1]=sum[1];
282
1.84G
      xcorr[i+2]=sum[2];
283
1.84G
      xcorr[i+3]=sum[3];
284
1.84G
#ifdef FIXED_POINT
285
1.84G
      sum[0] = MAX32(sum[0], sum[1]);
286
1.84G
      sum[2] = MAX32(sum[2], sum[3]);
287
1.84G
      sum[0] = MAX32(sum[0], sum[2]);
288
1.84G
      maxcorr = MAX32(maxcorr, sum[0]);
289
1.84G
#endif
290
1.84G
   }
291
   /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */
292
1.72G
   for (;i<max_pitch;i++)
293
1.08G
   {
294
1.08G
      opus_val32 sum;
295
1.08G
      sum = celt_inner_prod(_x, _y+i, len, arch);
296
1.08G
      xcorr[i] = sum;
297
1.08G
#ifdef FIXED_POINT
298
1.08G
      maxcorr = MAX32(maxcorr, sum);
299
1.08G
#endif
300
1.08G
   }
301
633M
#ifdef FIXED_POINT
302
633M
   return maxcorr;
303
633M
#endif
304
633M
#endif
305
633M
}
Unexecuted instantiation: celt_pitch_xcorr_c
306
307
void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTRICT y,
308
                  int len, int max_pitch, int *pitch, int arch)
309
6.23M
{
310
6.23M
   int i, j;
311
6.23M
   int lag;
312
6.23M
   int best_pitch[2]={0,0};
313
6.23M
   VARDECL(opus_val16, x_lp4);
314
6.23M
   VARDECL(opus_val16, y_lp4);
315
6.23M
   VARDECL(opus_val32, xcorr);
316
#ifdef FIXED_POINT
317
   opus_val32 maxcorr;
318
   opus_val32 xmax, ymax;
319
   int shift=0;
320
#endif
321
6.23M
   int offset;
322
323
6.23M
   SAVE_STACK;
324
325
6.23M
   celt_assert(len>0);
326
6.23M
   celt_assert(max_pitch>0);
327
6.23M
   lag = len+max_pitch;
328
329
6.23M
   ALLOC(x_lp4, len>>2, opus_val16);
330
6.23M
   ALLOC(y_lp4, lag>>2, opus_val16);
331
6.23M
   ALLOC(xcorr, max_pitch>>1, opus_val32);
332
333
   /* Downsample by 2 again */
334
1.04G
   for (j=0;j<len>>2;j++)
335
1.03G
      x_lp4[j] = x_lp[2*j];
336
2.55G
   for (j=0;j<lag>>2;j++)
337
2.55G
      y_lp4[j] = y[2*j];
338
339
#ifdef FIXED_POINT
340
   xmax = celt_maxabs16(x_lp4, len>>2);
341
   ymax = celt_maxabs16(y_lp4, lag>>2);
342
5.42M
   shift = celt_ilog2(MAX32(1, MAX32(xmax, ymax))) - 14 + celt_ilog2(len)/2;
343
5.42M
   if (shift>0)
344
5.16k
   {
345
1.73M
      for (j=0;j<len>>2;j++)
346
1.72M
         x_lp4[j] = SHR16(x_lp4[j], shift);
347
2.56M
      for (j=0;j<lag>>2;j++)
348
2.55M
         y_lp4[j] = SHR16(y_lp4[j], shift);
349
      /* Use double the shift for a MAC */
350
5.16k
      shift *= 2;
351
5.41M
   } else {
352
5.41M
      shift = 0;
353
5.41M
   }
354
#endif
355
356
   /* Coarse search with 4x decimation */
357
358
#ifdef FIXED_POINT
359
   maxcorr =
360
#endif
361
6.23M
   celt_pitch_xcorr(x_lp4, y_lp4, xcorr, len>>2, max_pitch>>2, arch);
362
363
6.23M
   find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch
364
#ifdef FIXED_POINT
365
                   , 0, maxcorr
366
#endif
367
6.23M
                   );
368
369
   /* Finer search with 2x decimation */
370
#ifdef FIXED_POINT
371
   maxcorr=1;
372
#endif
373
3.03G
   for (i=0;i<max_pitch>>1;i++)
374
3.03G
   {
375
3.03G
      opus_val32 sum;
376
3.03G
      xcorr[i] = 0;
377
3.03G
      if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2)
378
2.97G
         continue;
379
#ifdef FIXED_POINT
380
45.4M
      sum = 0;
381
15.8G
      for (j=0;j<len>>1;j++)
382
15.7G
         sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift);
383
#else
384
7.77M
      sum = celt_inner_prod(x_lp, y+i, len>>1, arch);
385
#endif
386
53.2M
      xcorr[i] = MAX32(-1, sum);
387
#ifdef FIXED_POINT
388
45.4M
      maxcorr = MAX32(maxcorr, sum);
389
#endif
390
7.77M
   }
391
6.23M
   find_best_pitch(xcorr, y, len>>1, max_pitch>>1, best_pitch
392
#ifdef FIXED_POINT
393
                   , shift+1, maxcorr
394
#endif
395
6.23M
                   );
396
397
   /* Refine by pseudo-interpolation */
398
6.23M
   if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1)
399
5.96M
   {
400
5.96M
      opus_val32 a, b, c;
401
5.96M
      a = xcorr[best_pitch[0]-1];
402
5.96M
      b = xcorr[best_pitch[0]];
403
5.96M
      c = xcorr[best_pitch[0]+1];
404
5.96M
      if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a))
405
2.19M
         offset = 1;
406
3.76M
      else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c))
407
164k
         offset = -1;
408
3.60M
      else
409
3.60M
         offset = 0;
410
5.96M
   } else {
411
272k
      offset = 0;
412
272k
   }
413
6.23M
   *pitch = 2*best_pitch[0]-offset;
414
415
6.23M
   RESTORE_STACK;
416
6.23M
}
pitch_search
Line
Count
Source
309
5.42M
{
310
5.42M
   int i, j;
311
5.42M
   int lag;
312
5.42M
   int best_pitch[2]={0,0};
313
5.42M
   VARDECL(opus_val16, x_lp4);
314
5.42M
   VARDECL(opus_val16, y_lp4);
315
5.42M
   VARDECL(opus_val32, xcorr);
316
5.42M
#ifdef FIXED_POINT
317
5.42M
   opus_val32 maxcorr;
318
5.42M
   opus_val32 xmax, ymax;
319
5.42M
   int shift=0;
320
5.42M
#endif
321
5.42M
   int offset;
322
323
5.42M
   SAVE_STACK;
324
325
5.42M
   celt_assert(len>0);
326
5.42M
   celt_assert(max_pitch>0);
327
5.42M
   lag = len+max_pitch;
328
329
5.42M
   ALLOC(x_lp4, len>>2, opus_val16);
330
5.42M
   ALLOC(y_lp4, lag>>2, opus_val16);
331
5.42M
   ALLOC(xcorr, max_pitch>>1, opus_val32);
332
333
   /* Downsample by 2 again */
334
955M
   for (j=0;j<len>>2;j++)
335
950M
      x_lp4[j] = x_lp[2*j];
336
2.27G
   for (j=0;j<lag>>2;j++)
337
2.26G
      y_lp4[j] = y[2*j];
338
339
5.42M
#ifdef FIXED_POINT
340
5.42M
   xmax = celt_maxabs16(x_lp4, len>>2);
341
5.42M
   ymax = celt_maxabs16(y_lp4, lag>>2);
342
5.42M
   shift = celt_ilog2(MAX32(1, MAX32(xmax, ymax))) - 14 + celt_ilog2(len)/2;
343
5.42M
   if (shift>0)
344
5.16k
   {
345
1.73M
      for (j=0;j<len>>2;j++)
346
1.72M
         x_lp4[j] = SHR16(x_lp4[j], shift);
347
2.56M
      for (j=0;j<lag>>2;j++)
348
2.55M
         y_lp4[j] = SHR16(y_lp4[j], shift);
349
      /* Use double the shift for a MAC */
350
5.16k
      shift *= 2;
351
5.41M
   } else {
352
5.41M
      shift = 0;
353
5.41M
   }
354
5.42M
#endif
355
356
   /* Coarse search with 4x decimation */
357
358
5.42M
#ifdef FIXED_POINT
359
5.42M
   maxcorr =
360
5.42M
#endif
361
5.42M
   celt_pitch_xcorr(x_lp4, y_lp4, xcorr, len>>2, max_pitch>>2, arch);
362
363
5.42M
   find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch
364
5.42M
#ifdef FIXED_POINT
365
5.42M
                   , 0, maxcorr
366
5.42M
#endif
367
5.42M
                   );
368
369
   /* Finer search with 2x decimation */
370
5.42M
#ifdef FIXED_POINT
371
5.42M
   maxcorr=1;
372
5.42M
#endif
373
2.64G
   for (i=0;i<max_pitch>>1;i++)
374
2.64G
   {
375
2.64G
      opus_val32 sum;
376
2.64G
      xcorr[i] = 0;
377
2.64G
      if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2)
378
2.59G
         continue;
379
45.4M
#ifdef FIXED_POINT
380
45.4M
      sum = 0;
381
15.8G
      for (j=0;j<len>>1;j++)
382
15.7G
         sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift);
383
#else
384
      sum = celt_inner_prod(x_lp, y+i, len>>1, arch);
385
#endif
386
45.4M
      xcorr[i] = MAX32(-1, sum);
387
45.4M
#ifdef FIXED_POINT
388
45.4M
      maxcorr = MAX32(maxcorr, sum);
389
45.4M
#endif
390
45.4M
   }
391
5.42M
   find_best_pitch(xcorr, y, len>>1, max_pitch>>1, best_pitch
392
5.42M
#ifdef FIXED_POINT
393
5.42M
                   , shift+1, maxcorr
394
5.42M
#endif
395
5.42M
                   );
396
397
   /* Refine by pseudo-interpolation */
398
5.42M
   if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1)
399
5.19M
   {
400
5.19M
      opus_val32 a, b, c;
401
5.19M
      a = xcorr[best_pitch[0]-1];
402
5.19M
      b = xcorr[best_pitch[0]];
403
5.19M
      c = xcorr[best_pitch[0]+1];
404
5.19M
      if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a))
405
2.14M
         offset = 1;
406
3.04M
      else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c))
407
114k
         offset = -1;
408
2.92M
      else
409
2.92M
         offset = 0;
410
5.19M
   } else {
411
233k
      offset = 0;
412
233k
   }
413
5.42M
   *pitch = 2*best_pitch[0]-offset;
414
415
5.42M
   RESTORE_STACK;
416
5.42M
}
pitch_search
Line
Count
Source
309
810k
{
310
810k
   int i, j;
311
810k
   int lag;
312
810k
   int best_pitch[2]={0,0};
313
810k
   VARDECL(opus_val16, x_lp4);
314
810k
   VARDECL(opus_val16, y_lp4);
315
810k
   VARDECL(opus_val32, xcorr);
316
#ifdef FIXED_POINT
317
   opus_val32 maxcorr;
318
   opus_val32 xmax, ymax;
319
   int shift=0;
320
#endif
321
810k
   int offset;
322
323
810k
   SAVE_STACK;
324
325
810k
   celt_assert(len>0);
326
810k
   celt_assert(max_pitch>0);
327
810k
   lag = len+max_pitch;
328
329
810k
   ALLOC(x_lp4, len>>2, opus_val16);
330
810k
   ALLOC(y_lp4, lag>>2, opus_val16);
331
810k
   ALLOC(xcorr, max_pitch>>1, opus_val32);
332
333
   /* Downsample by 2 again */
334
89.6M
   for (j=0;j<len>>2;j++)
335
88.8M
      x_lp4[j] = x_lp[2*j];
336
284M
   for (j=0;j<lag>>2;j++)
337
283M
      y_lp4[j] = y[2*j];
338
339
#ifdef FIXED_POINT
340
   xmax = celt_maxabs16(x_lp4, len>>2);
341
   ymax = celt_maxabs16(y_lp4, lag>>2);
342
   shift = celt_ilog2(MAX32(1, MAX32(xmax, ymax))) - 14 + celt_ilog2(len)/2;
343
   if (shift>0)
344
   {
345
      for (j=0;j<len>>2;j++)
346
         x_lp4[j] = SHR16(x_lp4[j], shift);
347
      for (j=0;j<lag>>2;j++)
348
         y_lp4[j] = SHR16(y_lp4[j], shift);
349
      /* Use double the shift for a MAC */
350
      shift *= 2;
351
   } else {
352
      shift = 0;
353
   }
354
#endif
355
356
   /* Coarse search with 4x decimation */
357
358
#ifdef FIXED_POINT
359
   maxcorr =
360
#endif
361
810k
   celt_pitch_xcorr(x_lp4, y_lp4, xcorr, len>>2, max_pitch>>2, arch);
362
363
810k
   find_best_pitch(xcorr, y_lp4, len>>2, max_pitch>>2, best_pitch
364
#ifdef FIXED_POINT
365
                   , 0, maxcorr
366
#endif
367
810k
                   );
368
369
   /* Finer search with 2x decimation */
370
#ifdef FIXED_POINT
371
   maxcorr=1;
372
#endif
373
390M
   for (i=0;i<max_pitch>>1;i++)
374
390M
   {
375
390M
      opus_val32 sum;
376
390M
      xcorr[i] = 0;
377
390M
      if (abs(i-2*best_pitch[0])>2 && abs(i-2*best_pitch[1])>2)
378
382M
         continue;
379
#ifdef FIXED_POINT
380
      sum = 0;
381
      for (j=0;j<len>>1;j++)
382
         sum += SHR32(MULT16_16(x_lp[j],y[i+j]), shift);
383
#else
384
7.77M
      sum = celt_inner_prod(x_lp, y+i, len>>1, arch);
385
7.77M
#endif
386
7.77M
      xcorr[i] = MAX32(-1, sum);
387
#ifdef FIXED_POINT
388
      maxcorr = MAX32(maxcorr, sum);
389
#endif
390
7.77M
   }
391
810k
   find_best_pitch(xcorr, y, len>>1, max_pitch>>1, best_pitch
392
#ifdef FIXED_POINT
393
                   , shift+1, maxcorr
394
#endif
395
810k
                   );
396
397
   /* Refine by pseudo-interpolation */
398
810k
   if (best_pitch[0]>0 && best_pitch[0]<(max_pitch>>1)-1)
399
771k
   {
400
771k
      opus_val32 a, b, c;
401
771k
      a = xcorr[best_pitch[0]-1];
402
771k
      b = xcorr[best_pitch[0]];
403
771k
      c = xcorr[best_pitch[0]+1];
404
771k
      if ((c-a) > MULT16_32_Q15(QCONST16(.7f,15),b-a))
405
49.6k
         offset = 1;
406
721k
      else if ((a-c) > MULT16_32_Q15(QCONST16(.7f,15),b-c))
407
49.9k
         offset = -1;
408
671k
      else
409
671k
         offset = 0;
410
771k
   } else {
411
38.8k
      offset = 0;
412
38.8k
   }
413
810k
   *pitch = 2*best_pitch[0]-offset;
414
415
810k
   RESTORE_STACK;
416
810k
}
417
418
#ifdef FIXED_POINT
419
static opus_val16 compute_pitch_gain(opus_val32 xy, opus_val32 xx, opus_val32 yy)
420
79.2M
{
421
79.2M
   opus_val32 x2y2;
422
79.2M
   int sx, sy, shift;
423
79.2M
   opus_val32 g;
424
79.2M
   opus_val16 den;
425
79.2M
   if (xy == 0 || xx == 0 || yy == 0)
426
3.50M
      return 0;
427
75.7M
   sx = celt_ilog2(xx)-14;
428
75.7M
   sy = celt_ilog2(yy)-14;
429
75.7M
   shift = sx + sy;
430
75.7M
   x2y2 = SHR32(MULT16_16(VSHR32(xx, sx), VSHR32(yy, sy)), 14);
431
75.7M
   if (shift & 1) {
432
1.24M
      if (x2y2 < 32768)
433
636k
      {
434
636k
         x2y2 <<= 1;
435
636k
         shift--;
436
636k
      } else {
437
613k
         x2y2 >>= 1;
438
613k
         shift++;
439
613k
      }
440
1.24M
   }
441
75.7M
   den = celt_rsqrt_norm(x2y2);
442
75.7M
   g = MULT16_32_Q15(den, xy);
443
75.7M
   g = VSHR32(g, (shift>>1)-1);
444
75.7M
   return EXTRACT16(MAX32(-Q15ONE, MIN32(g, Q15ONE)));
445
79.2M
}
446
#else
447
static opus_val16 compute_pitch_gain(opus_val32 xy, opus_val32 xx, opus_val32 yy)
448
10.2M
{
449
10.2M
   return xy/celt_sqrt(1+xx*yy);
450
10.2M
}
451
#endif
452
453
static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2};
454
opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod,
455
      int N, int *T0_, int prev_period, opus_val16 prev_gain, int arch)
456
12.2M
{
457
12.2M
   int k, i, T, T0;
458
12.2M
   opus_val16 g, g0;
459
12.2M
   opus_val16 pg;
460
12.2M
   opus_val32 xy,xx,yy,xy2;
461
12.2M
   opus_val32 xcorr[3];
462
12.2M
   opus_val32 best_xy, best_yy;
463
12.2M
   int offset;
464
12.2M
   int minperiod0;
465
12.2M
   VARDECL(opus_val32, yy_lookup);
466
12.2M
   SAVE_STACK;
467
468
12.2M
   minperiod0 = minperiod;
469
12.2M
   maxperiod /= 2;
470
12.2M
   minperiod /= 2;
471
12.2M
   *T0_ /= 2;
472
12.2M
   prev_period /= 2;
473
12.2M
   N /= 2;
474
12.2M
   x += maxperiod;
475
12.2M
   if (*T0_>=maxperiod)
476
474k
      *T0_=maxperiod-1;
477
478
12.2M
   T = T0 = *T0_;
479
12.2M
   ALLOC(yy_lookup, maxperiod+1, opus_val32);
480
12.2M
   dual_inner_prod(x, x, x-T0, N, &xx, &xy, arch);
481
12.2M
   yy_lookup[0] = xx;
482
12.2M
   yy=xx;
483
6.30G
   for (i=1;i<=maxperiod;i++)
484
6.28G
   {
485
6.28G
      yy = yy+MULT16_16(x[-i],x[-i])-MULT16_16(x[N-i],x[N-i]);
486
6.28G
      yy_lookup[i] = MAX32(0, yy);
487
6.28G
   }
488
12.2M
   yy = yy_lookup[T0];
489
12.2M
   best_xy = xy;
490
12.2M
   best_yy = yy;
491
12.2M
   g = g0 = compute_pitch_gain(xy, xx, yy);
492
   /* Look for any pitch at T/k */
493
179M
   for (k=2;k<=15;k++)
494
167M
   {
495
167M
      int T1, T1b;
496
167M
      opus_val16 g1;
497
167M
      opus_val16 cont=0;
498
167M
      opus_val16 thresh;
499
167M
      T1 = celt_udiv(2*T0+k, 2*k);
500
167M
      if (T1 < minperiod)
501
696k
         break;
502
      /* Look for another strong correlation at T1b */
503
166M
      if (k==2)
504
12.2M
      {
505
12.2M
         if (T1+T0>maxperiod)
506
10.3M
            T1b = T0;
507
1.88M
         else
508
1.88M
            T1b = T0+T1;
509
12.2M
      } else
510
154M
      {
511
154M
         T1b = celt_udiv(2*second_check[k]*T0+k, 2*k);
512
154M
      }
513
166M
      dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2, arch);
514
166M
      xy = HALF32(xy + xy2);
515
166M
      yy = HALF32(yy_lookup[T1] + yy_lookup[T1b]);
516
166M
      g1 = compute_pitch_gain(xy, xx, yy);
517
166M
      if (abs(T1-prev_period)<=1)
518
9.85M
         cont = prev_gain;
519
156M
      else if (abs(T1-prev_period)<=2 && 5*k*k < T0)
520
42.7k
         cont = HALF16(prev_gain);
521
156M
      else
522
156M
         cont = 0;
523
166M
      thresh = MAX16(QCONST16(.3f,15), MULT16_16_Q15(QCONST16(.7f,15),g0)-cont);
524
      /* Bias against very high pitch (very short period) to avoid false-positives
525
         due to short-term correlation */
526
166M
      if (T1<3*minperiod)
527
11.1M
         thresh = MAX16(QCONST16(.4f,15), MULT16_16_Q15(QCONST16(.85f,15),g0)-cont);
528
155M
      else if (T1<2*minperiod)
529
0
         thresh = MAX16(QCONST16(.5f,15), MULT16_16_Q15(QCONST16(.9f,15),g0)-cont);
530
166M
      if (g1 > thresh)
531
111M
      {
532
111M
         best_xy = xy;
533
111M
         best_yy = yy;
534
111M
         T = T1;
535
111M
         g = g1;
536
111M
      }
537
166M
   }
538
12.2M
   best_xy = MAX32(0, best_xy);
539
12.2M
   if (best_yy <= best_xy)
540
9.41M
      pg = Q15ONE;
541
2.85M
   else
542
2.85M
      pg = SHR32(frac_div32(best_xy,best_yy+1),16);
543
544
49.1M
   for (k=0;k<3;k++)
545
36.8M
      xcorr[k] = celt_inner_prod(x, x-(T+k-1), N, arch);
546
12.2M
   if ((xcorr[2]-xcorr[0]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0]))
547
313k
      offset = 1;
548
11.9M
   else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2]))
549
391k
      offset = -1;
550
11.5M
   else
551
11.5M
      offset = 0;
552
12.2M
   if (pg > g)
553
3.93M
      pg = g;
554
12.2M
   *T0_ = 2*T+offset;
555
556
12.2M
   if (*T0_<minperiod0)
557
25.9k
      *T0_=minperiod0;
558
12.2M
   RESTORE_STACK;
559
12.2M
   return pg;
560
12.2M
}
remove_doubling
Line
Count
Source
456
6.13M
{
457
6.13M
   int k, i, T, T0;
458
6.13M
   opus_val16 g, g0;
459
6.13M
   opus_val16 pg;
460
6.13M
   opus_val32 xy,xx,yy,xy2;
461
6.13M
   opus_val32 xcorr[3];
462
6.13M
   opus_val32 best_xy, best_yy;
463
6.13M
   int offset;
464
6.13M
   int minperiod0;
465
6.13M
   VARDECL(opus_val32, yy_lookup);
466
6.13M
   SAVE_STACK;
467
468
6.13M
   minperiod0 = minperiod;
469
6.13M
   maxperiod /= 2;
470
6.13M
   minperiod /= 2;
471
6.13M
   *T0_ /= 2;
472
6.13M
   prev_period /= 2;
473
6.13M
   N /= 2;
474
6.13M
   x += maxperiod;
475
6.13M
   if (*T0_>=maxperiod)
476
237k
      *T0_=maxperiod-1;
477
478
6.13M
   T = T0 = *T0_;
479
6.13M
   ALLOC(yy_lookup, maxperiod+1, opus_val32);
480
6.13M
   dual_inner_prod(x, x, x-T0, N, &xx, &xy, arch);
481
6.13M
   yy_lookup[0] = xx;
482
6.13M
   yy=xx;
483
3.15G
   for (i=1;i<=maxperiod;i++)
484
3.14G
   {
485
3.14G
      yy = yy+MULT16_16(x[-i],x[-i])-MULT16_16(x[N-i],x[N-i]);
486
3.14G
      yy_lookup[i] = MAX32(0, yy);
487
3.14G
   }
488
6.13M
   yy = yy_lookup[T0];
489
6.13M
   best_xy = xy;
490
6.13M
   best_yy = yy;
491
6.13M
   g = g0 = compute_pitch_gain(xy, xx, yy);
492
   /* Look for any pitch at T/k */
493
89.5M
   for (k=2;k<=15;k++)
494
83.7M
   {
495
83.7M
      int T1, T1b;
496
83.7M
      opus_val16 g1;
497
83.7M
      opus_val16 cont=0;
498
83.7M
      opus_val16 thresh;
499
83.7M
      T1 = celt_udiv(2*T0+k, 2*k);
500
83.7M
      if (T1 < minperiod)
501
348k
         break;
502
      /* Look for another strong correlation at T1b */
503
83.3M
      if (k==2)
504
6.13M
      {
505
6.13M
         if (T1+T0>maxperiod)
506
5.19M
            T1b = T0;
507
940k
         else
508
940k
            T1b = T0+T1;
509
6.13M
      } else
510
77.2M
      {
511
77.2M
         T1b = celt_udiv(2*second_check[k]*T0+k, 2*k);
512
77.2M
      }
513
83.3M
      dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2, arch);
514
83.3M
      xy = HALF32(xy + xy2);
515
83.3M
      yy = HALF32(yy_lookup[T1] + yy_lookup[T1b]);
516
83.3M
      g1 = compute_pitch_gain(xy, xx, yy);
517
83.3M
      if (abs(T1-prev_period)<=1)
518
4.92M
         cont = prev_gain;
519
78.4M
      else if (abs(T1-prev_period)<=2 && 5*k*k < T0)
520
21.3k
         cont = HALF16(prev_gain);
521
78.4M
      else
522
78.4M
         cont = 0;
523
83.3M
      thresh = MAX16(QCONST16(.3f,15), MULT16_16_Q15(QCONST16(.7f,15),g0)-cont);
524
      /* Bias against very high pitch (very short period) to avoid false-positives
525
         due to short-term correlation */
526
83.3M
      if (T1<3*minperiod)
527
5.56M
         thresh = MAX16(QCONST16(.4f,15), MULT16_16_Q15(QCONST16(.85f,15),g0)-cont);
528
77.8M
      else if (T1<2*minperiod)
529
0
         thresh = MAX16(QCONST16(.5f,15), MULT16_16_Q15(QCONST16(.9f,15),g0)-cont);
530
83.3M
      if (g1 > thresh)
531
55.6M
      {
532
55.6M
         best_xy = xy;
533
55.6M
         best_yy = yy;
534
55.6M
         T = T1;
535
55.6M
         g = g1;
536
55.6M
      }
537
83.3M
   }
538
6.13M
   best_xy = MAX32(0, best_xy);
539
6.13M
   if (best_yy <= best_xy)
540
4.70M
      pg = Q15ONE;
541
1.42M
   else
542
1.42M
      pg = SHR32(frac_div32(best_xy,best_yy+1),16);
543
544
24.5M
   for (k=0;k<3;k++)
545
18.4M
      xcorr[k] = celt_inner_prod(x, x-(T+k-1), N, arch);
546
6.13M
   if ((xcorr[2]-xcorr[0]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0]))
547
156k
      offset = 1;
548
5.98M
   else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2]))
549
195k
      offset = -1;
550
5.78M
   else
551
5.78M
      offset = 0;
552
6.13M
   if (pg > g)
553
1.96M
      pg = g;
554
6.13M
   *T0_ = 2*T+offset;
555
556
6.13M
   if (*T0_<minperiod0)
557
12.9k
      *T0_=minperiod0;
558
6.13M
   RESTORE_STACK;
559
6.13M
   return pg;
560
6.13M
}
remove_doubling
Line
Count
Source
456
6.13M
{
457
6.13M
   int k, i, T, T0;
458
6.13M
   opus_val16 g, g0;
459
6.13M
   opus_val16 pg;
460
6.13M
   opus_val32 xy,xx,yy,xy2;
461
6.13M
   opus_val32 xcorr[3];
462
6.13M
   opus_val32 best_xy, best_yy;
463
6.13M
   int offset;
464
6.13M
   int minperiod0;
465
6.13M
   VARDECL(opus_val32, yy_lookup);
466
6.13M
   SAVE_STACK;
467
468
6.13M
   minperiod0 = minperiod;
469
6.13M
   maxperiod /= 2;
470
6.13M
   minperiod /= 2;
471
6.13M
   *T0_ /= 2;
472
6.13M
   prev_period /= 2;
473
6.13M
   N /= 2;
474
6.13M
   x += maxperiod;
475
6.13M
   if (*T0_>=maxperiod)
476
237k
      *T0_=maxperiod-1;
477
478
6.13M
   T = T0 = *T0_;
479
6.13M
   ALLOC(yy_lookup, maxperiod+1, opus_val32);
480
6.13M
   dual_inner_prod(x, x, x-T0, N, &xx, &xy, arch);
481
6.13M
   yy_lookup[0] = xx;
482
6.13M
   yy=xx;
483
3.15G
   for (i=1;i<=maxperiod;i++)
484
3.14G
   {
485
3.14G
      yy = yy+MULT16_16(x[-i],x[-i])-MULT16_16(x[N-i],x[N-i]);
486
3.14G
      yy_lookup[i] = MAX32(0, yy);
487
3.14G
   }
488
6.13M
   yy = yy_lookup[T0];
489
6.13M
   best_xy = xy;
490
6.13M
   best_yy = yy;
491
6.13M
   g = g0 = compute_pitch_gain(xy, xx, yy);
492
   /* Look for any pitch at T/k */
493
89.5M
   for (k=2;k<=15;k++)
494
83.7M
   {
495
83.7M
      int T1, T1b;
496
83.7M
      opus_val16 g1;
497
83.7M
      opus_val16 cont=0;
498
83.7M
      opus_val16 thresh;
499
83.7M
      T1 = celt_udiv(2*T0+k, 2*k);
500
83.7M
      if (T1 < minperiod)
501
348k
         break;
502
      /* Look for another strong correlation at T1b */
503
83.3M
      if (k==2)
504
6.13M
      {
505
6.13M
         if (T1+T0>maxperiod)
506
5.19M
            T1b = T0;
507
940k
         else
508
940k
            T1b = T0+T1;
509
6.13M
      } else
510
77.2M
      {
511
77.2M
         T1b = celt_udiv(2*second_check[k]*T0+k, 2*k);
512
77.2M
      }
513
83.3M
      dual_inner_prod(x, &x[-T1], &x[-T1b], N, &xy, &xy2, arch);
514
83.3M
      xy = HALF32(xy + xy2);
515
83.3M
      yy = HALF32(yy_lookup[T1] + yy_lookup[T1b]);
516
83.3M
      g1 = compute_pitch_gain(xy, xx, yy);
517
83.3M
      if (abs(T1-prev_period)<=1)
518
4.92M
         cont = prev_gain;
519
78.4M
      else if (abs(T1-prev_period)<=2 && 5*k*k < T0)
520
21.3k
         cont = HALF16(prev_gain);
521
78.4M
      else
522
78.4M
         cont = 0;
523
83.3M
      thresh = MAX16(QCONST16(.3f,15), MULT16_16_Q15(QCONST16(.7f,15),g0)-cont);
524
      /* Bias against very high pitch (very short period) to avoid false-positives
525
         due to short-term correlation */
526
83.3M
      if (T1<3*minperiod)
527
5.56M
         thresh = MAX16(QCONST16(.4f,15), MULT16_16_Q15(QCONST16(.85f,15),g0)-cont);
528
77.8M
      else if (T1<2*minperiod)
529
0
         thresh = MAX16(QCONST16(.5f,15), MULT16_16_Q15(QCONST16(.9f,15),g0)-cont);
530
83.3M
      if (g1 > thresh)
531
55.6M
      {
532
55.6M
         best_xy = xy;
533
55.6M
         best_yy = yy;
534
55.6M
         T = T1;
535
55.6M
         g = g1;
536
55.6M
      }
537
83.3M
   }
538
6.13M
   best_xy = MAX32(0, best_xy);
539
6.13M
   if (best_yy <= best_xy)
540
4.70M
      pg = Q15ONE;
541
1.42M
   else
542
1.42M
      pg = SHR32(frac_div32(best_xy,best_yy+1),16);
543
544
24.5M
   for (k=0;k<3;k++)
545
18.4M
      xcorr[k] = celt_inner_prod(x, x-(T+k-1), N, arch);
546
6.13M
   if ((xcorr[2]-xcorr[0]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[0]))
547
156k
      offset = 1;
548
5.98M
   else if ((xcorr[0]-xcorr[2]) > MULT16_32_Q15(QCONST16(.7f,15),xcorr[1]-xcorr[2]))
549
195k
      offset = -1;
550
5.78M
   else
551
5.78M
      offset = 0;
552
6.13M
   if (pg > g)
553
1.96M
      pg = g;
554
6.13M
   *T0_ = 2*T+offset;
555
556
6.13M
   if (*T0_<minperiod0)
557
12.9k
      *T0_=minperiod0;
558
6.13M
   RESTORE_STACK;
559
6.13M
   return pg;
560
6.13M
}