summaryrefslogtreecommitdiff
path: root/lib/rbcodec/codecs/libopus/celt/celt_lpc.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/libopus/celt/celt_lpc.c')
-rw-r--r--lib/rbcodec/codecs/libopus/celt/celt_lpc.c73
1 files changed, 30 insertions, 43 deletions
diff --git a/lib/rbcodec/codecs/libopus/celt/celt_lpc.c b/lib/rbcodec/codecs/libopus/celt/celt_lpc.c
index fa29d626ea..8ecb693ee9 100644
--- a/lib/rbcodec/codecs/libopus/celt/celt_lpc.c
+++ b/lib/rbcodec/codecs/libopus/celt/celt_lpc.c
@@ -49,8 +49,7 @@ int p
49 float *lpc = _lpc; 49 float *lpc = _lpc;
50#endif 50#endif
51 51
52 for (i = 0; i < p; i++) 52 OPUS_CLEAR(lpc, p);
53 lpc[i] = 0;
54 if (ac[0] != 0) 53 if (ac[0] != 0)
55 { 54 {
56 for (i = 0; i < p; i++) { 55 for (i = 0; i < p; i++) {
@@ -88,56 +87,42 @@ int p
88#endif 87#endif
89} 88}
90 89
91void celt_fir(const opus_val16 *_x, 90
91void celt_fir_c(
92 const opus_val16 *x,
92 const opus_val16 *num, 93 const opus_val16 *num,
93 opus_val16 *_y, 94 opus_val16 *y,
94 int N, 95 int N,
95 int ord, 96 int ord,
96 opus_val16 *mem) 97 int arch)
97{ 98{
98 int i,j; 99 int i,j;
99 VARDECL(opus_val16, rnum); 100 VARDECL(opus_val16, rnum);
100 VARDECL(opus_val16, x);
101 SAVE_STACK; 101 SAVE_STACK;
102 102 celt_assert(x != y);
103 ALLOC(rnum, ord, opus_val16); 103 ALLOC(rnum, ord, opus_val16);
104 ALLOC(x, N+ord, opus_val16);
105 for(i=0;i<ord;i++) 104 for(i=0;i<ord;i++)
106 rnum[i] = num[ord-i-1]; 105 rnum[i] = num[ord-i-1];
107 for(i=0;i<ord;i++)
108 x[i] = mem[ord-i-1];
109 for (i=0;i<N;i++)
110 x[i+ord]=_x[i];
111 for(i=0;i<ord;i++)
112 mem[i] = _x[N-i-1];
113#ifdef SMALL_FOOTPRINT
114 for (i=0;i<N;i++)
115 {
116 opus_val32 sum = SHL32(EXTEND32(_x[i]), SIG_SHIFT);
117 for (j=0;j<ord;j++)
118 {
119 sum = MAC16_16(sum,rnum[j],x[i+j]);
120 }
121 _y[i] = SATURATE16(PSHR32(sum, SIG_SHIFT));
122 }
123#else
124 for (i=0;i<N-3;i+=4) 106 for (i=0;i<N-3;i+=4)
125 { 107 {
126 opus_val32 sum[4]={0,0,0,0}; 108 opus_val32 sum[4];
127 xcorr_kernel(rnum, x+i, sum, ord); 109 sum[0] = SHL32(EXTEND32(x[i ]), SIG_SHIFT);
128 _y[i ] = SATURATE16(ADD32(EXTEND32(_x[i ]), PSHR32(sum[0], SIG_SHIFT))); 110 sum[1] = SHL32(EXTEND32(x[i+1]), SIG_SHIFT);
129 _y[i+1] = SATURATE16(ADD32(EXTEND32(_x[i+1]), PSHR32(sum[1], SIG_SHIFT))); 111 sum[2] = SHL32(EXTEND32(x[i+2]), SIG_SHIFT);
130 _y[i+2] = SATURATE16(ADD32(EXTEND32(_x[i+2]), PSHR32(sum[2], SIG_SHIFT))); 112 sum[3] = SHL32(EXTEND32(x[i+3]), SIG_SHIFT);
131 _y[i+3] = SATURATE16(ADD32(EXTEND32(_x[i+3]), PSHR32(sum[3], SIG_SHIFT))); 113 xcorr_kernel(rnum, x+i-ord, sum, ord, arch);
114 y[i ] = ROUND16(sum[0], SIG_SHIFT);
115 y[i+1] = ROUND16(sum[1], SIG_SHIFT);
116 y[i+2] = ROUND16(sum[2], SIG_SHIFT);
117 y[i+3] = ROUND16(sum[3], SIG_SHIFT);
132 } 118 }
133 for (;i<N;i++) 119 for (;i<N;i++)
134 { 120 {
135 opus_val32 sum = 0; 121 opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT);
136 for (j=0;j<ord;j++) 122 for (j=0;j<ord;j++)
137 sum = MAC16_16(sum,rnum[j],x[i+j]); 123 sum = MAC16_16(sum,rnum[j],x[i+j-ord]);
138 _y[i] = SATURATE16(ADD32(EXTEND32(_x[i]), PSHR32(sum, SIG_SHIFT))); 124 y[i] = ROUND16(sum, SIG_SHIFT);
139 } 125 }
140#endif
141 RESTORE_STACK; 126 RESTORE_STACK;
142} 127}
143 128
@@ -146,10 +131,12 @@ void celt_iir(const opus_val32 *_x,
146 opus_val32 *_y, 131 opus_val32 *_y,
147 int N, 132 int N,
148 int ord, 133 int ord,
149 opus_val16 *mem) 134 opus_val16 *mem,
135 int arch)
150{ 136{
151#ifdef SMALL_FOOTPRINT 137#ifdef SMALL_FOOTPRINT
152 int i,j; 138 int i,j;
139 (void)arch;
153 for (i=0;i<N;i++) 140 for (i=0;i<N;i++)
154 { 141 {
155 opus_val32 sum = _x[i]; 142 opus_val32 sum = _x[i];
@@ -161,7 +148,7 @@ void celt_iir(const opus_val32 *_x,
161 { 148 {
162 mem[j]=mem[j-1]; 149 mem[j]=mem[j-1];
163 } 150 }
164 mem[0] = ROUND16(sum,SIG_SHIFT); 151 mem[0] = SROUND16(sum, SIG_SHIFT);
165 _y[i] = sum; 152 _y[i] = sum;
166 } 153 }
167#else 154#else
@@ -187,23 +174,23 @@ void celt_iir(const opus_val32 *_x,
187 sum[1]=_x[i+1]; 174 sum[1]=_x[i+1];
188 sum[2]=_x[i+2]; 175 sum[2]=_x[i+2];
189 sum[3]=_x[i+3]; 176 sum[3]=_x[i+3];
190 xcorr_kernel(rden, y+i, sum, ord); 177 xcorr_kernel(rden, y+i, sum, ord, arch);
191 178
192 /* Patch up the result to compensate for the fact that this is an IIR */ 179 /* Patch up the result to compensate for the fact that this is an IIR */
193 y[i+ord ] = -ROUND16(sum[0],SIG_SHIFT); 180 y[i+ord ] = -SROUND16(sum[0],SIG_SHIFT);
194 _y[i ] = sum[0]; 181 _y[i ] = sum[0];
195 sum[1] = MAC16_16(sum[1], y[i+ord ], den[0]); 182 sum[1] = MAC16_16(sum[1], y[i+ord ], den[0]);
196 y[i+ord+1] = -ROUND16(sum[1],SIG_SHIFT); 183 y[i+ord+1] = -SROUND16(sum[1],SIG_SHIFT);
197 _y[i+1] = sum[1]; 184 _y[i+1] = sum[1];
198 sum[2] = MAC16_16(sum[2], y[i+ord+1], den[0]); 185 sum[2] = MAC16_16(sum[2], y[i+ord+1], den[0]);
199 sum[2] = MAC16_16(sum[2], y[i+ord ], den[1]); 186 sum[2] = MAC16_16(sum[2], y[i+ord ], den[1]);
200 y[i+ord+2] = -ROUND16(sum[2],SIG_SHIFT); 187 y[i+ord+2] = -SROUND16(sum[2],SIG_SHIFT);
201 _y[i+2] = sum[2]; 188 _y[i+2] = sum[2];
202 189
203 sum[3] = MAC16_16(sum[3], y[i+ord+2], den[0]); 190 sum[3] = MAC16_16(sum[3], y[i+ord+2], den[0]);
204 sum[3] = MAC16_16(sum[3], y[i+ord+1], den[1]); 191 sum[3] = MAC16_16(sum[3], y[i+ord+1], den[1]);
205 sum[3] = MAC16_16(sum[3], y[i+ord ], den[2]); 192 sum[3] = MAC16_16(sum[3], y[i+ord ], den[2]);
206 y[i+ord+3] = -ROUND16(sum[3],SIG_SHIFT); 193 y[i+ord+3] = -SROUND16(sum[3],SIG_SHIFT);
207 _y[i+3] = sum[3]; 194 _y[i+3] = sum[3];
208 } 195 }
209 for (;i<N;i++) 196 for (;i<N;i++)
@@ -211,7 +198,7 @@ void celt_iir(const opus_val32 *_x,
211 opus_val32 sum = _x[i]; 198 opus_val32 sum = _x[i];
212 for (j=0;j<ord;j++) 199 for (j=0;j<ord;j++)
213 sum -= MULT16_16(rden[j],y[i+j]); 200 sum -= MULT16_16(rden[j],y[i+j]);
214 y[i+ord] = ROUND16(sum,SIG_SHIFT); 201 y[i+ord] = SROUND16(sum,SIG_SHIFT);
215 _y[i] = sum; 202 _y[i] = sum;
216 } 203 }
217 for(i=0;i<ord;i++) 204 for(i=0;i<ord;i++)