#ifndef _SKP_SILK_SIGPROC_FIX_H_
#define _SKP_SILK_SIGPROC_FIX_H_
#ifdef __cplusplus
extern "C"
{
#endif
#define SKP_Silk_MAX_ORDER_LPC 16
#define SKP_Silk_MAX_CORRELATION_LENGTH 640
#include "SKP_Silk_typedef.h"
#include <string.h>
#include <stdlib.h>
#include "SKP_Silk_resampler_structs.h"
#ifndef NO_ASM
# if defined (__ARM_ARCH_4__) || defined (__ARM_ARCH_4T__) || defined (__ARM_ARCH_5__) || defined (__ARM_ARCH_5T__)
# define EMBEDDED_ARM 4
# define EMBEDDED_ARMv4
# include "SKP_Silk_macros_arm.h"
# elif defined (__ARM_ARCH_5TE__) || defined (__ARM_ARCH_5TEJ__)
# define EMBEDDED_ARM 5
# define EMBEDDED_ARMv5
# include "SKP_Silk_macros_arm.h"
# elif defined (__ARM_ARCH_6__) ||defined (__ARM_ARCH_6J__) || defined (__ARM_ARCH_6Z__) || defined (__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__)
# define EMBEDDED_ARM 6
# define EMBEDDED_ARMv6
# include "SKP_Silk_macros_arm.h"
# elif defined (__ARM_ARCH_7A__) && defined (__ARM_NEON__)
# define EMBEDDED_ARM 7
# define EMBEDDED_ARMv6
# include "SKP_Silk_macros_arm.h"
# elif defined (__ARM_ARCH_7A__)
# define EMBEDDED_ARM 6
# define EMBEDDED_ARMv6
# include "SKP_Silk_macros_arm.h"
# else
# include "SKP_Silk_macros.h"
# endif
#else
# include "SKP_Silk_macros.h"
#endif
SKP_int SKP_Silk_resampler_init(
SKP_Silk_resampler_state_struct *S,
SKP_int32 Fs_Hz_in,
SKP_int32 Fs_Hz_out
);
SKP_int SKP_Silk_resampler_clear(
SKP_Silk_resampler_state_struct *S
);
SKP_int SKP_Silk_resampler(
SKP_Silk_resampler_state_struct *S,
SKP_int16 out[],
const SKP_int16 in[],
SKP_int32 inLen
);
void SKP_Silk_resampler_up2(
SKP_int32 *S,
SKP_int16 *out,
const SKP_int16 *in,
SKP_int32 len
);
void SKP_Silk_resampler_down2(
SKP_int32 *S,
SKP_int16 *out,
const SKP_int16 *in,
SKP_int32 inLen
);
void SKP_Silk_resampler_down2_3(
SKP_int32 *S,
SKP_int16 *out,
const SKP_int16 *in,
SKP_int32 inLen
);
void SKP_Silk_resampler_down3(
SKP_int32 *S,
SKP_int16 *out,
const SKP_int16 *in,
SKP_int32 inLen
);
void SKP_Silk_biquad(
const SKP_int16 *in,
const SKP_int16 *B,
const SKP_int16 *A,
SKP_int32 *S,
SKP_int16 *out,
const SKP_int32 len
);
void SKP_Silk_biquad_alt(
const SKP_int16 *in,
const SKP_int32 *B_Q28,
const SKP_int32 *A_Q28,
SKP_int32 *S,
SKP_int16 *out,
const SKP_int32 len
);
void SKP_Silk_MA_Prediction(
const SKP_int16 *in,
const SKP_int16 *B,
SKP_int32 *S,
SKP_int16 *out,
const SKP_int32 len,
const SKP_int32 order
);
void SKP_Silk_LPC_synthesis_order16(
const SKP_int16 *in,
const SKP_int16 *A_Q12,
const SKP_int32 Gain_Q26,
SKP_int32 *S,
SKP_int16 *out,
const SKP_int32 len
);
void SKP_Silk_LPC_analysis_filter(
const SKP_int16 *in,
const SKP_int16 *B,
SKP_int16 *S,
SKP_int16 *out,
const SKP_int32 len,
const SKP_int32 Order
);
void SKP_Silk_LPC_synthesis_filter(
const SKP_int16 *in,
const SKP_int16 *A_Q12,
const SKP_int32 Gain_Q26,
SKP_int32 *S,
SKP_int16 *out,
const SKP_int32 len,
const SKP_int Order
);
void SKP_Silk_bwexpander(
SKP_int16 *ar,
const SKP_int d,
SKP_int32 chirp_Q16
);
void SKP_Silk_bwexpander_32(
SKP_int32 *ar,
const SKP_int d,
SKP_int32 chirp_Q16
);
SKP_int SKP_Silk_LPC_inverse_pred_gain(
SKP_int32 *invGain_Q30,
const SKP_int16 *A_Q12,
const SKP_int order
);
SKP_int SKP_Silk_LPC_inverse_pred_gain_Q24(
SKP_int32 *invGain_Q30,
const SKP_int32 *A_Q24,
const SKP_int order
);
void SKP_Silk_ana_filt_bank_1(
const SKP_int16 *in,
SKP_int32 *S,
SKP_int16 *outL,
SKP_int16 *outH,
SKP_int32 *scratch,
const SKP_int32 N
);
SKP_int32 SKP_Silk_lin2log(const SKP_int32 inLin);
SKP_int SKP_Silk_sigm_Q15(SKP_int in_Q5);
SKP_int32 SKP_Silk_log2lin(const SKP_int32 inLog_Q7);
SKP_int16 SKP_Silk_int16_array_maxabs(
const SKP_int16 *vec,
const SKP_int32 len
);
void SKP_Silk_sum_sqr_shift(
SKP_int32 *energy,
SKP_int *shift,
const SKP_int16 *x,
SKP_int len
);
SKP_int32 SKP_Silk_schur(
SKP_int16 *rc_Q15,
const SKP_int32 *c,
const SKP_int32 order
);
SKP_int32 SKP_Silk_schur64(
SKP_int32 rc_Q16[],
const SKP_int32 c[],
SKP_int32 order
);
void SKP_Silk_k2a(
SKP_int32 *A_Q24,
const SKP_int16 *rc_Q15,
const SKP_int32 order
);
void SKP_Silk_k2a_Q16(
SKP_int32 *A_Q24,
const SKP_int32 *rc_Q16,
const SKP_int32 order
);
void SKP_Silk_apply_sine_window(
SKP_int16 px_win[],
const SKP_int16 px[],
const SKP_int win_type,
const SKP_int length
);
void SKP_Silk_autocorr(
SKP_int32 *results,
SKP_int *scale,
const SKP_int16 *inputData,
const SKP_int inputDataSize,
const SKP_int correlationCount
);
#define SKP_Silk_PITCH_EST_MIN_COMPLEX 0
#define SKP_Silk_PITCH_EST_MID_COMPLEX 1
#define SKP_Silk_PITCH_EST_MAX_COMPLEX 2
void SKP_Silk_decode_pitch(
SKP_int lagIndex,
SKP_int contourIndex,
SKP_int pitch_lags[],
SKP_int Fs_kHz
);
SKP_int SKP_Silk_pitch_analysis_core(
const SKP_int16 *signal,
SKP_int *pitch_out,
SKP_int *lagIndex,
SKP_int *contourIndex,
SKP_int *LTPCorr_Q15,
SKP_int prevLag,
const SKP_int32 search_thres1_Q16,
const SKP_int search_thres2_Q15,
const SKP_int Fs_kHz,
const SKP_int complexity,
const SKP_int forLJC
);
#define LSF_COS_TAB_SZ_FIX 128
extern const SKP_int SKP_Silk_LSFCosTab_FIX_Q12[ LSF_COS_TAB_SZ_FIX + 1 ];
void SKP_Silk_A2NLSF(
SKP_int *NLSF,
SKP_int32 *a_Q16,
const SKP_int d
);
void SKP_Silk_NLSF2A(
SKP_int16 *a,
const SKP_int *NLSF,
const SKP_int d
);
void SKP_Silk_insertion_sort_increasing(
SKP_int32 *a,
SKP_int *index,
const SKP_int L,
const SKP_int K
);
void SKP_Silk_insertion_sort_decreasing_int16(
SKP_int16 *a,
SKP_int *index,
const SKP_int L,
const SKP_int K
);
void SKP_Silk_insertion_sort_increasing_all_values(
SKP_int *a,
const SKP_int L
);
void SKP_Silk_NLSF_stabilize(
SKP_int *NLSF_Q15,
const SKP_int *NDeltaMin_Q15,
const SKP_int L
);
void SKP_Silk_NLSF_VQ_weights_laroia(
SKP_int *pNLSFW_Q6,
const SKP_int *pNLSF_Q15,
const SKP_int D
);
void SKP_Silk_burg_modified(
SKP_int32 *res_nrg,
SKP_int *res_nrgQ,
SKP_int32 A_Q16[],
const SKP_int16 x[],
const SKP_int subfr_length,
const SKP_int nb_subfr,
const SKP_int32 WhiteNoiseFrac_Q32,
const SKP_int D
);
void SKP_Silk_scale_copy_vector16(
SKP_int16 *data_out,
const SKP_int16 *data_in,
SKP_int32 gain_Q16,
const SKP_int dataSize
);
void SKP_Silk_scale_vector32_Q26_lshift_18(
SKP_int32 *data1,
SKP_int32 gain_Q26,
SKP_int dataSize
);
SKP_int32 SKP_Silk_inner_prod_aligned(
const SKP_int16* const inVec1,
const SKP_int16* const inVec2,
const SKP_int len
);
SKP_int64 SKP_Silk_inner_prod16_aligned_64(
const SKP_int16 *inVec1,
const SKP_int16 *inVec2,
const SKP_int len
);
#if defined(EMBEDDED_MIPS)
SKP_INLINE SKP_int32 SKP_ROR32(SKP_int32 a32, SKP_int rot)
{
SKP_uint32 _x = (SKP_uint32) a32;
SKP_uint32 _r = (SKP_uint32) rot;
return (SKP_int32) ((_x << (32 - _r)) | (_x >> _r));
}
#else
SKP_INLINE SKP_int32 SKP_ROR32( SKP_int32 a32, SKP_int rot )
{
SKP_uint32 x = (SKP_uint32) a32;
SKP_uint32 r = (SKP_uint32) rot;
SKP_uint32 m = (SKP_uint32) -rot;
if(rot <= 0)
return (SKP_int32) ((x << m) | (x >> (32 - m)));
else
return (SKP_int32) ((x << (32 - r)) | (x >> r));
}
#endif
#if EMBEDDED_ARM
#if defined(_WIN32) && defined(_M_ARM)
#define SKP_DWORD_ALIGN __declspec(align(4))
#else
#define SKP_DWORD_ALIGN __attribute__((aligned(4)))
#endif
#else
#define SKP_DWORD_ALIGN
#endif
#define SKP_memcpy(a, b, c) memcpy((a), (b), (c))
#define SKP_memset(a, b, c) memset((a), (b), (c))
#define SKP_memmove(a, b, c) memmove((a), (b), (c))
#define SKP_MUL(a32, b32) ((a32) * (b32))
#define SKP_MUL_uint(a32, b32) SKP_MUL(a32, b32)
#define SKP_MLA(a32, b32, c32) SKP_ADD32((a32),((b32) * (c32)))
#define SKP_SMULTT(a32, b32) (((a32) >> 16) * ((b32) >> 16))
#define SKP_SMLATT(a32, b32, c32) SKP_ADD32((a32),((b32) >> 16) * ((c32) >> 16))
#define SKP_SMLALBB(a64, b16, c16) SKP_ADD64((a64),(SKP_int64)((SKP_int32)(b16) * (SKP_int32)(c16)))
#define SKP_SMULL(a32, b32) ((SKP_int64)(a32) * (b32))
#define SKP_ADD32_ovflw(a, b) ((SKP_int32)((SKP_uint32)(a) + (SKP_uint32)(b)))
#define SKP_SUB32_ovflw(a, b) ((SKP_int32)((SKP_uint32)(a) - (SKP_uint32)(b)))
#define SKP_MLA_ovflw(a32, b32, c32) SKP_ADD32_ovflw((a32), (SKP_uint32)(b32) * (SKP_uint32)(c32))
#ifndef SKP_SMLABB_ovflw
#define SKP_SMLABB_ovflw(a32, b32, c32) SKP_ADD32_ovflw((a32), SKP_SMULBB((b32),(c32)))
#endif
#define SKP_SMLATT_ovflw(a32, b32, c32) SKP_ADD32_ovflw((a32), SKP_SMULTT((b32),(c32)))
#define SKP_SMLAWB_ovflw(a32, b32, c32) SKP_ADD32_ovflw((a32), SKP_SMULWB((b32),(c32)))
#define SKP_SMLAWT_ovflw(a32, b32, c32) SKP_ADD32_ovflw((a32), SKP_SMULWT((b32),(c32)))
#define SKP_DIV32_16(a32, b16) ((SKP_int32)((a32) / (b16)))
#define SKP_DIV32(a32, b32) ((SKP_int32)((a32) / (b32)))
#define SKP_ADD32(a, b) ((a) + (b))
#define SKP_ADD64(a, b) ((a) + (b))
#define SKP_SUB32(a, b) ((a) - (b))
#define SKP_SAT16(a) ((a) > SKP_int16_MAX ? SKP_int16_MAX : \
((a) < SKP_int16_MIN ? SKP_int16_MIN : (a)))
#define SKP_SAT32(a) ((a) > SKP_int32_MAX ? SKP_int32_MAX : \
((a) < SKP_int32_MIN ? SKP_int32_MIN : (a)))
#define SKP_CHECK_FIT16(a) (a)
#define SKP_CHECK_FIT32(a) (a)
#define SKP_ADD_SAT16(a, b) (SKP_int16)SKP_SAT16( SKP_ADD32( (SKP_int32)(a), (b) ) )
#define SKP_ADD_POS_SAT32(a, b) ((((a)+(b)) & 0x80000000) ? SKP_int32_MAX : ((a)+(b)))
#define SKP_LSHIFT32(a, shift) ((a)<<(shift))
#define SKP_LSHIFT64(a, shift) ((a)<<(shift))
#define SKP_LSHIFT(a, shift) SKP_LSHIFT32(a, shift)
#define SKP_RSHIFT32(a, shift) ((a)>>(shift))
#define SKP_RSHIFT64(a, shift) ((a)>>(shift))
#define SKP_RSHIFT(a, shift) SKP_RSHIFT32(a, shift)
#define SKP_LSHIFT_SAT32(a, shift) (SKP_LSHIFT32( SKP_LIMIT_32( (a), SKP_RSHIFT32( SKP_int32_MIN, (shift) ), \
SKP_RSHIFT32( SKP_int32_MAX, (shift) ) ), (shift) ))
#define SKP_LSHIFT_ovflw(a, shift) ((a)<<(shift))
#define SKP_LSHIFT_uint(a, shift) ((a)<<(shift))
#define SKP_RSHIFT_uint(a, shift) ((a)>>(shift))
#define SKP_ADD_LSHIFT(a, b, shift) ((a) + SKP_LSHIFT((b), (shift)))
#define SKP_ADD_LSHIFT32(a, b, shift) SKP_ADD32((a), SKP_LSHIFT32((b), (shift)))
#define SKP_ADD_RSHIFT(a, b, shift) ((a) + SKP_RSHIFT((b), (shift)))
#define SKP_ADD_RSHIFT32(a, b, shift) SKP_ADD32((a), SKP_RSHIFT32((b), (shift)))
#define SKP_ADD_RSHIFT_uint(a, b, shift) ((a) + SKP_RSHIFT_uint((b), (shift)))
#define SKP_SUB_LSHIFT32(a, b, shift) SKP_SUB32((a), SKP_LSHIFT32((b), (shift)))
#define SKP_SUB_RSHIFT32(a, b, shift) SKP_SUB32((a), SKP_RSHIFT32((b), (shift)))
#define SKP_RSHIFT_ROUND(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1)
#define SKP_RSHIFT_ROUND64(a, shift) ((shift) == 1 ? ((a) >> 1) + ((a) & 1) : (((a) >> ((shift) - 1)) + 1) >> 1)
#define SKP_NSHIFT_MUL_32_32(a, b) ( -(31- (32-SKP_Silk_CLZ32(SKP_abs(a)) + (32-SKP_Silk_CLZ32(SKP_abs(b))))) )
#define SKP_min(a, b) (((a) < (b)) ? (a) : (b))
#define SKP_max(a, b) (((a) > (b)) ? (a) : (b))
#define SKP_FIX_CONST( C, Q ) ((SKP_int32)((C) * ((SKP_int64)1 << (Q)) + 0.5))
SKP_INLINE SKP_int SKP_min_int(SKP_int a, SKP_int b)
{
return (((a) < (b)) ? (a) : (b));
}
SKP_INLINE SKP_int32 SKP_min_32(SKP_int32 a, SKP_int32 b)
{
return (((a) < (b)) ? (a) : (b));
}
SKP_INLINE SKP_int SKP_max_int(SKP_int a, SKP_int b)
{
return (((a) > (b)) ? (a) : (b));
}
SKP_INLINE SKP_int16 SKP_max_16(SKP_int16 a, SKP_int16 b)
{
return (((a) > (b)) ? (a) : (b));
}
SKP_INLINE SKP_int32 SKP_max_32(SKP_int32 a, SKP_int32 b)
{
return (((a) > (b)) ? (a) : (b));
}
#define SKP_LIMIT( a, limit1, limit2) ((limit1) > (limit2) ? ((a) > (limit1) ? (limit1) : ((a) < (limit2) ? (limit2) : (a))) \
: ((a) > (limit2) ? (limit2) : ((a) < (limit1) ? (limit1) : (a))))
#define SKP_LIMIT_int SKP_LIMIT
#define SKP_LIMIT_32 SKP_LIMIT
#define SKP_abs(a) (((a) > 0) ? (a) : -(a))
#define SKP_abs_int32(a) (((a) ^ ((a) >> 31)) - ((a) >> 31))
#define SKP_RAND(seed) (SKP_MLA_ovflw(907633515, (seed), 196314165))
#include "SKP_Silk_Inlines.h"
#ifdef __cplusplus
}
#endif
#endif