28 #ifndef SILK_SIGPROC_FIX_H
29 #define SILK_SIGPROC_FIX_H
38 #define SILK_MAX_ORDER_LPC 24
42 #include "resampler_structs.h"
44 #include "cpu_support.h"
46 #if defined(OPUS_X86_MAY_HAVE_SSE4_1)
47 #include "x86/SigProc_FIX_sse.h"
50 #if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR))
51 #include "arm/biquad_alt_arm.h"
52 #include "arm/LPC_inv_pred_gain_arm.h"
62 opus_int silk_resampler_init(
63 silk_resampler_state_struct *S,
72 opus_int silk_resampler(
73 silk_resampler_state_struct *S,
75 const opus_int16 in[],
82 void silk_resampler_down2(
92 void silk_resampler_down2_3(
104 void silk_biquad_alt_stride1(
105 const opus_int16 *in,
106 const opus_int32 *B_Q28,
107 const opus_int32 *A_Q28,
113 void silk_biquad_alt_stride2_c(
114 const opus_int16 *in,
115 const opus_int32 *B_Q28,
116 const opus_int32 *A_Q28,
123 void silk_LPC_analysis_filter(
125 const opus_int16 *in,
127 const opus_int32 len,
133 void silk_bwexpander(
140 void silk_bwexpander_32(
148 opus_int32 silk_LPC_inverse_pred_gain_c(
149 const opus_int16 *A_Q12,
154 void silk_ana_filt_bank_1(
155 const opus_int16 *in,
162 #if !defined(OVERRIDE_silk_biquad_alt_stride2)
163 #define silk_biquad_alt_stride2(in, B_Q28, A_Q28, S, out, len, arch) ((void)(arch), silk_biquad_alt_stride2_c(in, B_Q28, A_Q28, S, out, len))
166 #if !defined(OVERRIDE_silk_LPC_inverse_pred_gain)
167 #define silk_LPC_inverse_pred_gain(A_Q12, order, arch) ((void)(arch), silk_LPC_inverse_pred_gain_c(A_Q12, order))
176 opus_int32 silk_lin2log(
177 const opus_int32 inLin
181 opus_int silk_sigm_Q15(
187 opus_int32 silk_log2lin(
188 const opus_int32 inLog_Q7
193 void silk_sum_sqr_shift(
203 opus_int32 silk_schur(
206 const opus_int32 order
212 opus_int32 silk_schur64(
214 const opus_int32 c[],
221 const opus_int16 *rc_Q15,
222 const opus_int32 order
228 const opus_int32 *rc_Q16,
229 const opus_int32 order
237 void silk_apply_sine_window(
239 const opus_int16 px[],
240 const opus_int win_type,
241 const opus_int length
248 const opus_int16 *inputData,
249 const opus_int inputDataSize,
250 const opus_int correlationCount,
254 void silk_decode_pitch(
256 opus_int8 contourIndex,
257 opus_int pitch_lags[],
258 const opus_int Fs_kHz,
259 const opus_int nb_subfr
262 opus_int silk_pitch_analysis_core(
263 const opus_int16 *frame,
265 opus_int16 *lagIndex,
266 opus_int8 *contourIndex,
267 opus_int *LTPCorr_Q15,
269 const opus_int32 search_thres1_Q16,
270 const opus_int search_thres2_Q13,
271 const opus_int Fs_kHz,
272 const opus_int complexity,
273 const opus_int nb_subfr,
288 const opus_int16 *NLSF,
302 void silk_insertion_sort_increasing(
309 void silk_insertion_sort_decreasing_int16(
316 void silk_insertion_sort_increasing_all_values_int16(
322 void silk_NLSF_stabilize(
323 opus_int16 *NLSF_Q15,
324 const opus_int16 *NDeltaMin_Q15,
329 void silk_NLSF_VQ_weights_laroia(
330 opus_int16 *pNLSFW_Q_OUT,
331 const opus_int16 *pNLSF_Q15,
336 void silk_burg_modified_c(
340 const opus_int16 x[],
341 const opus_int32 minInvGain_Q30,
342 const opus_int subfr_length,
343 const opus_int nb_subfr,
349 void silk_scale_copy_vector16(
350 opus_int16 *data_out,
351 const opus_int16 *data_in,
353 const opus_int dataSize
357 void silk_scale_vector32_Q26_lshift_18(
369 opus_int32 silk_inner_prod_aligned(
370 const opus_int16 *
const inVec1,
371 const opus_int16 *
const inVec2,
377 opus_int32 silk_inner_prod_aligned_scale(
378 const opus_int16 *
const inVec1,
379 const opus_int16 *
const inVec2,
380 const opus_int scale,
384 opus_int64 silk_inner_prod16_aligned_64_c(
385 const opus_int16 *inVec1,
386 const opus_int16 *inVec2,
398 static OPUS_INLINE opus_int32 silk_ROR32( opus_int32 a32, opus_int rot )
400 opus_uint32 x = (opus_uint32) a32;
401 opus_uint32 r = (opus_uint32) rot;
402 opus_uint32 m = (opus_uint32) -rot;
405 }
else if( rot < 0 ) {
406 return (opus_int32) ((x << m) | (x >> (32 - m)));
408 return (opus_int32) ((x << (32 - r)) | (x >> r));
414 #define silk_DWORD_ALIGN __attribute__((aligned(4)))
416 #define silk_DWORD_ALIGN
420 #define silk_memcpy(dest, src, size) memcpy((dest), (src), (size))
421 #define silk_memset(dest, src, size) memset((dest), (src), (size))
422 #define silk_memmove(dest, src, size) memmove((dest), (src), (size))
427 #define silk_MUL(a32, b32) ((a32) * (b32))
430 #define silk_MUL_uint(a32, b32) silk_MUL(a32, b32)
433 #define silk_MLA(a32, b32, c32) silk_ADD32((a32),((b32) * (c32)))
436 #define silk_MLA_uint(a32, b32, c32) silk_MLA(a32, b32, c32)
439 #define silk_SMULTT(a32, b32) (((a32) >> 16) * ((b32) >> 16))
442 #define silk_SMLATT(a32, b32, c32) silk_ADD32((a32),((b32) >> 16) * ((c32) >> 16))
444 #define silk_SMLALBB(a64, b16, c16) silk_ADD64((a64),(opus_int64)((opus_int32)(b16) * (opus_int32)(c16)))
447 #define silk_SMULL(a32, b32) ((opus_int64)(a32) * (b32))
451 #define silk_ADD32_ovflw(a, b) ((opus_int32)((opus_uint32)(a) + (opus_uint32)(b)))
454 #define silk_SUB32_ovflw(a, b) ((opus_int32)((opus_uint32)(a) - (opus_uint32)(b)))
457 #define silk_MLA_ovflw(a32, b32, c32) silk_ADD32_ovflw((a32), (opus_uint32)(b32) * (opus_uint32)(c32))
458 #define silk_SMLABB_ovflw(a32, b32, c32) (silk_ADD32_ovflw((a32) , ((opus_int32)((opus_int16)(b32))) * (opus_int32)((opus_int16)(c32))))
460 #define silk_DIV32_16(a32, b16) ((opus_int32)((a32) / (b16)))
461 #define silk_DIV32(a32, b32) ((opus_int32)((a32) / (b32)))
464 #define silk_ADD16(a, b) ((a) + (b))
465 #define silk_ADD32(a, b) ((a) + (b))
466 #define silk_ADD64(a, b) ((a) + (b))
468 #define silk_SUB16(a, b) ((a) - (b))
469 #define silk_SUB32(a, b) ((a) - (b))
470 #define silk_SUB64(a, b) ((a) - (b))
472 #define silk_SAT8(a) ((a) > silk_int8_MAX ? silk_int8_MAX : \
473 ((a) < silk_int8_MIN ? silk_int8_MIN : (a)))
474 #define silk_SAT16(a) ((a) > silk_int16_MAX ? silk_int16_MAX : \
475 ((a) < silk_int16_MIN ? silk_int16_MIN : (a)))
476 #define silk_SAT32(a) ((a) > silk_int32_MAX ? silk_int32_MAX : \
477 ((a) < silk_int32_MIN ? silk_int32_MIN : (a)))
479 #define silk_CHECK_FIT8(a) (a)
480 #define silk_CHECK_FIT16(a) (a)
481 #define silk_CHECK_FIT32(a) (a)
483 #define silk_ADD_SAT16(a, b) (opus_int16)silk_SAT16( silk_ADD32( (opus_int32)(a), (b) ) )
484 #define silk_ADD_SAT64(a, b) ((((a) + (b)) & 0x8000000000000000LL) == 0 ? \
485 ((((a) & (b)) & 0x8000000000000000LL) != 0 ? silk_int64_MIN : (a)+(b)) : \
486 ((((a) | (b)) & 0x8000000000000000LL) == 0 ? silk_int64_MAX : (a)+(b)) )
488 #define silk_SUB_SAT16(a, b) (opus_int16)silk_SAT16( silk_SUB32( (opus_int32)(a), (b) ) )
489 #define silk_SUB_SAT64(a, b) ((((a)-(b)) & 0x8000000000000000LL) == 0 ? \
490 (( (a) & ((b)^0x8000000000000000LL) & 0x8000000000000000LL) ? silk_int64_MIN : (a)-(b)) : \
491 ((((a)^0x8000000000000000LL) & (b) & 0x8000000000000000LL) ? silk_int64_MAX : (a)-(b)) )
494 #define silk_POS_SAT32(a) ((a) > silk_int32_MAX ? silk_int32_MAX : (a))
497 #define silk_ADD_POS_SAT8(a, b) ((((a)+(b)) & 0x80) ? silk_int8_MAX : ((a)+(b)))
498 #define silk_ADD_POS_SAT16(a, b) ((((a)+(b)) & 0x8000) ? silk_int16_MAX : ((a)+(b)))
499 #define silk_ADD_POS_SAT32(a, b) ((((opus_uint32)(a)+(opus_uint32)(b)) & 0x80000000) ? silk_int32_MAX : ((a)+(b)))
501 #define silk_LSHIFT8(a, shift) ((opus_int8)((opus_uint8)(a)<<(shift)))
502 #define silk_LSHIFT16(a, shift) ((opus_int16)((opus_uint16)(a)<<(shift)))
503 #define silk_LSHIFT32(a, shift) ((opus_int32)((opus_uint32)(a)<<(shift)))
504 #define silk_LSHIFT64(a, shift) ((opus_int64)((opus_uint64)(a)<<(shift)))
505 #define silk_LSHIFT(a, shift) silk_LSHIFT32(a, shift)
507 #define silk_RSHIFT8(a, shift) ((a)>>(shift))
508 #define silk_RSHIFT16(a, shift) ((a)>>(shift))
509 #define silk_RSHIFT32(a, shift) ((a)>>(shift))
510 #define silk_RSHIFT64(a, shift) ((a)>>(shift))
511 #define silk_RSHIFT(a, shift) silk_RSHIFT32(a, shift)
514 #define silk_LSHIFT_SAT32(a, shift) (silk_LSHIFT32( silk_LIMIT( (a), silk_RSHIFT32( silk_int32_MIN, (shift) ), \
515 silk_RSHIFT32( silk_int32_MAX, (shift) ) ), (shift) ))
517 #define silk_LSHIFT_ovflw(a, shift) ((opus_int32)((opus_uint32)(a) << (shift)))
518 #define silk_LSHIFT_uint(a, shift) ((a) << (shift))
519 #define silk_RSHIFT_uint(a, shift) ((a) >> (shift))
521 #define silk_ADD_LSHIFT(a, b, shift) ((a) + silk_LSHIFT((b), (shift)))
522 #define silk_ADD_LSHIFT32(a, b, shift) silk_ADD32((a), silk_LSHIFT32((b), (shift)))
523 #define silk_ADD_LSHIFT_uint(a, b, shift) ((a) + silk_LSHIFT_uint((b), (shift)))
524 #define silk_ADD_RSHIFT(a, b, shift) ((a) + silk_RSHIFT((b), (shift)))
525 #define silk_ADD_RSHIFT32(a, b, shift) silk_ADD32((a), silk_RSHIFT32((b), (shift)))
526 #define silk_ADD_RSHIFT_uint(a, b, shift) ((a) + silk_RSHIFT_uint((b), (shift)))
527 #define silk_SUB_LSHIFT32(a, b, shift) silk_SUB32((a), silk_LSHIFT32((b), (shift)))
528 #define silk_SUB_RSHIFT32(a, b, shift) silk_SUB32((a), silk_RSHIFT32((b), (shift)))
531 #define silk_RSHIFT_ROUND(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1)
532 #define silk_RSHIFT_ROUND64(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1)
535 #define silk_NSHIFT_MUL_32_32(a, b) ( -(31- (32-silk_CLZ32(silk_abs(a)) + (32-silk_CLZ32(silk_abs(b))))) )
536 #define silk_NSHIFT_MUL_16_16(a, b) ( -(15- (16-silk_CLZ16(silk_abs(a)) + (16-silk_CLZ16(silk_abs(b))))) )
539 #define silk_min(a, b) (((a) < (b)) ? (a) : (b))
540 #define silk_max(a, b) (((a) > (b)) ? (a) : (b))
543 #define SILK_FIX_CONST( C, Q ) ((opus_int32)((C) * ((opus_int64)1 << (Q)) + 0.5f))
546 static OPUS_INLINE opus_int silk_min_int(opus_int a, opus_int b)
548 return (((a) < (b)) ? (a) : (b));
550 static OPUS_INLINE opus_int16 silk_min_16(opus_int16 a, opus_int16 b)
552 return (((a) < (b)) ? (a) : (b));
554 static OPUS_INLINE opus_int32 silk_min_32(opus_int32 a, opus_int32 b)
556 return (((a) < (b)) ? (a) : (b));
558 static OPUS_INLINE opus_int64 silk_min_64(opus_int64 a, opus_int64 b)
560 return (((a) < (b)) ? (a) : (b));
564 static OPUS_INLINE opus_int silk_max_int(opus_int a, opus_int b)
566 return (((a) > (b)) ? (a) : (b));
568 static OPUS_INLINE opus_int16 silk_max_16(opus_int16 a, opus_int16 b)
570 return (((a) > (b)) ? (a) : (b));
572 static OPUS_INLINE opus_int32 silk_max_32(opus_int32 a, opus_int32 b)
574 return (((a) > (b)) ? (a) : (b));
576 static OPUS_INLINE opus_int64 silk_max_64(opus_int64 a, opus_int64 b)
578 return (((a) > (b)) ? (a) : (b));
581 #define silk_LIMIT( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \
582 : ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))))
584 #define silk_LIMIT_int silk_LIMIT
585 #define silk_LIMIT_16 silk_LIMIT
586 #define silk_LIMIT_32 silk_LIMIT
588 #define silk_abs(a) (((a) > 0) ? (a) : -(a))
589 #define silk_abs_int(a) (((a) ^ ((a) >> (8 * sizeof(a) - 1))) - ((a) >> (8 * sizeof(a) - 1)))
590 #define silk_abs_int32(a) (((a) ^ ((a) >> 31)) - ((a) >> 31))
591 #define silk_abs_int64(a) (((a) > 0) ? (a) : -(a))
593 #define silk_sign(a) ((a) > 0 ? 1 : ( (a) < 0 ? -1 : 0 ))
599 #define RAND_MULTIPLIER 196314165
600 #define RAND_INCREMENT 907633515
601 #define silk_RAND(seed) (silk_MLA_ovflw((RAND_INCREMENT), (seed), (RAND_MULTIPLIER)))
610 #define silk_SMMUL(a32, b32) (opus_int32)silk_RSHIFT64(silk_SMULL((a32), (b32)), 32)
612 #if !defined(OPUS_X86_MAY_HAVE_SSE4_1)
613 #define silk_burg_modified(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch) \
614 ((void)(arch), silk_burg_modified_c(res_nrg, res_nrg_Q, A_Q16, x, minInvGain_Q30, subfr_length, nb_subfr, D, arch))
616 #define silk_inner_prod16_aligned_64(inVec1, inVec2, len, arch) \
617 ((void)(arch),silk_inner_prod16_aligned_64_c(inVec1, inVec2, len))
621 #include "MacroCount.h"
622 #include "MacroDebug.h"
624 #ifdef OPUS_ARM_INLINE_ASM
625 #include "arm/SigProc_FIX_armv4.h"
628 #ifdef OPUS_ARM_INLINE_EDSP
629 #include "arm/SigProc_FIX_armv5e.h"
632 #if defined(MIPSr1_ASM)
633 #include "mips/sigproc_fix_mipsr1.h"