1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 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 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 /**************************************************************************************** 19 Portions of this file are derived from the following 3GPP standard: 20 21 3GPP TS 26.173 22 ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec 23 Available from http://www.3gpp.org 24 25 (C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26 Permission to distribute, modify and use this file under the standard license 27 terms listed above has been obtained from the copyright holder. 28 ****************************************************************************************/ 29 /* 30 ------------------------------------------------------------------------------ 31 32 33 34 Filename: qpisf_2s.cpp 35 36 Date: 05/08/2007 37 38 ------------------------------------------------------------------------------ 39 REVISION HISTORY 40 41 42 Description: 43 44 ------------------------------------------------------------------------------ 45 INPUT AND OUTPUT DEFINITIONS 46 47 int16 * seed seed for the random ng 48 49 ------------------------------------------------------------------------------ 50 FUNCTION DESCRIPTION 51 52 Coding/Decoding of ISF parameters with prediction. 53 54 The ISF vector is quantized using two-stage VQ with split-by-2 55 in 1st stage and split-by-5 (or 3)in the second stage. 56 57 ------------------------------------------------------------------------------ 58 REQUIREMENTS 59 60 61 ------------------------------------------------------------------------------ 62 REFERENCES 63 64 ------------------------------------------------------------------------------ 65 PSEUDO-CODE 66 67 ------------------------------------------------------------------------------ 68 */ 69 70 71 /*---------------------------------------------------------------------------- 72 ; INCLUDES 73 ----------------------------------------------------------------------------*/ 74 75 #include "pv_amr_wb_type_defs.h" 76 #include "pvamrwbdecoder_basic_op.h" 77 #include "pvamrwbdecoder_cnst.h" 78 #include "pvamrwbdecoder_acelp.h" 79 80 #include "qisf_ns.h" 81 #include "qpisf_2s.h" 82 83 /*---------------------------------------------------------------------------- 84 ; MACROS 85 ; Define module specific macros here 86 ----------------------------------------------------------------------------*/ 87 88 89 /*---------------------------------------------------------------------------- 90 ; DEFINES 91 ; Include all pre-processor statements here. Include conditional 92 ; compile variables also. 93 ----------------------------------------------------------------------------*/ 94 #define MU 10923 /* Prediction factor (1.0/3.0) in Q15 */ 95 #define N_SURV_MAX 4 /* 4 survivors max */ 96 #define ALPHA 29491 /* 0. 9 in Q15 */ 97 #define ONE_ALPHA (32768-ALPHA) /* (1.0 - ALPHA) in Q15 */ 98 99 /*---------------------------------------------------------------------------- 100 ; LOCAL FUNCTION DEFINITIONS 101 ; Function Prototype declaration 102 ----------------------------------------------------------------------------*/ 103 104 /*---------------------------------------------------------------------------- 105 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 106 ; Variable declaration - defined here and used outside this module 107 ----------------------------------------------------------------------------*/ 108 109 /*---------------------------------------------------------------------------- 110 ; EXTERNAL FUNCTION REFERENCES 111 ; Declare functions defined elsewhere and referenced in this module 112 ----------------------------------------------------------------------------*/ 113 114 /*---------------------------------------------------------------------------- 115 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 116 ; Declare variables used in this module but defined elsewhere 117 ----------------------------------------------------------------------------*/ 118 119 /*---------------------------------------------------------------------------- 120 ; FUNCTION CODE 121 ----------------------------------------------------------------------------*/ 122 123 124 /*-------------------------------------------------------------------* 125 * routine: Disf_2s_46b() * 126 * ~~~~~~~~~ * 127 * Decoding of ISF parameters * 128 *-------------------------------------------------------------------*/ 129 130 void Dpisf_2s_46b( 131 int16 * indice, /* input: quantization indices */ 132 int16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ 133 int16 * past_isfq,/* i/0 : past ISF quantizer */ 134 int16 * isfold, /* input : past quantized ISF */ 135 int16 * isf_buf, /* input : isf buffer */ 136 int16 bfi, /* input : Bad frame indicator */ 137 int16 enc_dec 138 ) 139 { 140 int16 ref_isf[M]; 141 int16 i, j, tmp; 142 int32 L_tmp; 143 144 145 if (bfi == 0) /* Good frame */ 146 { 147 for (i = 0; i < 9; i++) 148 { 149 isf_q[i] = dico1_isf[(indice[0] << 3) + indice[0] + i]; 150 } 151 for (i = 0; i < 7; i++) 152 { 153 isf_q[i + 9] = dico2_isf[(indice[1] << 3) - indice[1] + i]; 154 } 155 156 for (i = 0; i < 3; i++) 157 { 158 isf_q[i] += dico21_isf[indice[2] * 3 + i]; 159 isf_q[i + 3] += dico22_isf[indice[3] * 3 + i]; 160 isf_q[i + 6] += dico23_isf[indice[4] * 3 + i]; 161 isf_q[i + 9] += dico24_isf[indice[5] * 3 + i]; 162 isf_q[i + 12] += dico25_isf[(indice[6] << 2) + i]; 163 } 164 165 isf_q[i + 12] += dico25_isf[(indice[6] << 2) + i]; 166 167 for (i = 0; i < ORDER; i++) 168 { 169 tmp = isf_q[i]; 170 isf_q[i] += mean_isf[i]; 171 isf_q[i] += ((int32)MU * past_isfq[i]) >> 15; 172 past_isfq[i] = tmp; 173 } 174 175 176 if (enc_dec) 177 { 178 for (i = 0; i < M; i++) 179 { 180 for (j = (L_MEANBUF - 1); j > 0; j--) 181 { 182 isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; 183 } 184 isf_buf[i] = isf_q[i]; 185 } 186 } 187 } 188 else 189 { /* bad frame */ 190 for (i = 0; i < M; i++) 191 { 192 L_tmp = mul_16by16_to_int32(mean_isf[i], 8192); 193 for (j = 0; j < L_MEANBUF; j++) 194 { 195 L_tmp = mac_16by16_to_int32(L_tmp, isf_buf[j * M + i], 8192); 196 } 197 ref_isf[i] = amr_wb_round(L_tmp); 198 } 199 200 /* use the past ISFs slightly shifted towards their mean */ 201 for (i = 0; i < ORDER; i++) 202 { 203 isf_q[i] = add_int16(mult_int16(ALPHA, isfold[i]), mult_int16(ONE_ALPHA, ref_isf[i])); 204 } 205 206 /* estimate past quantized residual to be used in next frame */ 207 208 for (i = 0; i < ORDER; i++) 209 { 210 tmp = add_int16(ref_isf[i], mult_int16(past_isfq[i], MU)); /* predicted ISF */ 211 past_isfq[i] = sub_int16(isf_q[i], tmp); 212 past_isfq[i] >>= 1; /* past_isfq[i] *= 0.5 */ 213 } 214 215 } 216 217 Reorder_isf(isf_q, ISF_GAP, ORDER); 218 } 219 220 /* 221 * routine: Disf_2s_36b() 222 * ~~~~~~~~~ 223 * Decoding of ISF parameters 224 */ 225 226 void Dpisf_2s_36b( 227 int16 * indice, /* input: quantization indices */ 228 int16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ 229 int16 * past_isfq, /* i/0 : past ISF quantizer */ 230 int16 * isfold, /* input : past quantized ISF */ 231 int16 * isf_buf, /* input : isf buffer */ 232 int16 bfi, /* input : Bad frame indicator */ 233 int16 enc_dec 234 ) 235 { 236 int16 ref_isf[M]; 237 int16 i, j, tmp; 238 int32 L_tmp; 239 240 241 if (bfi == 0) /* Good frame */ 242 { 243 for (i = 0; i < 9; i++) 244 { 245 isf_q[i] = dico1_isf[indice[0] * 9 + i]; 246 } 247 for (i = 0; i < 7; i++) 248 { 249 isf_q[i + 9] = add_int16(dico2_isf[indice[1] * 7 + i], dico23_isf_36b[indice[4] * 7 + i]); 250 } 251 252 for (i = 0; i < 5; i++) 253 { 254 isf_q[i] = add_int16(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]); 255 } 256 for (i = 0; i < 4; i++) 257 { 258 isf_q[i + 5] = add_int16(isf_q[i + 5], dico22_isf_36b[(indice[3] << 2) + i]); 259 } 260 261 for (i = 0; i < ORDER; i++) 262 { 263 tmp = isf_q[i]; 264 isf_q[i] = add_int16(tmp, mean_isf[i]); 265 isf_q[i] = add_int16(isf_q[i], mult_int16(MU, past_isfq[i])); 266 past_isfq[i] = tmp; 267 } 268 269 270 if (enc_dec) 271 { 272 for (i = 0; i < M; i++) 273 { 274 for (j = (L_MEANBUF - 1); j > 0; j--) 275 { 276 isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; 277 } 278 isf_buf[i] = isf_q[i]; 279 } 280 } 281 } 282 else 283 { /* bad frame */ 284 for (i = 0; i < M; i++) 285 { 286 L_tmp = mul_16by16_to_int32(mean_isf[i], 8192); 287 for (j = 0; j < L_MEANBUF; j++) 288 { 289 L_tmp = mac_16by16_to_int32(L_tmp, isf_buf[j * M + i], 8192); 290 } 291 292 ref_isf[i] = amr_wb_round(L_tmp); 293 } 294 295 /* use the past ISFs slightly shifted towards their mean */ 296 for (i = 0; i < ORDER; i++) 297 { 298 isf_q[i] = add_int16(mult_int16(ALPHA, isfold[i]), mult_int16(ONE_ALPHA, ref_isf[i])); 299 } 300 301 /* estimate past quantized residual to be used in next frame */ 302 303 for (i = 0; i < ORDER; i++) 304 { 305 tmp = add_int16(ref_isf[i], mult_int16(past_isfq[i], MU)); /* predicted ISF */ 306 past_isfq[i] = sub_int16(isf_q[i], tmp); 307 past_isfq[i] >>= 1; /* past_isfq[i] *= 0.5 */ 308 } 309 } 310 311 Reorder_isf(isf_q, ISF_GAP, ORDER); 312 313 return; 314 } 315 316 /* 317 * procedure Reorder_isf() 318 * ~~~~~~~~~~~~~ 319 * To make sure that the isfs are properly order and to keep a certain 320 * minimum distance between consecutive isfs. 321 * 322 * Argument description in/out 323 * ~~~~~~~~ ~~~~~~~~~~~ ~~~~~~ 324 * isf[] vector of isfs i/o 325 * min_dist minimum required distance i 326 * n LPC order i 327 */ 328 329 void Reorder_isf( 330 int16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */ 331 int16 min_dist, /* (i) Q15 : minimum distance to keep */ 332 int16 n /* (i) : number of ISF */ 333 ) 334 { 335 int16 i, isf_min; 336 337 isf_min = min_dist; 338 339 for (i = 0; i < n - 1; i++) 340 { 341 if (isf[i] < isf_min) 342 { 343 isf[i] = isf_min; 344 } 345 isf_min = add_int16(isf[i], min_dist); 346 } 347 348 return; 349 } 350 351