1 /* 2 ** Copyright 2003-2010, VisualOn, Inc. 3 ** 4 ** Licensed under the Apache License, Version 2.0 (the "License"); 5 ** you may not use this file except in compliance with the License. 6 ** You may obtain a copy of the License at 7 ** 8 ** http://www.apache.org/licenses/LICENSE-2.0 9 ** 10 ** Unless required by applicable law or agreed to in writing, software 11 ** distributed under the License is distributed on an "AS IS" BASIS, 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 ** See the License for the specific language governing permissions and 14 ** limitations under the License. 15 */ 16 17 18 /*--------------------------------------------------------------------------* 19 * ACELP.H * 20 *--------------------------------------------------------------------------* 21 * Function * 22 *--------------------------------------------------------------------------*/ 23 #ifndef __ACELP_H__ 24 #define __ACELP_H__ 25 26 #include "typedef.h" 27 #include "cod_main.h" 28 29 /*-----------------------------------------------------------------* 30 * LPC prototypes * 31 *-----------------------------------------------------------------*/ 32 33 Word16 median5(Word16 x[]); 34 35 void Autocorr( 36 Word16 x[], /* (i) : Input signal */ 37 Word16 m, /* (i) : LPC order */ 38 Word16 r_h[], /* (o) : Autocorrelations (msb) */ 39 Word16 r_l[] /* (o) : Autocorrelations (lsb) */ 40 ); 41 42 void Lag_window( 43 Word16 r_h[], /* (i/o) : Autocorrelations (msb) */ 44 Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */ 45 ); 46 47 void Init_Levinson( 48 Word16 * mem /* output :static memory (18 words) */ 49 ); 50 51 void Levinson( 52 Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */ 53 Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */ 54 Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 16) */ 55 Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */ 56 Word16 * mem /* (i/o) :static memory (18 words) */ 57 ); 58 59 void Az_isp( 60 Word16 a[], /* (i) Q12 : predictor coefficients */ 61 Word16 isp[], /* (o) Q15 : Immittance spectral pairs */ 62 Word16 old_isp[] /* (i) : old isp[] (in case not found M roots) */ 63 ); 64 65 void Isp_Az( 66 Word16 isp[], /* (i) Q15 : Immittance spectral pairs */ 67 Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */ 68 Word16 m, 69 Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */ 70 /* 1 : adaptive scaling enabled */ 71 ); 72 73 void Isp_isf( 74 Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */ 75 Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ 76 Word16 m /* (i) : LPC order */ 77 ); 78 79 void Isf_isp( 80 Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */ 81 Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */ 82 Word16 m /* (i) : LPC order */ 83 ); 84 85 void Int_isp( 86 Word16 isp_old[], /* input : isps from past frame */ 87 Word16 isp_new[], /* input : isps from present frame */ 88 Word16 frac[], /* input : fraction for 3 first subfr (Q15) */ 89 Word16 Az[] /* output: LP coefficients in 4 subframes */ 90 ); 91 92 void Weight_a( 93 Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */ 94 Word16 ap[], /* (o) Q12 : Spectral expanded LPC coefficients */ 95 Word16 gamma, /* (i) Q15 : Spectral expansion factor. */ 96 Word16 m /* (i) : LPC order. */ 97 ); 98 99 100 /*-----------------------------------------------------------------* 101 * isf quantizers * 102 *-----------------------------------------------------------------*/ 103 104 void Qpisf_2s_46b( 105 Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ 106 Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ 107 Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ 108 Word16 * indice, /* (o) : quantization indices */ 109 Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ 110 ); 111 112 void Qpisf_2s_36b( 113 Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ 114 Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ 115 Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ 116 Word16 * indice, /* (o) : quantization indices */ 117 Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ 118 ); 119 120 void Dpisf_2s_46b( 121 Word16 * indice, /* input: quantization indices */ 122 Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ 123 Word16 * past_isfq, /* i/0 : past ISF quantizer */ 124 Word16 * isfold, /* input : past quantized ISF */ 125 Word16 * isf_buf, /* input : isf buffer */ 126 Word16 bfi, /* input : Bad frame indicator */ 127 Word16 enc_dec 128 ); 129 130 void Dpisf_2s_36b( 131 Word16 * indice, /* input: quantization indices */ 132 Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ 133 Word16 * past_isfq, /* i/0 : past ISF quantizer */ 134 Word16 * isfold, /* input : past quantized ISF */ 135 Word16 * isf_buf, /* input : isf buffer */ 136 Word16 bfi, /* input : Bad frame indicator */ 137 Word16 enc_dec 138 ); 139 140 void Qisf_ns( 141 Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */ 142 Word16 * isf_q, /* output: quantized ISF */ 143 Word16 * indice /* output: quantization indices */ 144 ); 145 146 void Disf_ns( 147 Word16 * indice, /* input: quantization indices */ 148 Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */ 149 ); 150 151 Word16 Sub_VQ( /* output: return quantization index */ 152 Word16 * x, /* input : ISF residual vector */ 153 Word16 * dico, /* input : quantization codebook */ 154 Word16 dim, /* input : dimention of vector */ 155 Word16 dico_size, /* input : size of quantization codebook */ 156 Word32 * distance /* output: error of quantization */ 157 ); 158 159 void Reorder_isf( 160 Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */ 161 Word16 min_dist, /* (i) Q15 : minimum distance to keep */ 162 Word16 n /* (i) : number of ISF */ 163 ); 164 165 /*-----------------------------------------------------------------* 166 * filter prototypes * 167 *-----------------------------------------------------------------*/ 168 169 void Init_Decim_12k8( 170 Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */ 171 ); 172 void Decim_12k8( 173 Word16 sig16k[], /* input: signal to downsampling */ 174 Word16 lg, /* input: length of input */ 175 Word16 sig12k8[], /* output: decimated signal */ 176 Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */ 177 ); 178 179 void Init_HP50_12k8(Word16 mem[]); 180 void HP50_12k8( 181 Word16 signal[], /* input/output signal */ 182 Word16 lg, /* lenght of signal */ 183 Word16 mem[] /* filter memory [6] */ 184 ); 185 void Init_HP400_12k8(Word16 mem[]); 186 void HP400_12k8( 187 Word16 signal[], /* input/output signal */ 188 Word16 lg, /* lenght of signal */ 189 Word16 mem[] /* filter memory [6] */ 190 ); 191 192 void Init_Filt_6k_7k(Word16 mem[]); 193 void Filt_6k_7k( 194 Word16 signal[], /* input: signal */ 195 Word16 lg, /* input: length of input */ 196 Word16 mem[] /* in/out: memory (size=30) */ 197 ); 198 void Filt_6k_7k_asm( 199 Word16 signal[], /* input: signal */ 200 Word16 lg, /* input: length of input */ 201 Word16 mem[] /* in/out: memory (size=30) */ 202 ); 203 204 void LP_Decim2( 205 Word16 x[], /* in/out: signal to process */ 206 Word16 l, /* input : size of filtering */ 207 Word16 mem[] /* in/out: memory (size=3) */ 208 ); 209 210 void Preemph( 211 Word16 x[], /* (i/o) : input signal overwritten by the output */ 212 Word16 mu, /* (i) Q15 : preemphasis coefficient */ 213 Word16 lg, /* (i) : lenght of filtering */ 214 Word16 * mem /* (i/o) : memory (x[-1]) */ 215 ); 216 void Preemph2( 217 Word16 x[], /* (i/o) : input signal overwritten by the output */ 218 Word16 mu, /* (i) Q15 : preemphasis coefficient */ 219 Word16 lg, /* (i) : lenght of filtering */ 220 Word16 * mem /* (i/o) : memory (x[-1]) */ 221 ); 222 void Deemph( 223 Word16 x[], /* (i/o) : input signal overwritten by the output */ 224 Word16 mu, /* (i) Q15 : deemphasis factor */ 225 Word16 L, /* (i) : vector size */ 226 Word16 * mem /* (i/o) : memory (y[-1]) */ 227 ); 228 void Deemph2( 229 Word16 x[], /* (i/o) : input signal overwritten by the output */ 230 Word16 mu, /* (i) Q15 : deemphasis factor */ 231 Word16 L, /* (i) : vector size */ 232 Word16 * mem /* (i/o) : memory (y[-1]) */ 233 ); 234 void Deemph_32( 235 Word16 x_hi[], /* (i) : input signal (bit31..16) */ 236 Word16 x_lo[], /* (i) : input signal (bit15..4) */ 237 Word16 y[], /* (o) : output signal (x16) */ 238 Word16 mu, /* (i) Q15 : deemphasis factor */ 239 Word16 L, /* (i) : vector size */ 240 Word16 * mem /* (i/o) : memory (y[-1]) */ 241 ); 242 243 void Deemph_32_asm( 244 Word16 x_hi[], /* (i) : input signal (bit31..16) */ 245 Word16 x_lo[], /* (i) : input signal (bit15..4) */ 246 Word16 y[], /* (o) : output signal (x16) */ 247 Word16 * mem /* (i/o) : memory (y[-1]) */ 248 ); 249 250 void Convolve( 251 Word16 x[], /* (i) : input vector */ 252 Word16 h[], /* (i) Q15 : impulse response */ 253 Word16 y[], /* (o) 12 bits: output vector */ 254 Word16 L /* (i) : vector size */ 255 ); 256 257 void Convolve_asm( 258 Word16 x[], /* (i) : input vector */ 259 Word16 h[], /* (i) Q15 : impulse response */ 260 Word16 y[], /* (o) 12 bits: output vector */ 261 Word16 L /* (i) : vector size */ 262 ); 263 264 void Residu( 265 Word16 a[], /* (i) Q12 : prediction coefficients */ 266 Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ 267 Word16 y[], /* (o) : residual signal */ 268 Word16 lg /* (i) : size of filtering */ 269 ); 270 271 void Residu_opt( 272 Word16 a[], /* (i) Q12 : prediction coefficients */ 273 Word16 x[], /* (i) : speech (values x[-m..-1] are needed */ 274 Word16 y[], /* (o) : residual signal */ 275 Word16 lg /* (i) : size of filtering */ 276 ); 277 278 void Syn_filt( 279 Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ 280 Word16 x[], /* (i) : input signal */ 281 Word16 y[], /* (o) : output signal */ 282 Word16 lg, /* (i) : size of filtering */ 283 Word16 mem[], /* (i/o) : memory associated with this filtering. */ 284 Word16 update /* (i) : 0=no update, 1=update of memory. */ 285 ); 286 287 void Syn_filt_asm( 288 Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ 289 Word16 x[], /* (i) : input signal */ 290 Word16 y[], /* (o) : output signal */ 291 Word16 mem[] /* (i/o) : memory associated with this filtering. */ 292 ); 293 294 void Syn_filt_32( 295 Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ 296 Word16 m, /* (i) : order of LP filter */ 297 Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ 298 Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ 299 Word16 sig_hi[], /* (o) /16 : synthesis high */ 300 Word16 sig_lo[], /* (o) /16 : synthesis low */ 301 Word16 lg /* (i) : size of filtering */ 302 ); 303 304 void Syn_filt_32_asm( 305 Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ 306 Word16 m, /* (i) : order of LP filter */ 307 Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ 308 Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ 309 Word16 sig_hi[], /* (o) /16 : synthesis high */ 310 Word16 sig_lo[], /* (o) /16 : synthesis low */ 311 Word16 lg /* (i) : size of filtering */ 312 ); 313 /*-----------------------------------------------------------------* 314 * pitch prototypes * 315 *-----------------------------------------------------------------*/ 316 317 Word16 Pitch_ol( /* output: open loop pitch lag */ 318 Word16 signal[], /* input : signal used to compute the open loop pitch */ 319 /* signal[-pit_max] to signal[-1] should be known */ 320 Word16 pit_min, /* input : minimum pitch lag */ 321 Word16 pit_max, /* input : maximum pitch lag */ 322 Word16 L_frame /* input : length of frame to compute pitch */ 323 ); 324 325 Word16 Pitch_med_ol( /* output: open loop pitch lag */ 326 Word16 wsp[], /* input : signal used to compute the open loop pitch */ 327 /* wsp[-pit_max] to wsp[-1] should be known */ 328 Coder_State *st, /* i/o : global codec structure */ 329 Word16 L_frame /* input : length of frame to compute pitch */ 330 ); 331 332 Word16 Med_olag( /* output : median of 5 previous open-loop lags */ 333 Word16 prev_ol_lag, /* input : previous open-loop lag */ 334 Word16 old_ol_lag[5] 335 ); 336 337 void Init_Hp_wsp(Word16 mem[]); 338 void scale_mem_Hp_wsp(Word16 mem[], Word16 exp); 339 void Hp_wsp( 340 Word16 wsp[], /* i : wsp[] signal */ 341 Word16 hp_wsp[], /* o : hypass wsp[] */ 342 Word16 lg, /* i : lenght of signal */ 343 Word16 mem[] /* i/o : filter memory [9] */ 344 ); 345 346 Word16 Pitch_fr4( /* (o) : pitch period. */ 347 Word16 exc[], /* (i) : excitation buffer */ 348 Word16 xn[], /* (i) : target vector */ 349 Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */ 350 Word16 t0_min, /* (i) : minimum value in the searched range. */ 351 Word16 t0_max, /* (i) : maximum value in the searched range. */ 352 Word16 * pit_frac, /* (o) : chosen fraction (0, 1, 2 or 3). */ 353 Word16 i_subfr, /* (i) : indicator for first subframe. */ 354 Word16 t0_fr2, /* (i) : minimum value for resolution 1/2 */ 355 Word16 t0_fr1, /* (i) : minimum value for resolution 1 */ 356 Word16 L_subfr /* (i) : Length of subframe */ 357 ); 358 void Pred_lt4( 359 Word16 exc[], /* in/out: excitation buffer */ 360 Word16 T0, /* input : integer pitch lag */ 361 Word16 frac, /* input : fraction of lag */ 362 Word16 L_subfr /* input : subframe size */ 363 ); 364 365 void pred_lt4_asm( 366 Word16 exc[], /* in/out: excitation buffer */ 367 Word16 T0, /* input : integer pitch lag */ 368 Word16 frac, /* input : fraction of lag */ 369 Word16 L_subfr /* input : subframe size */ 370 ); 371 372 /*-----------------------------------------------------------------* 373 * gain prototypes * 374 *-----------------------------------------------------------------*/ 375 376 Word16 G_pitch( /* (o) Q14 : Gain of pitch lag saturated to 1.2 */ 377 Word16 xn[], /* (i) : Pitch target. */ 378 Word16 y1[], /* (i) : filtered adaptive codebook. */ 379 Word16 g_coeff[], /* : Correlations need for gain quantization. */ 380 Word16 L_subfr /* : Length of subframe. */ 381 ); 382 void Init_Q_gain2( 383 Word16 * mem /* output :static memory (2 words) */ 384 ); 385 Word16 Q_gain2( /* Return index of quantization. */ 386 Word16 xn[], /* (i) Q_xn:Target vector. */ 387 Word16 y1[], /* (i) Q_xn:Adaptive codebook. */ 388 Word16 Q_xn, /* (i) :xn and y1 format */ 389 Word16 y2[], /* (i) Q9 :Filtered innovative vector. */ 390 Word16 code[], /* (i) Q9 :Innovative vector. */ 391 Word16 g_coeff[], /* (i) :Correlations <xn y1> <y1 y1> */ 392 /* Compute in G_pitch(). */ 393 Word16 L_subfr, /* (i) :Subframe lenght. */ 394 Word16 nbits, /* (i) : number of bits (6 or 7) */ 395 Word16 * gain_pit, /* (i/o)Q14:Pitch gain. */ 396 Word32 * gain_cod, /* (o) Q16 :Code gain. */ 397 Word16 gp_clip, /* (i) : Gp Clipping flag */ 398 Word16 * mem /* (i/o) :static memory (2 words) */ 399 ); 400 401 void Init_D_gain2( 402 Word16 * mem /* output :static memory (4 words) */ 403 ); 404 void D_gain2( 405 Word16 index, /* (i) :index of quantization. */ 406 Word16 nbits, /* (i) : number of bits (6 or 7) */ 407 Word16 code[], /* (i) Q9 :Innovative vector. */ 408 Word16 L_subfr, /* (i) :Subframe lenght. */ 409 Word16 * gain_pit, /* (o) Q14 :Pitch gain. */ 410 Word32 * gain_cod, /* (o) Q16 :Code gain. */ 411 Word16 bfi, /* (i) :bad frame indicator */ 412 Word16 prev_bfi, /* (i) : Previous BF indicator */ 413 Word16 state, /* (i) : State of BFH */ 414 Word16 unusable_frame, /* (i) : UF indicator */ 415 Word16 vad_hist, /* (i) :number of non-speech frames */ 416 Word16 * mem /* (i/o) :static memory (4 words) */ 417 ); 418 419 /*-----------------------------------------------------------------* 420 * acelp prototypes * 421 *-----------------------------------------------------------------*/ 422 423 void cor_h_x( 424 Word16 h[], /* (i) Q12 : impulse response of weighted synthesis filter */ 425 Word16 x[], /* (i) Q0 : target vector */ 426 Word16 dn[] /* (o) <12bit : correlation between target and h[] */ 427 ); 428 void ACELP_2t64_fx( 429 Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */ 430 Word16 cn[], /* (i) <12b : residual after long term prediction */ 431 Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */ 432 Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */ 433 Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */ 434 Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */ 435 ); 436 437 void ACELP_4t64_fx( 438 Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */ 439 Word16 cn[], /* (i) <12b : residual after long term prediction */ 440 Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */ 441 Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */ 442 Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */ 443 Word16 nbbits, /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits */ 444 Word16 ser_size, /* (i) : bit rate */ 445 Word16 _index[] /* (o) : index (20): 5+5+5+5 = 20 bits. */ 446 /* (o) : index (36): 9+9+9+9 = 36 bits. */ 447 /* (o) : index (44): 13+9+13+9 = 44 bits. */ 448 /* (o) : index (52): 13+13+13+13 = 52 bits. */ 449 /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */ 450 /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */ 451 /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */ 452 ); 453 454 void Pit_shrp( 455 Word16 * x, /* in/out: impulse response (or algebraic code) */ 456 Word16 pit_lag, /* input : pitch lag */ 457 Word16 sharp, /* input : pitch sharpening factor (Q15) */ 458 Word16 L_subfr /* input : subframe size */ 459 ); 460 461 462 /*-----------------------------------------------------------------* 463 * others prototypes * 464 *-----------------------------------------------------------------*/ 465 466 void Copy( 467 Word16 x[], /* (i) : input vector */ 468 Word16 y[], /* (o) : output vector */ 469 Word16 L /* (i) : vector length */ 470 ); 471 void Set_zero( 472 Word16 x[], /* (o) : vector to clear */ 473 Word16 L /* (i) : length of vector */ 474 ); 475 void Updt_tar( 476 Word16 * x, /* (i) Q0 : old target (for pitch search) */ 477 Word16 * x2, /* (o) Q0 : new target (for codebook search) */ 478 Word16 * y, /* (i) Q0 : filtered adaptive codebook vector */ 479 Word16 gain, /* (i) Q14 : adaptive codebook gain */ 480 Word16 L /* (i) : subframe size */ 481 ); 482 Word16 voice_factor( /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */ 483 Word16 exc[], /* (i) Q_exc: pitch excitation */ 484 Word16 Q_exc, /* (i) : exc format */ 485 Word16 gain_pit, /* (i) Q14 : gain of pitch */ 486 Word16 code[], /* (i) Q9 : Fixed codebook excitation */ 487 Word16 gain_code, /* (i) Q0 : gain of code */ 488 Word16 L_subfr /* (i) : subframe length */ 489 ); 490 void Scale_sig( 491 Word16 x[], /* (i/o) : signal to scale */ 492 Word16 lg, /* (i) : size of x[] */ 493 Word16 exp /* (i) : exponent: x = round(x << exp) */ 494 ); 495 496 void Scale_sig_opt( 497 Word16 x[], /* (i/o) : signal to scale */ 498 Word16 lg, /* (i) : size of x[] */ 499 Word16 exp /* (i) : exponent: x = round(x << exp) */ 500 ); 501 502 Word16 Random(Word16 * seed); 503 504 void Init_gp_clip( 505 Word16 mem[] /* (o) : memory of gain of pitch clipping algorithm */ 506 ); 507 Word16 Gp_clip( 508 Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ 509 ); 510 void Gp_clip_test_isf( 511 Word16 isf[], /* (i) : isf values (in frequency domain) */ 512 Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ 513 ); 514 void Gp_clip_test_gain_pit( 515 Word16 gain_pit, /* (i) : gain of quantized pitch */ 516 Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */ 517 ); 518 519 520 #endif //__ACELP_H__ 521 522