38 #include "cpu_support.h"
40 #if (defined(OPUS_X86_MAY_HAVE_SSE) && !defined(FIXED_POINT)) \
41 || ((defined(OPUS_X86_MAY_HAVE_SSE4_1) || defined(OPUS_X86_MAY_HAVE_SSE2)) && defined(FIXED_POINT))
42 #include "x86/pitch_sse.h"
45 #if defined(MIPSr1_ASM)
46 #include "mips/pitch_mipsr1.h"
49 #if (defined(OPUS_ARM_ASM) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR))
50 # include "arm/pitch_arm.h"
53 void pitch_downsample(celt_sig * OPUS_RESTRICT x[], opus_val16 * OPUS_RESTRICT x_lp,
54 int len,
int C,
int arch);
56 void pitch_search(
const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTRICT y,
57 int len,
int max_pitch,
int *pitch,
int arch);
59 opus_val16 remove_doubling(opus_val16 *x,
int maxperiod,
int minperiod,
60 int N,
int *T0,
int prev_period, opus_val16 prev_gain,
int arch);
65 static OPUS_INLINE
void xcorr_kernel_c(
const opus_val16 * x,
const opus_val16 * y, opus_val32 sum[4],
int len)
68 opus_val16 y_0, y_1, y_2, y_3;
74 for (j=0;j<len-3;j+=4)
79 sum[0] = MAC16_16(sum[0],tmp,y_0);
80 sum[1] = MAC16_16(sum[1],tmp,y_1);
81 sum[2] = MAC16_16(sum[2],tmp,y_2);
82 sum[3] = MAC16_16(sum[3],tmp,y_3);
85 sum[0] = MAC16_16(sum[0],tmp,y_1);
86 sum[1] = MAC16_16(sum[1],tmp,y_2);
87 sum[2] = MAC16_16(sum[2],tmp,y_3);
88 sum[3] = MAC16_16(sum[3],tmp,y_0);
91 sum[0] = MAC16_16(sum[0],tmp,y_2);
92 sum[1] = MAC16_16(sum[1],tmp,y_3);
93 sum[2] = MAC16_16(sum[2],tmp,y_0);
94 sum[3] = MAC16_16(sum[3],tmp,y_1);
97 sum[0] = MAC16_16(sum[0],tmp,y_3);
98 sum[1] = MAC16_16(sum[1],tmp,y_0);
99 sum[2] = MAC16_16(sum[2],tmp,y_1);
100 sum[3] = MAC16_16(sum[3],tmp,y_2);
104 opus_val16 tmp = *x++;
106 sum[0] = MAC16_16(sum[0],tmp,y_0);
107 sum[1] = MAC16_16(sum[1],tmp,y_1);
108 sum[2] = MAC16_16(sum[2],tmp,y_2);
109 sum[3] = MAC16_16(sum[3],tmp,y_3);
115 sum[0] = MAC16_16(sum[0],tmp,y_1);
116 sum[1] = MAC16_16(sum[1],tmp,y_2);
117 sum[2] = MAC16_16(sum[2],tmp,y_3);
118 sum[3] = MAC16_16(sum[3],tmp,y_0);
124 sum[0] = MAC16_16(sum[0],tmp,y_2);
125 sum[1] = MAC16_16(sum[1],tmp,y_3);
126 sum[2] = MAC16_16(sum[2],tmp,y_0);
127 sum[3] = MAC16_16(sum[3],tmp,y_1);
131 #ifndef OVERRIDE_XCORR_KERNEL
132 #define xcorr_kernel(x, y, sum, len, arch) \
133 ((void)(arch),xcorr_kernel_c(x, y, sum, len))
137 static OPUS_INLINE
void dual_inner_prod_c(
const opus_val16 *x,
const opus_val16 *y01,
const opus_val16 *y02,
138 int N, opus_val32 *xy1, opus_val32 *xy2)
145 xy01 = MAC16_16(xy01, x[i], y01[i]);
146 xy02 = MAC16_16(xy02, x[i], y02[i]);
152 #ifndef OVERRIDE_DUAL_INNER_PROD
153 # define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) \
154 ((void)(arch),dual_inner_prod_c(x, y01, y02, N, xy1, xy2))
159 static OPUS_INLINE opus_val32 celt_inner_prod_c(
const opus_val16 *x,
160 const opus_val16 *y,
int N)
165 xy = MAC16_16(xy, x[i], y[i]);
169 #if !defined(OVERRIDE_CELT_INNER_PROD)
170 # define celt_inner_prod(x, y, N, arch) \
171 ((void)(arch),celt_inner_prod_c(x, y, N))
174 #ifdef NON_STATIC_COMB_FILTER_CONST_C
175 void comb_filter_const_c(opus_val32 *y, opus_val32 *x,
int T,
int N,
176 opus_val16 g10, opus_val16 g11, opus_val16 g12);
185 celt_pitch_xcorr_c(
const opus_val16 *_x,
const opus_val16 *_y,
186 opus_val32 *xcorr,
int len,
int max_pitch,
int arch);
188 #ifndef OVERRIDE_PITCH_XCORR
189 # define celt_pitch_xcorr celt_pitch_xcorr_c