diff options
Diffstat (limited to 'lib/rbcodec/codecs/libopus/celt/celt_lpc.c')
-rw-r--r-- | lib/rbcodec/codecs/libopus/celt/celt_lpc.c | 73 |
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 | ||
91 | void celt_fir(const opus_val16 *_x, | 90 | |
91 | void 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++) |