1 /* Copyright (c) 2009-2010 Xiph.Org Foundation
2 Written by Jean-Marc Valin */
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
8 - Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
11 - Redistributions in binary form must reproduce the above copyright
12 notice, this list of conditions and the following disclaimer in the
13 documentation and/or other materials provided with the distribution.
15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #include "stack_alloc.h"
38 opus_val16
*_lpc
, /* out: [0...p-1] LPC coefficients */
39 const opus_val32
*ac
, /* in: [0...p] autocorrelation values */
45 opus_val32 error
= ac
[0];
47 opus_val32 lpc
[LPC_ORDER
];
59 for (i
= 0; i
< p
; i
++) {
60 /* Sum up this iteration's reflection coefficient */
62 for (j
= 0; j
< i
; j
++)
63 rr
+= MULT32_32_Q31(lpc
[j
],ac
[i
- j
]);
64 rr
+= SHR32(ac
[i
+ 1],6);
65 r
= -frac_div32(SHL32(rr
,6), error
);
66 /* Update LPC coefficients and total error */
68 for (j
= 0; j
< (i
+1)>>1; j
++)
70 opus_val32 tmp1
, tmp2
;
73 lpc
[j
] = tmp1
+ MULT32_32_Q31(r
,tmp2
);
74 lpc
[i
-1-j
] = tmp2
+ MULT32_32_Q31(r
,tmp1
);
77 error
= error
- MULT32_32_Q31(MULT32_32_Q31(r
,r
),error
);
78 /* Bail out once we get 30 dB gain */
80 if (error
<=SHR32(ac
[0],10))
83 if (error
<=.001f
*ac
[0])
90 /* Convert the int32 lpcs to int16 and ensure there are no wrap-arounds.
91 This reuses the logic in silk_LPC_fit() and silk_bwexpander_32(). Any bug
92 fixes should also be applied there. */
94 opus_val32 maxabs
, absval
, chirp_Q16
, chirp_minus_one_Q16
;
96 for (iter
= 0; iter
< 10; iter
++) {
98 for (i
= 0; i
< p
; i
++) {
99 absval
= ABS32(lpc
[i
]);
100 if (absval
> maxabs
) {
105 maxabs
= PSHR32(maxabs
, 13); /* Q25->Q12 */
107 if (maxabs
> 32767) {
108 maxabs
= MIN32(maxabs
, 163838);
109 chirp_Q16
= QCONST32(0.999, 16) - DIV32(SHL32(maxabs
- 32767, 14),
110 SHR32(MULT32_32_32(maxabs
, idx
+ 1), 2));
111 chirp_minus_one_Q16
= chirp_Q16
- 65536;
113 /* Apply bandwidth expansion. */
114 for (i
= 0; i
< p
- 1; i
++) {
115 lpc
[i
] = MULT32_32_Q16(chirp_Q16
, lpc
[i
]);
116 chirp_Q16
+= PSHR32(MULT32_32_32(chirp_Q16
, chirp_minus_one_Q16
), 16);
118 lpc
[p
- 1] = MULT32_32_Q16(chirp_Q16
, lpc
[p
- 1]);
125 /* If the coeffs still do not fit into the 16 bit range after 10 iterations,
126 fall back to the A(z)=1 filter. */
128 _lpc
[0] = 4096; /* Q12 */
130 for (i
= 0; i
< p
; i
++) {
131 _lpc
[i
] = EXTRACT16(PSHR32(lpc
[i
], 13)); /* Q25->Q12 */
141 const opus_val16
*num
,
148 VARDECL(opus_val16
, rnum
);
151 ALLOC(rnum
, ord
, opus_val16
);
153 rnum
[i
] = num
[ord
-i
-1];
157 sum
[0] = SHL32(EXTEND32(x
[i
]), SIG_SHIFT
);
158 sum
[1] = SHL32(EXTEND32(x
[i
+1]), SIG_SHIFT
);
159 sum
[2] = SHL32(EXTEND32(x
[i
+2]), SIG_SHIFT
);
160 sum
[3] = SHL32(EXTEND32(x
[i
+3]), SIG_SHIFT
);
161 xcorr_kernel(rnum
, x
+i
-ord
, sum
, ord
, arch
);
162 y
[i
] = SROUND16(sum
[0], SIG_SHIFT
);
163 y
[i
+1] = SROUND16(sum
[1], SIG_SHIFT
);
164 y
[i
+2] = SROUND16(sum
[2], SIG_SHIFT
);
165 y
[i
+3] = SROUND16(sum
[3], SIG_SHIFT
);
169 opus_val32 sum
= SHL32(EXTEND32(x
[i
]), SIG_SHIFT
);
171 sum
= MAC16_16(sum
,rnum
[j
],x
[i
+j
-ord
]);
172 y
[i
] = SROUND16(sum
, SIG_SHIFT
);
177 void celt_iir(const opus_val32
*_x
,
178 const opus_val16
*den
,
185 #ifdef SMALL_FOOTPRINT
190 opus_val32 sum
= _x
[i
];
193 sum
-= MULT16_16(den
[j
],mem
[j
]);
195 for (j
=ord
-1;j
>=1;j
--)
199 mem
[0] = SROUND16(sum
, SIG_SHIFT
);
204 VARDECL(opus_val16
, rden
);
205 VARDECL(opus_val16
, y
);
208 celt_assert((ord
&3)==0);
209 ALLOC(rden
, ord
, opus_val16
);
210 ALLOC(y
, N
+ord
, opus_val16
);
212 rden
[i
] = den
[ord
-i
-1];
214 y
[i
] = -mem
[ord
-i
-1];
219 /* Unroll by 4 as if it were an FIR filter */
225 xcorr_kernel(rden
, y
+i
, sum
, ord
, arch
);
227 /* Patch up the result to compensate for the fact that this is an IIR */
228 y
[i
+ord
] = -SROUND16(sum
[0],SIG_SHIFT
);
230 sum
[1] = MAC16_16(sum
[1], y
[i
+ord
], den
[0]);
231 y
[i
+ord
+1] = -SROUND16(sum
[1],SIG_SHIFT
);
233 sum
[2] = MAC16_16(sum
[2], y
[i
+ord
+1], den
[0]);
234 sum
[2] = MAC16_16(sum
[2], y
[i
+ord
], den
[1]);
235 y
[i
+ord
+2] = -SROUND16(sum
[2],SIG_SHIFT
);
238 sum
[3] = MAC16_16(sum
[3], y
[i
+ord
+2], den
[0]);
239 sum
[3] = MAC16_16(sum
[3], y
[i
+ord
+1], den
[1]);
240 sum
[3] = MAC16_16(sum
[3], y
[i
+ord
], den
[2]);
241 y
[i
+ord
+3] = -SROUND16(sum
[3],SIG_SHIFT
);
246 opus_val32 sum
= _x
[i
];
248 sum
-= MULT16_16(rden
[j
],y
[i
+j
]);
249 y
[i
+ord
] = SROUND16(sum
,SIG_SHIFT
);
259 const opus_val16
*x
, /* in: [0...n-1] samples x */
260 opus_val32
*ac
, /* out: [0...lag-1] ac values */
261 const opus_val16
*window
,
272 const opus_val16
*xptr
;
273 VARDECL(opus_val16
, xx
);
275 ALLOC(xx
, n
, opus_val16
);
277 celt_assert(overlap
>=0);
284 for (i
=0;i
<overlap
;i
++)
286 xx
[i
] = MULT16_16_Q15(x
[i
],window
[i
]);
287 xx
[n
-i
-1] = MULT16_16_Q15(x
[n
-i
-1],window
[i
]);
296 if (n
&1) ac0
+= SHR32(MULT16_16(xptr
[0],xptr
[0]),9);
297 for(i
=(n
&1);i
<n
;i
+=2)
299 ac0
+= SHR32(MULT16_16(xptr
[i
],xptr
[i
]),9);
300 ac0
+= SHR32(MULT16_16(xptr
[i
+1],xptr
[i
+1]),9);
303 shift
= celt_ilog2(ac0
)-30+10;
308 xx
[i
] = PSHR32(xptr
[i
], shift
);
314 celt_pitch_xcorr(xptr
, xptr
, ac
, fastN
, lag
+1, arch
);
317 for (i
= k
+fastN
, d
= 0; i
< n
; i
++)
318 d
= MAC16_16(d
, xptr
[i
], xptr
[i
-k
]);
324 ac
[0] += SHL32((opus_int32
)1, -shift
);
325 if (ac
[0] < 268435456)
327 int shift2
= 29 - EC_ILOG(ac
[0]);
329 ac
[i
] = SHL32(ac
[i
], shift2
);
331 } else if (ac
[0] >= 536870912)
334 if (ac
[0] >= 1073741824)
337 ac
[i
] = SHR32(ac
[i
], shift2
);