1 /* 2 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 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 * @file picosig2.c 18 * 19 * Signal Generation PU - Internal functions - Implementation 20 * 21 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 22 * All rights reserved. 23 * 24 * History: 25 * - 2009-04-20 -- initial version 26 * 27 */ 28 #include "picoos.h" 29 #include "picodsp.h" 30 #include "picosig2.h" 31 #include "picofftsg.h" 32 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 #if 0 37 } 38 #endif 39 /*--------------------------------------------------------------------------- 40 * INTERNAL FUNCTIONS DECLARATION 41 *---------------------------------------------------------------------------*/ 42 static void gen_hann2(sig_innerobj_t *sig_inObj); 43 static void get_simple_excitation(sig_innerobj_t *sig_inObj, 44 picoos_int16 *nextPeak); 45 static void enh_wind_init(sig_innerobj_t *sig_inObj); 46 static void init_rand(sig_innerobj_t *sig_inObj); 47 static void get_trig(picoos_int32 ang, picoos_int32 *table, picoos_int32 *cs, 48 picoos_int32 *sn); 49 50 /*--------------------------------------------------------------------------- 51 * PICO SYSTEM FUNCTIONS 52 *---------------------------------------------------------------------------*/ 53 /** 54 * allocation of DSP memory for SIG PU 55 * @param mm : memory manager 56 * @param sig_inObj : sig PU internal object of the sub-object 57 * @return PICO_OK : allocation successful 58 * @return PICO_ERR_OTHER : allocation NOT successful 59 * @callgraph 60 * @callergraph 61 */ 62 pico_status_t sigAllocate(picoos_MemoryManager mm, sig_innerobj_t *sig_inObj) 63 { 64 picoos_int16 *data_i; 65 picoos_int32 *d32; 66 picoos_int32 nCount; 67 68 sig_inObj->int_vec22 = 69 sig_inObj->int_vec23 = 70 sig_inObj->int_vec24 = 71 sig_inObj->int_vec25 = 72 sig_inObj->int_vec26 = 73 sig_inObj->int_vec28 = 74 sig_inObj->int_vec29 = 75 sig_inObj->int_vec30 = 76 sig_inObj->int_vec31 = 77 sig_inObj->int_vec32 = 78 sig_inObj->int_vec33 = 79 sig_inObj->int_vec34 = 80 sig_inObj->int_vec35 = 81 sig_inObj->int_vec36 = 82 sig_inObj->int_vec37 = 83 sig_inObj->int_vec39 = 84 sig_inObj->int_vec40 = NULL; 85 86 sig_inObj->sig_vec1 = NULL; 87 88 sig_inObj->idx_vect1 = sig_inObj->idx_vect2 = sig_inObj->idx_vect4 = NULL; 89 sig_inObj->idx_vect5 = sig_inObj->idx_vect6 = sig_inObj->idx_vect7 = 90 sig_inObj->idx_vect8 = sig_inObj->idx_vect9 = NULL; 91 sig_inObj->ivalue17 = sig_inObj->ivalue18 = 0; 92 93 /*----------------------------------------------------------------- 94 * Memory allocations 95 * NOTE : it would be far better to do a single allocation 96 * and to do pointer initialization inside this routine 97 * ------------------------------------------------------------------*/ 98 data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16) 99 * PICODSP_FFTSIZE); 100 if (NULL == data_i) { 101 sigDeallocate(mm, sig_inObj); 102 return PICO_ERR_OTHER; 103 } 104 sig_inObj->idx_vect1 = data_i; 105 106 data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16) 107 * PICODSP_HFFTSIZE_P1); 108 if (NULL == data_i) { 109 sigDeallocate(mm, sig_inObj); 110 return PICO_ERR_OTHER; 111 } 112 sig_inObj->idx_vect2 = data_i; 113 114 data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16) 115 * PICODSP_FFTSIZE); 116 if (NULL == data_i) { 117 sigDeallocate(mm, sig_inObj); 118 return PICO_ERR_OTHER; 119 } 120 sig_inObj->idx_vect4 = data_i; 121 122 data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16) 123 * PICODSP_FFTSIZE); 124 if (NULL == data_i) { 125 sigDeallocate(mm, sig_inObj); 126 return PICO_ERR_OTHER; 127 } 128 sig_inObj->idx_vect5 = data_i; 129 130 data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16) 131 * PICODSP_FFTSIZE); 132 if (NULL == data_i) { 133 sigDeallocate(mm, sig_inObj); 134 return PICO_ERR_OTHER; 135 } 136 sig_inObj->idx_vect6 = data_i; 137 138 data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16) 139 * PICODSP_HFFTSIZE_P1); 140 if (NULL == data_i) { 141 sigDeallocate(mm, sig_inObj); 142 return PICO_ERR_OTHER; 143 } 144 sig_inObj->idx_vect7 = data_i; 145 146 data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16) 147 * PICODSP_MAX_EX); 148 if (NULL == data_i) { 149 sigDeallocate(mm, sig_inObj); 150 return PICO_ERR_OTHER; 151 } 152 sig_inObj->idx_vect8 = data_i; 153 154 data_i = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16) 155 * PICODSP_MAX_EX); 156 if (data_i == NULL) { 157 sigDeallocate(mm, sig_inObj); 158 return PICO_ERR_OTHER; 159 } 160 sig_inObj->idx_vect9 = data_i; 161 162 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 163 * PICODSP_FFTSIZE); 164 if (NULL == d32) { 165 sigDeallocate(mm, sig_inObj); 166 return PICO_ERR_OTHER; 167 } 168 sig_inObj->int_vec22 = d32; 169 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 170 * PICODSP_FFTSIZE); 171 if (NULL == d32) { 172 sigDeallocate(mm, sig_inObj); 173 return PICO_ERR_OTHER; 174 } 175 sig_inObj->int_vec23 = d32; 176 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 177 * PICODSP_FFTSIZE); 178 if (NULL == d32) { 179 sigDeallocate(mm, sig_inObj); 180 return PICO_ERR_OTHER; 181 } 182 sig_inObj->int_vec24 = d32; 183 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 184 * PICODSP_FFTSIZE); 185 if (NULL == d32) { 186 sigDeallocate(mm, sig_inObj); 187 return PICO_ERR_OTHER; 188 } 189 sig_inObj->int_vec25 = d32; 190 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 191 * PICODSP_FFTSIZE * 2); 192 if (NULL == d32) { 193 sigDeallocate(mm, sig_inObj); 194 return PICO_ERR_OTHER; 195 } 196 sig_inObj->int_vec26 = d32; 197 198 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 199 * PICODSP_FFTSIZE); 200 if (NULL == d32) { 201 sigDeallocate(mm, sig_inObj); 202 return PICO_ERR_OTHER; 203 } 204 sig_inObj->int_vec28 = d32; 205 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 206 * PICODSP_FFTSIZE); 207 if (NULL == d32) { 208 sigDeallocate(mm, sig_inObj); 209 return PICO_ERR_OTHER; 210 } 211 sig_inObj->int_vec29 = d32; 212 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 213 * PICODSP_FFTSIZE); 214 if (NULL == d32) { 215 sigDeallocate(mm, sig_inObj); 216 return PICO_ERR_OTHER; 217 } 218 sig_inObj->int_vec38 = d32; 219 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 220 * PICODSP_FFTSIZE); 221 if (NULL == d32) { 222 sigDeallocate(mm, sig_inObj); 223 return PICO_ERR_OTHER; 224 } 225 sig_inObj->int_vec30 = d32; 226 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 227 * PICODSP_FFTSIZE); 228 if (NULL == d32) { 229 sigDeallocate(mm, sig_inObj); 230 return PICO_ERR_OTHER; 231 } 232 sig_inObj->int_vec31 = d32; 233 234 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 235 * PICODSP_FFTSIZE); 236 if (NULL == d32) { 237 sigDeallocate(mm, sig_inObj); 238 return PICO_ERR_OTHER; 239 } 240 sig_inObj->int_vec32 = d32; 241 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 242 * PICODSP_FFTSIZE); 243 if (NULL == d32) { 244 sigDeallocate(mm, sig_inObj); 245 return PICO_ERR_OTHER; 246 } 247 sig_inObj->int_vec33 = d32; 248 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 249 * PICODSP_N_RAND_TABLE); 250 if (NULL == d32) { 251 sigDeallocate(mm, sig_inObj); 252 return PICO_ERR_OTHER; 253 } 254 sig_inObj->int_vec34 = d32; 255 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 256 * PICODSP_N_RAND_TABLE); 257 if (NULL == d32) { 258 sigDeallocate(mm, sig_inObj); 259 return PICO_ERR_OTHER; 260 } 261 sig_inObj->int_vec35 = d32; 262 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 263 * PICODSP_N_RAND_TABLE); 264 if (NULL == d32) { 265 sigDeallocate(mm, sig_inObj); 266 return PICO_ERR_OTHER; 267 } 268 sig_inObj->int_vec36 = d32; 269 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 270 * PICODSP_N_RAND_TABLE); 271 if (NULL == d32) { 272 sigDeallocate(mm, sig_inObj); 273 return PICO_ERR_OTHER; 274 } 275 sig_inObj->int_vec37 = d32; 276 277 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 278 * PICODSP_HFFTSIZE_P1); 279 if (NULL == d32) { 280 sigDeallocate(mm, sig_inObj); 281 return PICO_ERR_OTHER; 282 } 283 sig_inObj->int_vec39 = d32; 284 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) * (1 285 + PICODSP_COS_TABLE_LEN)); 286 if (NULL == d32) { 287 sigDeallocate(mm, sig_inObj); 288 return PICO_ERR_OTHER; 289 } 290 sig_inObj->int_vec40 = d32; 291 292 for (nCount = 0; nCount < CEPST_BUFF_SIZE; nCount++) { 293 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) * (PICODSP_CEPORDER)); 294 if (NULL == d32) { 295 sigDeallocate(mm, sig_inObj); 296 return PICO_ERR_OTHER; 297 } 298 sig_inObj->int_vec41[nCount] = d32; 299 } 300 301 for (nCount = 0; nCount < PHASE_BUFF_SIZE; nCount++) { 302 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) * (PICODSP_PHASEORDER)); 303 if (NULL == d32) { 304 sigDeallocate(mm, sig_inObj); 305 return PICO_ERR_OTHER; 306 } 307 sig_inObj->int_vec42[nCount] = d32; 308 } 309 310 d32 = (picoos_int32 *) picoos_allocate(mm, sizeof(picoos_int32) 311 * PICODSP_FFTSIZE * 2); /* - fixed point */ 312 if (NULL == d32) { 313 sigDeallocate(mm, sig_inObj); 314 return PICO_ERR_OTHER; 315 } 316 sig_inObj->sig_vec1 = d32; 317 318 return PICO_OK; 319 }/*sigAllocate*/ 320 321 /** 322 * frees DSP memory for SIG PU 323 * @param mm : memory manager 324 * @param sig_inObj : sig PU internal object of the sub-object 325 * @return void 326 * @callgraph 327 * @callergraph 328 */ 329 void sigDeallocate(picoos_MemoryManager mm, sig_innerobj_t *sig_inObj) 330 { 331 picoos_int32 nCount; 332 /*----------------------------------------------------------------- 333 * Memory de-allocations 334 * ------------------------------------------------------------------*/ 335 if (NULL != sig_inObj->idx_vect1) 336 picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect1)); 337 if (NULL != sig_inObj->idx_vect2) 338 picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect2)); 339 if (NULL != sig_inObj->idx_vect4) 340 picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect4)); 341 if (NULL != sig_inObj->idx_vect5) 342 picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect5)); 343 if (NULL != sig_inObj->idx_vect6) 344 picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect6)); 345 if (NULL != sig_inObj->idx_vect7) 346 picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect7)); 347 if (NULL != sig_inObj->idx_vect8) 348 picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect8)); 349 if (NULL != sig_inObj->idx_vect9) 350 picoos_deallocate(mm, (void *) &(sig_inObj->idx_vect9)); 351 352 if (NULL != sig_inObj->int_vec22) 353 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec22)); 354 if (NULL != sig_inObj->int_vec23) 355 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec23)); 356 if (NULL != sig_inObj->int_vec24) 357 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec24)); 358 if (NULL != sig_inObj->int_vec25) 359 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec25)); 360 if (NULL != sig_inObj->int_vec26) 361 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec26)); 362 if (NULL != sig_inObj->int_vec28) 363 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec28)); 364 if (NULL != sig_inObj->int_vec29) 365 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec29)); 366 if (NULL != sig_inObj->int_vec38) 367 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec38)); 368 if (NULL != sig_inObj->int_vec30) 369 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec30)); 370 if (NULL != sig_inObj->int_vec31) 371 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec31)); 372 if (NULL != sig_inObj->int_vec32) 373 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec32)); 374 if (NULL != sig_inObj->int_vec33) 375 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec33)); 376 if (NULL != sig_inObj->int_vec34) 377 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec34)); 378 if (NULL != sig_inObj->int_vec35) 379 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec35)); 380 if (NULL != sig_inObj->int_vec36) 381 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec36)); 382 if (NULL != sig_inObj->int_vec37) 383 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec37)); 384 if (NULL != sig_inObj->int_vec39) 385 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec39)); 386 if (NULL != sig_inObj->int_vec40) 387 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec40)); 388 389 for (nCount = 0; nCount < CEPST_BUFF_SIZE; nCount++) { 390 if (NULL != sig_inObj->int_vec41[nCount]) { 391 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec41[nCount])); 392 } 393 } 394 395 for (nCount = 0; nCount < PHASE_BUFF_SIZE; nCount++) { 396 if (NULL != sig_inObj->int_vec42[nCount]) { 397 picoos_deallocate(mm, (void *) &(sig_inObj->int_vec42[nCount])); 398 } 399 } 400 401 if (NULL != sig_inObj->sig_vec1) { 402 picoos_deallocate(mm, (void *) &(sig_inObj->sig_vec1)); 403 } 404 }/*sigDeAllocate*/ 405 406 /** 407 * initializes all memory neededed by DSP at instance creation time 408 * @param sig_inObj : sig PU internal object of the sub-object 409 * @return void 410 * @callgraph 411 * @callergraph 412 */ 413 void sigDspInitialize(sig_innerobj_t *sig_inObj, picoos_int32 resetMode) 414 { 415 picoos_int32 i, j; 416 picoos_int32 *pnt; 417 418 if (resetMode == PICO_RESET_SOFT) { 419 /*minimal initialization when receiving a soft reset */ 420 return; 421 } 422 /*----------------------------------------------------------------- 423 * Initialization 424 * ------------------------------------------------------------------*/ 425 sig_inObj->warp_p = PICODSP_FREQ_WARP_FACT; 426 sig_inObj->VCutoff_p = PICODSP_V_CUTOFF_FREQ; /*voicing cut off frequency in Hz (will be modeled in the future)*/ 427 sig_inObj->UVCutoff_p = PICODSP_UV_CUTOFF_FREQ;/*unvoiced frames only (periodize lowest components to mask bad voicing transitions)*/ 428 sig_inObj->Fs_p = PICODSP_SAMP_FREQ; /*Sampling freq*/ 429 430 sig_inObj->m1_p = PICODSP_CEPORDER; 431 sig_inObj->m2_p = PICODSP_FFTSIZE; /*also initializes windowLen*/ 432 sig_inObj->framesz_p = PICODSP_DISPLACE; /*1/4th of the frame size = displacement*/ 433 sig_inObj->hfftsize_p = PICODSP_H_FFTSIZE; /*half of the FFT size*/ 434 sig_inObj->voxbnd_p = (picoos_int32) ((picoos_single) sig_inObj->hfftsize_p 435 / ((picoos_single) sig_inObj->Fs_p / (picoos_single) 2) 436 * (picoos_single) sig_inObj->VCutoff_p); 437 sig_inObj->voxbnd2_p 438 = (picoos_int32) ((picoos_single) sig_inObj->hfftsize_p 439 / ((picoos_single) sig_inObj->Fs_p / (picoos_single) 2) 440 * (picoos_single) sig_inObj->UVCutoff_p); 441 sig_inObj->hop_p = sig_inObj->framesz_p; 442 sig_inObj->nextPeak_p = (((int) (PICODSP_FFTSIZE)) 443 / ((int) PICODSP_DISPLACE) - 1) * sig_inObj->hop_p; 444 sig_inObj->phId_p = 0; /*phonetic id*/ 445 sig_inObj->E_p = (picoos_single) 0.0f; 446 sig_inObj->F0_p = (picoos_single) 0.0f; 447 sig_inObj->voiced_p = 0; 448 sig_inObj->nV = sig_inObj->nU = 0; 449 sig_inObj->sMod_p = (picoos_single) 1.0f; 450 451 /*cleanup vectors*/ 452 for (i = 0; i < 2 * PICODSP_FFTSIZE; i++) { 453 sig_inObj->sig_vec1[i] = 0; 454 sig_inObj->int_vec26[i] = 0; /*wav buff cleanup */ 455 } 456 457 for (i = 0; i < PICODSP_FFTSIZE; i++) { 458 sig_inObj->idx_vect1[i] = sig_inObj->idx_vect4[i] 459 = sig_inObj->idx_vect5[i] = sig_inObj->idx_vect6[i] = 0; 460 sig_inObj->int_vec32[i] = sig_inObj->int_vec33[i] = 0; 461 } 462 463 for (i = 0; i < PICODSP_HFFTSIZE_P1; i++) { 464 sig_inObj->idx_vect2[i] = (picoos_int16) 0; 465 } 466 467 for (i = 0; i < CEPST_BUFF_SIZE; i++) { 468 sig_inObj->F0Buff[i]=0; 469 sig_inObj->PhIdBuff[i]=0; 470 sig_inObj->VoicingBuff[i]=0; 471 sig_inObj->FuVBuff[i]=0; 472 if (NULL != sig_inObj->CepBuff[i]) { 473 pnt = sig_inObj->CepBuff[i]; 474 for (j = 0; j < PICODSP_CEPORDER; j++) { 475 pnt[j] = 0; 476 } 477 } 478 } 479 480 for (i = 0; i < PHASE_BUFF_SIZE; i++) { 481 if (NULL != sig_inObj->int_vec42[i]) { 482 pnt = sig_inObj->int_vec42[i]; 483 for (j = 0; j < PICODSP_PHASEORDER; j++) { 484 pnt[j] = 0; 485 } 486 } 487 } 488 sig_inObj->n_available=0; 489 /*--------------------------------------------- 490 Init formant enhancement window 491 hanning window, 492 Post Filter Hermite's interpolator Matrix 493 Mel-2-Lin lookup tables 494 ---------------------------------------------*/ 495 enh_wind_init(sig_inObj); /*creates the formant enhancement window*/ 496 init_rand(sig_inObj); 497 gen_hann2(sig_inObj); 498 mel_2_lin_init(sig_inObj); 499 500 }/*sigDspInitialize*/ 501 502 /*------------------------------------------------------------------------------- 503 PROCESSING FUNCTIONS : CALLED WITHIN sigStep (cfr. picosig.c) 504 --------------------------------------------------------------------------------*/ 505 /** 506 * convert from mel scale to linear scale 507 * @param sig_inObj : sig PU internal object of the sub-object 508 * @param scmeanMGC : mean value of the MGC 509 * @return void 510 * @callgraph 511 * @callergraph 512 * @remarks translated from matlab code to c-code 513 * Input 514 * - c1 : input mfcc vector (ceporder=m1, real) 515 * - m1 : input order 516 * - A,B,D : lookup tables 517 * - m2 : output order 518 * - Xr,Xi (m2=FFT size, real) temporary arrays for FFT 519 * - WNr,WNi (m2=FFT size, real) cos and sin precalculated tables 520 * Output 521 * - Xr (m2=FFT size, real) linear cepstral vector 522 */ 523 void mel_2_lin_lookup(sig_innerobj_t *sig_inObj, picoos_uint32 scmeanMGC) 524 { 525 /*Local vars*/ 526 picoos_int16 nI, k; 527 picoos_int32 delta, term1, term2; 528 529 /*Local vars to be linked with sig data object*/ 530 picoos_int32 *c1, *XXr; 531 picoos_single K1; 532 picoos_int32 *D, K2, shift; 533 picoos_int16 m1, *A, m2, m4, voiced, i; 534 535 /*Link local variables with sig data object*/ 536 c1 = sig_inObj->wcep_pI; 537 m1 = sig_inObj->m1_p; 538 m2 = PICODSP_FFTSIZE; 539 m4 = m2 >> 1; 540 541 A = sig_inObj->A_p; 542 D = sig_inObj->d_p; 543 544 XXr = sig_inObj->wcep_pI; 545 voiced = sig_inObj->voiced_p; 546 547 shift = 27 - scmeanMGC; 548 K2 = 1 << shift; 549 K1 = (picoos_single) PICODSP_START_FLOAT_NORM * K2; 550 XXr[0] = (picoos_int32) ((picoos_single) c1[0] * K1); 551 for (nI = 1; nI < m1; nI++) { 552 XXr[nI] = c1[nI] << shift; 553 } 554 i = sizeof(picoos_int32) * (PICODSP_FFTSIZE + 1 - m1); 555 picoos_mem_set(XXr + m1, 0, i); 556 dfct_nmf(m4, XXr); /* DFCT directly in fixed point */ 557 558 /* ***************************************************************************************** 559 Linear frequency scale envelope through interpolation. 560 Two additions and one multiplication per entry. 561 562 Optimization of linear interpolation algorithm 563 - Start from 1 and stop at PICODSP_H_FFTSIZE-1 because 0 and PICODSP_H_FFTSIZE are invariant points 564 - B[k]=A[k]+1 except for 0 and PICODSP_H_FFTSIZE 565 - get rid of extra -1 operation by adapting the table A[] 566 567 *******************************************************************************************/ 568 for (nI = 1; nI < PICODSP_H_FFTSIZE; nI++) { 569 k = A[nI]; 570 term2 = XXr[k]; 571 term1 = XXr[k + 1]; 572 delta = term1 - term2; 573 XXr[nI] = term2 + ((D[nI] * delta) >> 5); /* ok because nI<=A[nI] <=B[nI] */ 574 } 575 }/*mel_2_lin_lookup*/ 576 577 /** 578 * calculate phase 579 * @remarks voiced phase taken from phase codebook and smoothed, 580 * @remarks unvoiced phase - random 581 * @param sig_inObj : sig PU internal object of the sub-object 582 * @return void 583 * @callgraph 584 * @callergraph 585 */ 586 void phase_spec2(sig_innerobj_t *sig_inObj) 587 { 588 picoos_int16 nI, iRand, firstUV; 589 picoos_int32 *tmp1, *tmp2; 590 picoos_int16 VOXBND_M1; 591 picoos_int32 *spect, *ang; 592 picoos_int16 voiced, m2; 593 picoos_int32 *co, *so, *c, *s, voxbnd, voxbnd2; 594 picoos_int16 i,j, k, n_comp; 595 picoos_int16 *Pvoxbnd; 596 picoos_int32 *phs_p2, *phs_p1, *phs_n1, *phs_n2; 597 picoos_int32 *phs; 598 599 /*Link local variables to sig data object*/ 600 spect = sig_inObj->wcep_pI; /* spect_p;*/ 601 /* current spect scale : times PICODSP_FIX_SCALE1 */ 602 ang = sig_inObj->ang_p; 603 voxbnd = (picoos_int32) (sig_inObj->voxbnd_p * sig_inObj->voicing); 604 voxbnd2 = sig_inObj->voxbnd2_p; 605 voiced = sig_inObj->voiced_p; 606 m2 = sig_inObj->m2_p; 607 VOXBND_M1 = voxbnd - 1; 608 firstUV = 1; 609 610 /*code starts here*/ 611 if (voiced == 1) { 612 firstUV = voxbnd; 613 Pvoxbnd = sig_inObj->VoxBndBuff; 614 n_comp = Pvoxbnd[2]; 615 phs_p2 = sig_inObj->PhsBuff[0]; 616 phs_p1 = sig_inObj->PhsBuff[1]; 617 phs = sig_inObj->PhsBuff[2]; 618 phs_n1 = sig_inObj->PhsBuff[3]; 619 phs_n2 = sig_inObj->PhsBuff[4]; 620 621 /* find and smooth components which have full context */ 622 j = n_comp; 623 for (i=0; i<5; i++) { 624 if (Pvoxbnd[i]<j) j = Pvoxbnd[i]; 625 } 626 for (i=0; i<j; i++) { 627 ang[i] = -(((phs_p2[i]+phs_p1[i]+phs[i]+phs_n1[i]+phs_n2[i])<<6) / 5); 628 } 629 630 /* find and smooth components which at least one component on each side */ 631 k = n_comp; 632 if (Pvoxbnd[2]<k) k = Pvoxbnd[2]; 633 if (Pvoxbnd[4]<k) k = Pvoxbnd[4]; 634 for (i=j; i<k; i++) { /* smooth using only two surrounding neighbours */ 635 ang[i] = -(((phs_p1[i]+phs[i]+phs_n1[i])<<6) / 3); 636 } 637 638 /* handle rest of components - at least one side does not exist */ 639 for (i=k; i<n_comp; i++) { 640 ang[i] = -(phs[i]<<6); /* - simple copy without smoothing */ 641 } 642 643 /*Phase unwrap - cumsum */ 644 tmp1 = &(ang[1]); 645 tmp2 = &(ang[0]); 646 /* current ang scale : PICODSP_M_PI = PICODSP_FIX_SCALE2 */ 647 FAST_DEVICE(VOXBND_M1,*(tmp1++)+=*(tmp2)-PICODSP_FIX_SCALE2;*(tmp2)=(*tmp2>=0)?(*tmp2)>>PICODSP_SHIFT_FACT4:-((-(*tmp2))>>PICODSP_SHIFT_FACT4);tmp2++); 648 *tmp2 = (*tmp2 >= 0) ? (*tmp2) >> PICODSP_SHIFT_FACT4 : -((-(*tmp2)) 649 >> PICODSP_SHIFT_FACT4); /*ang[voxbnd-1]/=2;*/ 650 } 651 652 /* now for the unvoiced part */ 653 iRand = sig_inObj->iRand; 654 c = sig_inObj->randCosTbl + iRand; 655 s = sig_inObj->randSinTbl + iRand; 656 co = sig_inObj->outCosTbl + firstUV; 657 so = sig_inObj->outSinTbl + firstUV; 658 for (nI = firstUV; nI < PICODSP_HFFTSIZE_P1 - 1; nI++) { 659 *co++ = *c++; 660 *so++ = *s++; 661 } 662 *co = 1; 663 *so = 0; 664 sig_inObj->iRand += (PICODSP_HFFTSIZE_P1 - firstUV); 665 if (sig_inObj->iRand > PICODSP_N_RAND_TABLE - PICODSP_HFFTSIZE_P1) 666 sig_inObj->iRand = 1 + sig_inObj->iRand + PICODSP_HFFTSIZE_P1 667 - PICODSP_N_RAND_TABLE; 668 }/*phase_spec2*/ 669 670 /** 671 * Prepare Envelope spectrum for inverse FFT 672 * @param sig_inObj : sig PU internal object of the sub-object 673 * @return void 674 * @remarks make phase bilateral -->> angh (FFT size, real) 675 * @remarks combine in complex input vector for IFFT F = e**(spet/2+j*ang) 676 * @remarks Compute energy -->> E (scalar, real) 677 * @callgraph 678 * @callergraph 679 * Input 680 * - spect (FFT size, real) 681 * - ang (half FFT size -1, real) 682 * - m2 fftsize 683 * - WNr,WNi (FFT size, real) the tabulated sine and cosine values 684 * - brev (FFT size, real) the tabulated bit reversal indexes 685 * Output 686 * - Fr, Fi (FFT size, complex) the envelope spectrum 687 * - E (scalar, real) the energy 688 */ 689 void env_spec(sig_innerobj_t *sig_inObj) 690 { 691 692 picoos_int16 nI; 693 picoos_int32 fcX, fsX, fExp, voxbnd; 694 picoos_int32 *spect, *ang, *ctbl; 695 picoos_int16 voiced, prev_voiced; 696 picoos_int32 *co, *so; 697 picoos_int32 *Fr, *Fi; 698 picoos_single mult; 699 700 /*Link local variables to sig object*/ 701 spect = sig_inObj->wcep_pI; /*spect_p*/ 702 /* current spect scale : times PICODSP_FIX_SCALE1 */ 703 ang = sig_inObj->ang_p; 704 /* current spect scale : PICODSP_M_PI = PICODSP_FIX_SCALE2 */ 705 Fr = sig_inObj->F2r_p; 706 Fi = sig_inObj->F2i_p; 707 voiced = sig_inObj->voiced_p; 708 prev_voiced = sig_inObj->prevVoiced_p; 709 voxbnd = (picoos_int32) (sig_inObj->voxbnd_p * sig_inObj->voicing); 710 ctbl = sig_inObj->cos_table; 711 /* ctbl scale : times 4096 */ 712 mult = PICODSP_ENVSPEC_K1 / PICODSP_FIX_SCALE1; 713 714 /*remove dc from real part*/ 715 if (sig_inObj->F0_p > 120) { 716 spect[0] = spect[1] = 0; 717 spect[2] /= PICODSP_ENVSPEC_K2; 718 } else { 719 spect[0] = 0; 720 } 721 722 /* if using rand table, use sin and cos tables as well */ 723 if (voiced || (prev_voiced)) { 724 /*Envelope becomes a complex exponential : F=exp(.5*spect + j*angh);*/ 725 for (nI = 0; nI < voxbnd; nI++) { 726 get_trig(ang[nI], ctbl, &fcX, &fsX); 727 fExp = (picoos_int32) EXP((double)spect[nI]*mult); 728 Fr[nI] = fExp * fcX; 729 Fi[nI] = fExp * fsX; 730 } 731 /* ao=sig_inObj->ang_p+(picoos_int32)voxbnd; */ 732 co = sig_inObj->outCosTbl + voxbnd; 733 so = sig_inObj->outSinTbl + voxbnd; 734 735 for (nI = voxbnd; nI < PICODSP_HFFTSIZE_P1; nI++) { 736 fcX = *co++; 737 fsX = *so++; 738 fExp = (picoos_int32) EXP((double)spect[nI]*mult); 739 Fr[nI] = fExp * fcX; 740 Fi[nI] = fExp * fsX; 741 } 742 } else { 743 /*ao=sig_inObj->ang_p+1;*/ 744 co = sig_inObj->outCosTbl + 1; 745 so = sig_inObj->outSinTbl + 1; 746 for (nI = 1; nI < PICODSP_HFFTSIZE_P1; nI++) { 747 fcX = *co++; 748 fsX = *so++; 749 fExp = (picoos_int32) EXP((double)spect[nI]*mult); 750 751 Fr[nI] = fExp * fcX; 752 Fi[nI] = fExp * fsX; 753 } 754 } 755 756 }/*env_spec*/ 757 758 /** 759 * Calculates the impulse response of the comlpex spectrum through inverse rFFT 760 * @param sig_inObj : sig PU internal object of the sub-object 761 * @return void 762 * @remarks Imp corresponds with the real part of the FFT 763 * @callgraph 764 * @callergraph 765 * Input 766 * - Fr, Fi (FFT size, real & imaginary) the complex envelope spectrum (only first half of spectrum) 767 * Output 768 * - Imp: impulse response (length: m2) 769 * - E (scalar, real) RMS value 770 */ 771 void impulse_response(sig_innerobj_t *sig_inObj) 772 { 773 /*Define local variables*/ 774 picoos_single f; 775 picoos_int16 nI, nn, m2, m4, voiced; 776 picoos_single *E; 777 picoos_int32 *norm_window; /* - fixed point */ 778 picoos_int32 *fr, *Fr, *Fi, *t1, ff; /* - fixed point */ 779 780 /*Link local variables with sig object*/ 781 m2 = sig_inObj->m2_p; 782 m4 = m2 >> 1; 783 Fr = sig_inObj->F2r_p; 784 Fi = sig_inObj->F2i_p; 785 norm_window = sig_inObj->norm_window_p; 786 E = &(sig_inObj->E_p); /*as pointer: value will be modified*/ 787 voiced = sig_inObj->voiced_p; 788 fr = sig_inObj->imp_p; 789 790 /*Inverse FFT*/ 791 for (nI = 0, nn = 0; nI < m4; nI++, nn += 2) { 792 fr[nn] = Fr[nI]; /* - fixed point */ 793 } 794 795 fr[1] = (picoos_int32) (Fr[m4]); 796 for (nI = 1, nn = 3; nI < m4; nI++, nn += 2) { 797 fr[nn] = -Fi[nI]; /* - fixed point */ 798 } 799 800 rdft(m2, -1, fr); 801 /*window, normalize and differentiate*/ 802 *E = norm_result(m2, fr, norm_window); 803 804 if (*E > 0) { 805 f = *E * PICODSP_FIXRESP_NORM; 806 } else { 807 f = 20; /*PICODSP_FIXRESP_NORM*/ 808 } 809 ff = (picoos_int32) f; 810 if (ff < 1) 811 ff = 1; 812 /*normalize impulse response*/ 813 t1 = fr;FAST_DEVICE(PICODSP_FFTSIZE,*(t1++) /= ff;); /* - fixed point */ 814 815 } /* impulse_response */ 816 817 /** 818 * time domain pitch synchronous overlap add over two frames (when no voicing transition) 819 * @param sig_inObj : sig PU internal object of the sub-object 820 * @return void 821 * @remarks Special treatment at voicing boundaries 822 * @remarks Introduced to get rid of time-domain aliasing (and additional speed up) 823 * @callgraph 824 * @callergraph 825 */ 826 void td_psola2(sig_innerobj_t *sig_inObj) 827 { 828 picoos_int16 nI; 829 picoos_int16 hop, m2, *nextPeak, voiced; 830 picoos_int32 *t1, *t2; 831 picoos_int16 cnt; 832 picoos_int32 *fr, *v1, ff, f; 833 picoos_int16 a, i; 834 picoos_int32 *window; 835 picoos_int16 s = (picoos_int16) 1; 836 window = sig_inObj->window_p; 837 838 /*Link local variables with sig object*/ 839 hop = sig_inObj->hop_p; 840 m2 = sig_inObj->m2_p; 841 nextPeak = &(sig_inObj->nextPeak_p); 842 voiced = sig_inObj->voiced_p; 843 fr = sig_inObj->imp_p; 844 /*toggle the pointers and initialize signal vector */ 845 v1 = sig_inObj->sig_vec1; 846 847 t1 = v1; 848 FAST_DEVICE(PICODSP_FFTSIZE-PICODSP_DISPLACE,*(t1++)=0;); 849 t1 = &(v1[PICODSP_FFTSIZE - PICODSP_DISPLACE]); 850 t2 = &(v1[PICODSP_FFTSIZE]); 851 FAST_DEVICE(PICODSP_FFTSIZE, *(t1++)=*(t2++);); 852 t1 = &(v1[2 * PICODSP_FFTSIZE - PICODSP_DISPLACE]);FAST_DEVICE(PICODSP_DISPLACE,*(t1++)=0;); 853 /*calculate excitation points*/ 854 get_simple_excitation(sig_inObj, nextPeak); 855 856 /*TD-PSOLA based on excitation vector */ 857 if ((sig_inObj->nU == 0) && (sig_inObj->voiced_p == 1)) { 858 /* purely voiced */ 859 for (nI = 0; nI < sig_inObj->nV; nI++) { 860 f = sig_inObj->EnV[nI]; 861 a = 0; 862 cnt = PICODSP_FFTSIZE; 863 ff = (f * window[sig_inObj->LocV[nI]]) >> PICODSP_SHIFT_FACT1; 864 t1 = &(v1[a + sig_inObj->LocV[nI]]); 865 t2 = &(fr[a]); 866 if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff;); 867 } 868 } else if ((sig_inObj->nV == 0) && (sig_inObj->voiced_p == 0)) { 869 /* PURELY UNVOICED*/ 870 for (nI = 0; nI < sig_inObj->nU; nI++) { 871 f = sig_inObj->EnU[nI]; 872 s = -s; /*reverse order to reduce the periodicity effect*/ 873 if (s == 1) { 874 a = 0; 875 cnt = PICODSP_FFTSIZE; 876 ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1; 877 t1 = &(v1[a + sig_inObj->LocU[nI]]); 878 t2 = &(fr[a]); 879 if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff; ); 880 } else { /*s==-1*/ 881 a = 0; 882 cnt = PICODSP_FFTSIZE; 883 ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1; 884 t1 = &(v1[(m2 - 1 - a) + sig_inObj->LocU[nI]]); 885 t2 = &(fr[a]); 886 if (cnt > 0)FAST_DEVICE(cnt,*(t1--)+=*(t2++)*ff; ); 887 } 888 } 889 } else if (sig_inObj->VoicTrans == 0) { 890 /*voicing transition from unvoiced to voiced*/ 891 for (nI = 0; nI < sig_inObj->nV; nI++) { 892 f = sig_inObj->EnV[nI]; 893 a = 0; 894 cnt = PICODSP_FFTSIZE; 895 ff = (f * window[sig_inObj->LocV[nI]]) >> PICODSP_SHIFT_FACT1; 896 t1 = &(v1[a + sig_inObj->LocV[nI]]); 897 t2 = &(fr[a]); 898 if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff;); 899 } 900 /*add remaining stuff from unvoiced part*/ 901 for (nI = 0; nI < sig_inObj->nU; nI++) { 902 f = sig_inObj->EnU[nI]; 903 s = -s; /*reverse order to reduce the periodicity effect*/ 904 if (s == 1) { 905 a = 0; 906 cnt = PICODSP_FFTSIZE; 907 ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1; 908 t1 = &(v1[a + sig_inObj->LocU[nI]]); 909 t2 = &(sig_inObj->ImpResp_p[a]); /*saved impulse response*/ 910 if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff; ); 911 } else { 912 a = 0; 913 cnt = PICODSP_FFTSIZE; 914 ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1; 915 t1 = &(v1[(m2 - 1 - a) + sig_inObj->LocU[nI]]); 916 t2 = &(sig_inObj->ImpResp_p[a]); 917 if (cnt > 0)FAST_DEVICE(cnt,*(t1--)+=*(t2++)*ff; ); 918 } 919 } 920 } else { 921 /*voiced to unvoiced*/ 922 for (nI = 0; nI < sig_inObj->nU; nI++) { 923 f = sig_inObj->EnU[nI]; 924 s = -s; /*reverse order to reduce the periodicity effect*/ 925 if (s > 0) { 926 a = 0; 927 cnt = PICODSP_FFTSIZE; 928 ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1; 929 t1 = &(v1[a + sig_inObj->LocU[nI]]); 930 t2 = &(fr[a]); 931 if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff; ); 932 } else { 933 a = 0; 934 cnt = PICODSP_FFTSIZE; 935 ff = (f * window[sig_inObj->LocU[nI]]) >> PICODSP_SHIFT_FACT1; 936 t1 = &(v1[(m2 - 1 - a) + sig_inObj->LocU[nI]]); 937 t2 = &(fr[a]); 938 if (cnt > 0)FAST_DEVICE(cnt,*(t1--)+=*(t2++)*ff; ); 939 } 940 } 941 /*add remaining stuff from voiced part*/ 942 for (nI = 0; nI < sig_inObj->nV; nI++) { 943 f = sig_inObj->EnV[nI]; 944 a = 0; 945 cnt = PICODSP_FFTSIZE; 946 ff = (f * window[sig_inObj->LocV[nI]]) >> PICODSP_SHIFT_FACT1; 947 t1 = &(v1[a + sig_inObj->LocV[nI]]); 948 t2 = &(sig_inObj->ImpResp_p[a]); 949 if (cnt > 0)FAST_DEVICE(cnt,*(t1++)+=*(t2++)*ff;); 950 } 951 } 952 953 t1 = sig_inObj->sig_vec1; 954 for (i = 0; i < PICODSP_FFTSIZE; i++, t1++) { 955 if (*t1 >= 0) 956 *t1 >>= PICODSP_SHIFT_FACT5; 957 else 958 *t1 = -((-*t1) >> PICODSP_SHIFT_FACT5); 959 } 960 961 }/*td_psola2*/ 962 963 /** 964 * overlap + add summing of impulse responses on the final destination sample buffer 965 * @param sig_inObj : sig PU internal object of the sub-object 966 * @return void 967 * @remarks Special treatment at voicing boundaries 968 * @remarks Introduced to get rid of time-domain aliasing (and additional speed up) 969 * Input 970 * - wlet : the generic impulse response (FFT size, real) 971 * - window : the windowing funcion (FFT size, real) fixed 972 * - WavBuff : the destination buffer with past samples (FFT size*2, short) 973 * - m2 : fftsize 974 * Output 975 * - WavBuff : the destination buffer with updated samples (FFT size*2, short) 976 * @callgraph 977 * @callergraph 978 */ 979 void overlap_add(sig_innerobj_t *sig_inObj) 980 { 981 /*Local variables*/ 982 picoos_int32 *w, *v; 983 984 /*Link local variables with sig object*/ 985 w = sig_inObj->WavBuff_p; 986 v = sig_inObj->sig_vec1; 987 988 FAST_DEVICE(PICODSP_FFTSIZE, *(w++)+=*(v++)<<PICODSP_SHIFT_FACT6;); 989 990 }/*overlap_add*/ 991 992 /*------------------------------------------------------------------------------- 993 INITIALIZATION AND INTERNAL FUNCTIONS 994 --------------------------------------------------------------------------------*/ 995 /** 996 * Hanning window initialization 997 * @param sig_inObj : sig PU internal object of the sub-object 998 * @return PICO_OK 999 * @callgraph 1000 * @callergraph 1001 */ 1002 static void gen_hann2(sig_innerobj_t *sig_inObj) 1003 { 1004 picoos_int32 *hann; 1005 picoos_int32 *norm; 1006 /*link local variables with sig object*/ 1007 hann = sig_inObj->window_p; 1008 norm = sig_inObj->norm_window_p; 1009 1010 norm[0] = 80224; 1011 norm[1] = 320832; 1012 norm[2] = 721696; 1013 norm[3] = 1282560; 1014 norm[4] = 2003104; 1015 norm[5] = 2882880; 1016 norm[6] = 3921376; 1017 norm[7] = 5117984; 1018 norm[8] = 6471952; 1019 norm[9] = 7982496; 1020 norm[10] = 9648720; 1021 norm[11] = 11469616; 1022 norm[12] = 13444080; 1023 norm[13] = 15570960; 1024 norm[14] = 17848976; 1025 norm[15] = 20276752; 1026 norm[16] = 22852864; 1027 norm[17] = 25575744; 1028 norm[18] = 28443776; 1029 norm[19] = 31455264; 1030 norm[20] = 34608368; 1031 norm[21] = 37901248; 1032 norm[22] = 41331904; 1033 norm[23] = 44898304; 1034 norm[24] = 48598304; 1035 norm[25] = 52429696; 1036 norm[26] = 56390192; 1037 norm[27] = 60477408; 1038 norm[28] = 64688944; 1039 norm[29] = 69022240; 1040 norm[30] = 73474720; 1041 norm[31] = 78043744; 1042 norm[32] = 82726544; 1043 norm[33] = 87520352; 1044 norm[34] = 92422272; 1045 norm[35] = 97429408; 1046 norm[36] = 102538752; 1047 norm[37] = 107747248; 1048 norm[38] = 113051776; 1049 norm[39] = 118449184; 1050 norm[40] = 123936224; 1051 norm[41] = 129509648; 1052 norm[42] = 135166080; 1053 norm[43] = 140902192; 1054 norm[44] = 146714528; 1055 norm[45] = 152599584; 1056 norm[46] = 158553904; 1057 norm[47] = 164573888; 1058 norm[48] = 170655936; 1059 norm[49] = 176796448; 1060 norm[50] = 182991712; 1061 norm[51] = 189238064; 1062 norm[52] = 195531744; 1063 norm[53] = 201868992; 1064 norm[54] = 208246016; 1065 norm[55] = 214659040; 1066 norm[56] = 221104176; 1067 norm[57] = 227577616; 1068 norm[58] = 234075488; 1069 norm[59] = 240593872; 1070 norm[60] = 247128912; 1071 norm[61] = 253676688; 1072 norm[62] = 260233280; 1073 norm[63] = 266794768; 1074 norm[64] = 273357248; 1075 norm[65] = 279916768; 1076 norm[66] = 286469440; 1077 norm[67] = 293011360; 1078 norm[68] = 299538560; 1079 norm[69] = 306047168; 1080 norm[70] = 312533312; 1081 norm[71] = 318993088; 1082 norm[72] = 325422656; 1083 norm[73] = 331818144; 1084 norm[74] = 338175744; 1085 norm[75] = 344491680; 1086 norm[76] = 350762176; 1087 norm[77] = 356983424; 1088 norm[78] = 363151808; 1089 norm[79] = 369263520; 1090 norm[80] = 375315008; 1091 norm[81] = 381302592; 1092 norm[82] = 387222720; 1093 norm[83] = 393071872; 1094 norm[84] = 398846528; 1095 norm[85] = 404543232; 1096 norm[86] = 410158560; 1097 norm[87] = 415689216; 1098 norm[88] = 421131840; 1099 norm[89] = 426483200; 1100 norm[90] = 431740096; 1101 norm[91] = 436899392; 1102 norm[92] = 441958016; 1103 norm[93] = 446912928; 1104 norm[94] = 451761152; 1105 norm[95] = 456499840; 1106 norm[96] = 461126080; 1107 norm[97] = 465637152; 1108 norm[98] = 470030400; 1109 norm[99] = 474303104; 1110 norm[100] = 478452800; 1111 norm[101] = 482476960; 1112 norm[102] = 486373184; 1113 norm[103] = 490139200; 1114 norm[104] = 493772640; 1115 norm[105] = 497271424; 1116 norm[106] = 500633440; 1117 norm[107] = 503856704; 1118 norm[108] = 506939200; 1119 norm[109] = 509879168; 1120 norm[110] = 512674880; 1121 norm[111] = 515324544; 1122 norm[112] = 517826688; 1123 norm[113] = 520179776; 1124 norm[114] = 522382368; 1125 norm[115] = 524433184; 1126 norm[116] = 526331008; 1127 norm[117] = 528074688; 1128 norm[118] = 529663200; 1129 norm[119] = 531095552; 1130 norm[120] = 532370944; 1131 norm[121] = 533488576; 1132 norm[122] = 534447808; 1133 norm[123] = 535248000; 1134 norm[124] = 535888768; 1135 norm[125] = 536369664; 1136 norm[126] = 536690432; 1137 norm[127] = 536850880; 1138 norm[128] = 536850880; 1139 norm[129] = 536690432; 1140 norm[130] = 536369664; 1141 norm[131] = 535888768; 1142 norm[132] = 535248000; 1143 norm[133] = 534447808; 1144 norm[134] = 533488576; 1145 norm[135] = 532370944; 1146 norm[136] = 531095552; 1147 norm[137] = 529663200; 1148 norm[138] = 528074688; 1149 norm[139] = 526331008; 1150 norm[140] = 524433216; 1151 norm[141] = 522382368; 1152 norm[142] = 520179776; 1153 norm[143] = 517826688; 1154 norm[144] = 515324544; 1155 norm[145] = 512674880; 1156 norm[146] = 509879168; 1157 norm[147] = 506939200; 1158 norm[148] = 503856704; 1159 norm[149] = 500633472; 1160 norm[150] = 497271424; 1161 norm[151] = 493772672; 1162 norm[152] = 490139200; 1163 norm[153] = 486373184; 1164 norm[154] = 482476992; 1165 norm[155] = 478452800; 1166 norm[156] = 474303104; 1167 norm[157] = 470030400; 1168 norm[158] = 465637184; 1169 norm[159] = 461126080; 1170 norm[160] = 456499840; 1171 norm[161] = 451761152; 1172 norm[162] = 446912960; 1173 norm[163] = 441958016; 1174 norm[164] = 436899424; 1175 norm[165] = 431740096; 1176 norm[166] = 426483200; 1177 norm[167] = 421131840; 1178 norm[168] = 415689216; 1179 norm[169] = 410158560; 1180 norm[170] = 404543232; 1181 norm[171] = 398846528; 1182 norm[172] = 393071872; 1183 norm[173] = 387222720; 1184 norm[174] = 381302592; 1185 norm[175] = 375315008; 1186 norm[176] = 369263552; 1187 norm[177] = 363151808; 1188 norm[178] = 356983456; 1189 norm[179] = 350762176; 1190 norm[180] = 344491712; 1191 norm[181] = 338175776; 1192 norm[182] = 331818144; 1193 norm[183] = 325422656; 1194 norm[184] = 318993088; 1195 norm[185] = 312533312; 1196 norm[186] = 306047168; 1197 norm[187] = 299538560; 1198 norm[188] = 293011360; 1199 norm[189] = 286469472; 1200 norm[190] = 279916800; 1201 norm[191] = 273357248; 1202 norm[192] = 266794784; 1203 norm[193] = 260233280; 1204 norm[194] = 253676688; 1205 norm[195] = 247128928; 1206 norm[196] = 240593888; 1207 norm[197] = 234075488; 1208 norm[198] = 227577632; 1209 norm[199] = 221104192; 1210 norm[200] = 214659040; 1211 norm[201] = 208246032; 1212 norm[202] = 201868992; 1213 norm[203] = 195531744; 1214 norm[204] = 189238080; 1215 norm[205] = 182991728; 1216 norm[206] = 176796448; 1217 norm[207] = 170655952; 1218 norm[208] = 164573888; 1219 norm[209] = 158553920; 1220 norm[210] = 152599600; 1221 norm[211] = 146714528; 1222 norm[212] = 140902208; 1223 norm[213] = 135166096; 1224 norm[214] = 129509648; 1225 norm[215] = 123936240; 1226 norm[216] = 118449184; 1227 norm[217] = 113051776; 1228 norm[218] = 107747248; 1229 norm[219] = 102538752; 1230 norm[220] = 97429424; 1231 norm[221] = 92422288; 1232 norm[222] = 87520352; 1233 norm[223] = 82726544; 1234 norm[224] = 78043744; 1235 norm[225] = 73474736; 1236 norm[226] = 69022240; 1237 norm[227] = 64688944; 1238 norm[228] = 60477424; 1239 norm[229] = 56390192; 1240 norm[230] = 52429696; 1241 norm[231] = 48598304; 1242 norm[232] = 44898304; 1243 norm[233] = 41331904; 1244 norm[234] = 37901248; 1245 norm[235] = 34608384; 1246 norm[236] = 31455264; 1247 norm[237] = 28443792; 1248 norm[238] = 25575744; 1249 norm[239] = 22852864; 1250 norm[240] = 20276752; 1251 norm[241] = 17848976; 1252 norm[242] = 15570960; 1253 norm[243] = 13444080; 1254 norm[244] = 11469616; 1255 norm[245] = 9648720; 1256 norm[246] = 7982512; 1257 norm[247] = 6471952; 1258 norm[248] = 5117984; 1259 norm[249] = 3921376; 1260 norm[250] = 2882880; 1261 norm[251] = 2003104; 1262 norm[252] = 1282560; 1263 norm[253] = 721696; 1264 norm[254] = 320832; 1265 norm[255] = 80224; 1266 hann[0] = 0; 1267 hann[1] = 0; 1268 hann[2] = 1; 1269 hann[3] = 2; 1270 hann[4] = 3; 1271 hann[5] = 5; 1272 hann[6] = 7; 1273 hann[7] = 9; 1274 hann[8] = 12; 1275 hann[9] = 15; 1276 hann[10] = 18; 1277 hann[11] = 21; 1278 hann[12] = 25; 1279 hann[13] = 29; 1280 hann[14] = 34; 1281 hann[15] = 38; 1282 hann[16] = 43; 1283 hann[17] = 48; 1284 hann[18] = 54; 1285 hann[19] = 59; 1286 hann[20] = 66; 1287 hann[21] = 72; 1288 hann[22] = 78; 1289 hann[23] = 85; 1290 hann[24] = 92; 1291 hann[25] = 100; 1292 hann[26] = 107; 1293 hann[27] = 115; 1294 hann[28] = 123; 1295 hann[29] = 131; 1296 hann[30] = 140; 1297 hann[31] = 148; 1298 hann[32] = 157; 1299 hann[33] = 166; 1300 hann[34] = 176; 1301 hann[35] = 185; 1302 hann[36] = 195; 1303 hann[37] = 205; 1304 hann[38] = 215; 1305 hann[39] = 225; 1306 hann[40] = 236; 1307 hann[41] = 247; 1308 hann[42] = 257; 1309 hann[43] = 268; 1310 hann[44] = 279; 1311 hann[45] = 291; 1312 hann[46] = 302; 1313 hann[47] = 313; 1314 hann[48] = 325; 1315 hann[49] = 337; 1316 hann[50] = 349; 1317 hann[51] = 360; 1318 hann[52] = 372; 1319 hann[53] = 385; 1320 hann[54] = 397; 1321 hann[55] = 409; 1322 hann[56] = 421; 1323 hann[57] = 434; 1324 hann[58] = 446; 1325 hann[59] = 458; 1326 hann[60] = 471; 1327 hann[61] = 483; 1328 hann[62] = 496; 1329 hann[63] = 508; 1330 hann[64] = 521; 1331 hann[65] = 533; 1332 hann[66] = 546; 1333 hann[67] = 558; 1334 hann[68] = 571; 1335 hann[69] = 583; 1336 hann[70] = 596; 1337 hann[71] = 608; 1338 hann[72] = 620; 1339 hann[73] = 632; 1340 hann[74] = 645; 1341 hann[75] = 657; 1342 hann[76] = 669; 1343 hann[77] = 680; 1344 hann[78] = 692; 1345 hann[79] = 704; 1346 hann[80] = 715; 1347 hann[81] = 727; 1348 hann[82] = 738; 1349 hann[83] = 749; 1350 hann[84] = 760; 1351 hann[85] = 771; 1352 hann[86] = 782; 1353 hann[87] = 792; 1354 hann[88] = 803; 1355 hann[89] = 813; 1356 hann[90] = 823; 1357 hann[91] = 833; 1358 hann[92] = 842; 1359 hann[93] = 852; 1360 hann[94] = 861; 1361 hann[95] = 870; 1362 hann[96] = 879; 1363 hann[97] = 888; 1364 hann[98] = 896; 1365 hann[99] = 904; 1366 hann[100] = 912; 1367 hann[101] = 920; 1368 hann[102] = 927; 1369 hann[103] = 934; 1370 hann[104] = 941; 1371 hann[105] = 948; 1372 hann[106] = 954; 1373 hann[107] = 961; 1374 hann[108] = 966; 1375 hann[109] = 972; 1376 hann[110] = 977; 1377 hann[111] = 982; 1378 hann[112] = 987; 1379 hann[113] = 992; 1380 hann[114] = 996; 1381 hann[115] = 1000; 1382 hann[116] = 1003; 1383 hann[117] = 1007; 1384 hann[118] = 1010; 1385 hann[119] = 1012; 1386 hann[120] = 1015; 1387 hann[121] = 1017; 1388 hann[122] = 1019; 1389 hann[123] = 1020; 1390 hann[124] = 1022; 1391 hann[125] = 1023; 1392 hann[126] = 1023; 1393 hann[127] = 1023; 1394 hann[128] = 1023; 1395 hann[129] = 1023; 1396 hann[130] = 1023; 1397 hann[131] = 1022; 1398 hann[132] = 1020; 1399 hann[133] = 1019; 1400 hann[134] = 1017; 1401 hann[135] = 1015; 1402 hann[136] = 1012; 1403 hann[137] = 1010; 1404 hann[138] = 1007; 1405 hann[139] = 1003; 1406 hann[140] = 1000; 1407 hann[141] = 996; 1408 hann[142] = 992; 1409 hann[143] = 987; 1410 hann[144] = 982; 1411 hann[145] = 977; 1412 hann[146] = 972; 1413 hann[147] = 966; 1414 hann[148] = 961; 1415 hann[149] = 954; 1416 hann[150] = 948; 1417 hann[151] = 941; 1418 hann[152] = 934; 1419 hann[153] = 927; 1420 hann[154] = 920; 1421 hann[155] = 912; 1422 hann[156] = 904; 1423 hann[157] = 896; 1424 hann[158] = 888; 1425 hann[159] = 879; 1426 hann[160] = 870; 1427 hann[161] = 861; 1428 hann[162] = 852; 1429 hann[163] = 842; 1430 hann[164] = 833; 1431 hann[165] = 823; 1432 hann[166] = 813; 1433 hann[167] = 803; 1434 hann[168] = 792; 1435 hann[169] = 782; 1436 hann[170] = 771; 1437 hann[171] = 760; 1438 hann[172] = 749; 1439 hann[173] = 738; 1440 hann[174] = 727; 1441 hann[175] = 715; 1442 hann[176] = 704; 1443 hann[177] = 692; 1444 hann[178] = 680; 1445 hann[179] = 669; 1446 hann[180] = 657; 1447 hann[181] = 645; 1448 hann[182] = 632; 1449 hann[183] = 620; 1450 hann[184] = 608; 1451 hann[185] = 596; 1452 hann[186] = 583; 1453 hann[187] = 571; 1454 hann[188] = 558; 1455 hann[189] = 546; 1456 hann[190] = 533; 1457 hann[191] = 521; 1458 hann[192] = 508; 1459 hann[193] = 496; 1460 hann[194] = 483; 1461 hann[195] = 471; 1462 hann[196] = 458; 1463 hann[197] = 446; 1464 hann[198] = 434; 1465 hann[199] = 421; 1466 hann[200] = 409; 1467 hann[201] = 397; 1468 hann[202] = 385; 1469 hann[203] = 372; 1470 hann[204] = 360; 1471 hann[205] = 349; 1472 hann[206] = 337; 1473 hann[207] = 325; 1474 hann[208] = 313; 1475 hann[209] = 302; 1476 hann[210] = 291; 1477 hann[211] = 279; 1478 hann[212] = 268; 1479 hann[213] = 257; 1480 hann[214] = 247; 1481 hann[215] = 236; 1482 hann[216] = 225; 1483 hann[217] = 215; 1484 hann[218] = 205; 1485 hann[219] = 195; 1486 hann[220] = 185; 1487 hann[221] = 176; 1488 hann[222] = 166; 1489 hann[223] = 157; 1490 hann[224] = 148; 1491 hann[225] = 140; 1492 hann[226] = 131; 1493 hann[227] = 123; 1494 hann[228] = 115; 1495 hann[229] = 107; 1496 hann[230] = 100; 1497 hann[231] = 92; 1498 hann[232] = 85; 1499 hann[233] = 78; 1500 hann[234] = 72; 1501 hann[235] = 66; 1502 hann[236] = 59; 1503 hann[237] = 54; 1504 hann[238] = 48; 1505 hann[239] = 43; 1506 hann[240] = 38; 1507 hann[241] = 34; 1508 hann[242] = 29; 1509 hann[243] = 25; 1510 hann[244] = 21; 1511 hann[245] = 18; 1512 hann[246] = 15; 1513 hann[247] = 12; 1514 hann[248] = 9; 1515 hann[249] = 7; 1516 hann[250] = 5; 1517 hann[251] = 3; 1518 hann[252] = 2; 1519 hann[253] = 1; 1520 hann[254] = 0; 1521 hann[255] = 0; 1522 1523 } /* gen_hann2 */ 1524 1525 /** 1526 * Creates the non uniform enhancement window (bilinearly mapped hannning window) 1527 * in order to reduce the formant enhancement in the high spectrum 1528 * @param mm : memory manager 1529 * @param sig_inObj : sig PU internal object of the sub-object 1530 * @return void 1531 * @callgraph 1532 * @callergraph 1533 * @remarks the outgput is based on the matlab script below\n 1534 matlab script 1535 ------------- 1536 function makeEnhWind(alpha) 1537 N=129; % =HFFTSIZEE_P1 1538 s=(bilinmap(alpha,N)); 1539 h=[hann(N)']; 1540 x=(1:N)/N; 1541 W=interp1(x,h,s); W(1)=0; 1542 1543 fid=fopen('enhwind.txt','wt'); 1544 fprintf(fid,'picoos_int16 enh_wind_init(sig_innerobj_t *sig_inObj) {\n'); 1545 for i=1:N, 1546 fprintf(fid,[' sig_inObj->enhwind[' int2str(i) '] = (picoos_single)' num2str(W(i),'%0.7g') ';\n']); 1547 end; 1548 fprintf(fid,' return PICO_OK;\n'); 1549 fprintf(fid,' }; \n'); 1550 fclose(fid); 1551 %figure(1); plot(x*8,W); 1552 */ 1553 static void enh_wind_init(sig_innerobj_t *sig_inObj) 1554 { 1555 /* picoos_int16 i; */ 1556 picoos_int32 *c; 1557 1558 c = sig_inObj->cos_table; 1559 1560 c[0] = 4096; 1561 c[1] = 4095; 1562 c[2] = 4095; 1563 c[3] = 4095; 1564 c[4] = 4095; 1565 c[5] = 4095; 1566 c[6] = 4095; 1567 c[7] = 4095; 1568 c[8] = 4094; 1569 c[9] = 4094; 1570 c[10] = 4094; 1571 c[11] = 4093; 1572 c[12] = 4093; 1573 c[13] = 4092; 1574 c[14] = 4092; 1575 c[15] = 4091; 1576 c[16] = 4091; 1577 c[17] = 4090; 1578 c[18] = 4089; 1579 c[19] = 4089; 1580 c[20] = 4088; 1581 c[21] = 4087; 1582 c[22] = 4086; 1583 c[23] = 4085; 1584 c[24] = 4084; 1585 c[25] = 4083; 1586 c[26] = 4082; 1587 c[27] = 4081; 1588 c[28] = 4080; 1589 c[29] = 4079; 1590 c[30] = 4078; 1591 c[31] = 4077; 1592 c[32] = 4076; 1593 c[33] = 4075; 1594 c[34] = 4073; 1595 c[35] = 4072; 1596 c[36] = 4071; 1597 c[37] = 4069; 1598 c[38] = 4068; 1599 c[39] = 4066; 1600 c[40] = 4065; 1601 c[41] = 4063; 1602 c[42] = 4062; 1603 c[43] = 4060; 1604 c[44] = 4058; 1605 c[45] = 4057; 1606 c[46] = 4055; 1607 c[47] = 4053; 1608 c[48] = 4051; 1609 c[49] = 4049; 1610 c[50] = 4047; 1611 c[51] = 4045; 1612 c[52] = 4043; 1613 c[53] = 4041; 1614 c[54] = 4039; 1615 c[55] = 4037; 1616 c[56] = 4035; 1617 c[57] = 4033; 1618 c[58] = 4031; 1619 c[59] = 4029; 1620 c[60] = 4026; 1621 c[61] = 4024; 1622 c[62] = 4022; 1623 c[63] = 4019; 1624 c[64] = 4017; 1625 c[65] = 4014; 1626 c[66] = 4012; 1627 c[67] = 4009; 1628 c[68] = 4007; 1629 c[69] = 4004; 1630 c[70] = 4001; 1631 c[71] = 3999; 1632 c[72] = 3996; 1633 c[73] = 3993; 1634 c[74] = 3990; 1635 c[75] = 3988; 1636 c[76] = 3985; 1637 c[77] = 3982; 1638 c[78] = 3979; 1639 c[79] = 3976; 1640 c[80] = 3973; 1641 c[81] = 3970; 1642 c[82] = 3967; 1643 c[83] = 3963; 1644 c[84] = 3960; 1645 c[85] = 3957; 1646 c[86] = 3954; 1647 c[87] = 3950; 1648 c[88] = 3947; 1649 c[89] = 3944; 1650 c[90] = 3940; 1651 c[91] = 3937; 1652 c[92] = 3933; 1653 c[93] = 3930; 1654 c[94] = 3926; 1655 c[95] = 3923; 1656 c[96] = 3919; 1657 c[97] = 3915; 1658 c[98] = 3912; 1659 c[99] = 3908; 1660 c[100] = 3904; 1661 c[101] = 3900; 1662 c[102] = 3897; 1663 c[103] = 3893; 1664 c[104] = 3889; 1665 c[105] = 3885; 1666 c[106] = 3881; 1667 c[107] = 3877; 1668 c[108] = 3873; 1669 c[109] = 3869; 1670 c[110] = 3864; 1671 c[111] = 3860; 1672 c[112] = 3856; 1673 c[113] = 3852; 1674 c[114] = 3848; 1675 c[115] = 3843; 1676 c[116] = 3839; 1677 c[117] = 3834; 1678 c[118] = 3830; 1679 c[119] = 3826; 1680 c[120] = 3821; 1681 c[121] = 3816; 1682 c[122] = 3812; 1683 c[123] = 3807; 1684 c[124] = 3803; 1685 c[125] = 3798; 1686 c[126] = 3793; 1687 c[127] = 3789; 1688 c[128] = 3784; 1689 c[129] = 3779; 1690 c[130] = 3774; 1691 c[131] = 3769; 1692 c[132] = 3764; 1693 c[133] = 3759; 1694 c[134] = 3754; 1695 c[135] = 3749; 1696 c[136] = 3744; 1697 c[137] = 3739; 1698 c[138] = 3734; 1699 c[139] = 3729; 1700 c[140] = 3723; 1701 c[141] = 3718; 1702 c[142] = 3713; 1703 c[143] = 3708; 1704 c[144] = 3702; 1705 c[145] = 3697; 1706 c[146] = 3691; 1707 c[147] = 3686; 1708 c[148] = 3680; 1709 c[149] = 3675; 1710 c[150] = 3669; 1711 c[151] = 3664; 1712 c[152] = 3658; 1713 c[153] = 3652; 1714 c[154] = 3647; 1715 c[155] = 3641; 1716 c[156] = 3635; 1717 c[157] = 3629; 1718 c[158] = 3624; 1719 c[159] = 3618; 1720 c[160] = 3612; 1721 c[161] = 3606; 1722 c[162] = 3600; 1723 c[163] = 3594; 1724 c[164] = 3588; 1725 c[165] = 3582; 1726 c[166] = 3576; 1727 c[167] = 3570; 1728 c[168] = 3563; 1729 c[169] = 3557; 1730 c[170] = 3551; 1731 c[171] = 3545; 1732 c[172] = 3538; 1733 c[173] = 3532; 1734 c[174] = 3526; 1735 c[175] = 3519; 1736 c[176] = 3513; 1737 c[177] = 3506; 1738 c[178] = 3500; 1739 c[179] = 3493; 1740 c[180] = 3487; 1741 c[181] = 3480; 1742 c[182] = 3473; 1743 c[183] = 3467; 1744 c[184] = 3460; 1745 c[185] = 3453; 1746 c[186] = 3447; 1747 c[187] = 3440; 1748 c[188] = 3433; 1749 c[189] = 3426; 1750 c[190] = 3419; 1751 c[191] = 3412; 1752 c[192] = 3405; 1753 c[193] = 3398; 1754 c[194] = 3391; 1755 c[195] = 3384; 1756 c[196] = 3377; 1757 c[197] = 3370; 1758 c[198] = 3363; 1759 c[199] = 3356; 1760 c[200] = 3348; 1761 c[201] = 3341; 1762 c[202] = 3334; 1763 c[203] = 3326; 1764 c[204] = 3319; 1765 c[205] = 3312; 1766 c[206] = 3304; 1767 c[207] = 3297; 1768 c[208] = 3289; 1769 c[209] = 3282; 1770 c[210] = 3274; 1771 c[211] = 3267; 1772 c[212] = 3259; 1773 c[213] = 3252; 1774 c[214] = 3244; 1775 c[215] = 3236; 1776 c[216] = 3229; 1777 c[217] = 3221; 1778 c[218] = 3213; 1779 c[219] = 3205; 1780 c[220] = 3197; 1781 c[221] = 3190; 1782 c[222] = 3182; 1783 c[223] = 3174; 1784 c[224] = 3166; 1785 c[225] = 3158; 1786 c[226] = 3150; 1787 c[227] = 3142; 1788 c[228] = 3134; 1789 c[229] = 3126; 1790 c[230] = 3117; 1791 c[231] = 3109; 1792 c[232] = 3101; 1793 c[233] = 3093; 1794 c[234] = 3085; 1795 c[235] = 3076; 1796 c[236] = 3068; 1797 c[237] = 3060; 1798 c[238] = 3051; 1799 c[239] = 3043; 1800 c[240] = 3034; 1801 c[241] = 3026; 1802 c[242] = 3018; 1803 c[243] = 3009; 1804 c[244] = 3000; 1805 c[245] = 2992; 1806 c[246] = 2983; 1807 c[247] = 2975; 1808 c[248] = 2966; 1809 c[249] = 2957; 1810 c[250] = 2949; 1811 c[251] = 2940; 1812 c[252] = 2931; 1813 c[253] = 2922; 1814 c[254] = 2914; 1815 c[255] = 2905; 1816 c[256] = 2896; 1817 c[257] = 2887; 1818 c[258] = 2878; 1819 c[259] = 2869; 1820 c[260] = 2860; 1821 c[261] = 2851; 1822 c[262] = 2842; 1823 c[263] = 2833; 1824 c[264] = 2824; 1825 c[265] = 2815; 1826 c[266] = 2806; 1827 c[267] = 2796; 1828 c[268] = 2787; 1829 c[269] = 2778; 1830 c[270] = 2769; 1831 c[271] = 2760; 1832 c[272] = 2750; 1833 c[273] = 2741; 1834 c[274] = 2732; 1835 c[275] = 2722; 1836 c[276] = 2713; 1837 c[277] = 2703; 1838 c[278] = 2694; 1839 c[279] = 2684; 1840 c[280] = 2675; 1841 c[281] = 2665; 1842 c[282] = 2656; 1843 c[283] = 2646; 1844 c[284] = 2637; 1845 c[285] = 2627; 1846 c[286] = 2617; 1847 c[287] = 2608; 1848 c[288] = 2598; 1849 c[289] = 2588; 1850 c[290] = 2578; 1851 c[291] = 2569; 1852 c[292] = 2559; 1853 c[293] = 2549; 1854 c[294] = 2539; 1855 c[295] = 2529; 1856 c[296] = 2519; 1857 c[297] = 2510; 1858 c[298] = 2500; 1859 c[299] = 2490; 1860 c[300] = 2480; 1861 c[301] = 2470; 1862 c[302] = 2460; 1863 c[303] = 2450; 1864 c[304] = 2439; 1865 c[305] = 2429; 1866 c[306] = 2419; 1867 c[307] = 2409; 1868 c[308] = 2399; 1869 c[309] = 2389; 1870 c[310] = 2379; 1871 c[311] = 2368; 1872 c[312] = 2358; 1873 c[313] = 2348; 1874 c[314] = 2337; 1875 c[315] = 2327; 1876 c[316] = 2317; 1877 c[317] = 2306; 1878 c[318] = 2296; 1879 c[319] = 2286; 1880 c[320] = 2275; 1881 c[321] = 2265; 1882 c[322] = 2254; 1883 c[323] = 2244; 1884 c[324] = 2233; 1885 c[325] = 2223; 1886 c[326] = 2212; 1887 c[327] = 2201; 1888 c[328] = 2191; 1889 c[329] = 2180; 1890 c[330] = 2170; 1891 c[331] = 2159; 1892 c[332] = 2148; 1893 c[333] = 2138; 1894 c[334] = 2127; 1895 c[335] = 2116; 1896 c[336] = 2105; 1897 c[337] = 2094; 1898 c[338] = 2084; 1899 c[339] = 2073; 1900 c[340] = 2062; 1901 c[341] = 2051; 1902 c[342] = 2040; 1903 c[343] = 2029; 1904 c[344] = 2018; 1905 c[345] = 2007; 1906 c[346] = 1997; 1907 c[347] = 1986; 1908 c[348] = 1975; 1909 c[349] = 1964; 1910 c[350] = 1952; 1911 c[351] = 1941; 1912 c[352] = 1930; 1913 c[353] = 1919; 1914 c[354] = 1908; 1915 c[355] = 1897; 1916 c[356] = 1886; 1917 c[357] = 1875; 1918 c[358] = 1864; 1919 c[359] = 1852; 1920 c[360] = 1841; 1921 c[361] = 1830; 1922 c[362] = 1819; 1923 c[363] = 1807; 1924 c[364] = 1796; 1925 c[365] = 1785; 1926 c[366] = 1773; 1927 c[367] = 1762; 1928 c[368] = 1751; 1929 c[369] = 1739; 1930 c[370] = 1728; 1931 c[371] = 1717; 1932 c[372] = 1705; 1933 c[373] = 1694; 1934 c[374] = 1682; 1935 c[375] = 1671; 1936 c[376] = 1659; 1937 c[377] = 1648; 1938 c[378] = 1636; 1939 c[379] = 1625; 1940 c[380] = 1613; 1941 c[381] = 1602; 1942 c[382] = 1590; 1943 c[383] = 1579; 1944 c[384] = 1567; 1945 c[385] = 1555; 1946 c[386] = 1544; 1947 c[387] = 1532; 1948 c[388] = 1520; 1949 c[389] = 1509; 1950 c[390] = 1497; 1951 c[391] = 1485; 1952 c[392] = 1474; 1953 c[393] = 1462; 1954 c[394] = 1450; 1955 c[395] = 1438; 1956 c[396] = 1427; 1957 c[397] = 1415; 1958 c[398] = 1403; 1959 c[399] = 1391; 1960 c[400] = 1379; 1961 c[401] = 1368; 1962 c[402] = 1356; 1963 c[403] = 1344; 1964 c[404] = 1332; 1965 c[405] = 1320; 1966 c[406] = 1308; 1967 c[407] = 1296; 1968 c[408] = 1284; 1969 c[409] = 1272; 1970 c[410] = 1260; 1971 c[411] = 1248; 1972 c[412] = 1237; 1973 c[413] = 1225; 1974 c[414] = 1213; 1975 c[415] = 1201; 1976 c[416] = 1189; 1977 c[417] = 1176; 1978 c[418] = 1164; 1979 c[419] = 1152; 1980 c[420] = 1140; 1981 c[421] = 1128; 1982 c[422] = 1116; 1983 c[423] = 1104; 1984 c[424] = 1092; 1985 c[425] = 1080; 1986 c[426] = 1068; 1987 c[427] = 1056; 1988 c[428] = 1043; 1989 c[429] = 1031; 1990 c[430] = 1019; 1991 c[431] = 1007; 1992 c[432] = 995; 1993 c[433] = 983; 1994 c[434] = 970; 1995 c[435] = 958; 1996 c[436] = 946; 1997 c[437] = 934; 1998 c[438] = 921; 1999 c[439] = 909; 2000 c[440] = 897; 2001 c[441] = 885; 2002 c[442] = 872; 2003 c[443] = 860; 2004 c[444] = 848; 2005 c[445] = 836; 2006 c[446] = 823; 2007 c[447] = 811; 2008 c[448] = 799; 2009 c[449] = 786; 2010 c[450] = 774; 2011 c[451] = 762; 2012 c[452] = 749; 2013 c[453] = 737; 2014 c[454] = 725; 2015 c[455] = 712; 2016 c[456] = 700; 2017 c[457] = 687; 2018 c[458] = 675; 2019 c[459] = 663; 2020 c[460] = 650; 2021 c[461] = 638; 2022 c[462] = 625; 2023 c[463] = 613; 2024 c[464] = 601; 2025 c[465] = 588; 2026 c[466] = 576; 2027 c[467] = 563; 2028 c[468] = 551; 2029 c[469] = 538; 2030 c[470] = 526; 2031 c[471] = 513; 2032 c[472] = 501; 2033 c[473] = 488; 2034 c[474] = 476; 2035 c[475] = 463; 2036 c[476] = 451; 2037 c[477] = 438; 2038 c[478] = 426; 2039 c[479] = 413; 2040 c[480] = 401; 2041 c[481] = 388; 2042 c[482] = 376; 2043 c[483] = 363; 2044 c[484] = 351; 2045 c[485] = 338; 2046 c[486] = 326; 2047 c[487] = 313; 2048 c[488] = 301; 2049 c[489] = 288; 2050 c[490] = 276; 2051 c[491] = 263; 2052 c[492] = 251; 2053 c[493] = 238; 2054 c[494] = 226; 2055 c[495] = 213; 2056 c[496] = 200; 2057 c[497] = 188; 2058 c[498] = 175; 2059 c[499] = 163; 2060 c[500] = 150; 2061 c[501] = 138; 2062 c[502] = 125; 2063 c[503] = 113; 2064 c[504] = 100; 2065 c[505] = 87; 2066 c[506] = 75; 2067 c[507] = 62; 2068 c[508] = 50; 2069 c[509] = 37; 2070 c[510] = 25; 2071 c[511] = 12; 2072 c[512] = 0; 2073 } /*enh_wind_init*/ 2074 2075 /** 2076 * Initializes a useful large array of random numbers 2077 * @param sig_inObj : sig PU internal object of the sub-object 2078 * @return void 2079 * @callgraph 2080 * @callergraph 2081 */ 2082 static void init_rand(sig_innerobj_t *sig_inObj) 2083 { 2084 picoos_int32 *q = sig_inObj->int_vec34; 2085 picoos_int32 *r = sig_inObj->int_vec35; 2086 2087 sig_inObj->iRand = 0; 2088 2089 q[0] = -2198; 2090 r[0] = 3455; 2091 q[1] = 3226; 2092 r[1] = -2522; 2093 q[2] = -845; 2094 r[2] = 4007; 2095 q[3] = -1227; 2096 r[3] = 3907; 2097 q[4] = -3480; 2098 r[4] = 2158; 2099 q[5] = -1325; 2100 r[5] = -3875; 2101 q[6] = 2089; 2102 r[6] = -3522; 2103 q[7] = -468; 2104 r[7] = 4069; 2105 q[8] = 711; 2106 r[8] = -4033; 2107 q[9] = 3862; 2108 r[9] = 1362; 2109 q[10] = 4054; 2110 r[10] = -579; 2111 q[11] = 2825; 2112 r[11] = 2965; 2113 q[12] = 2704; 2114 r[12] = -3076; 2115 q[13] = 4081; 2116 r[13] = 344; 2117 q[14] = -3912; 2118 r[14] = 1211; 2119 q[15] = -3541; 2120 r[15] = 2058; 2121 q[16] = 2694; 2122 r[16] = 3084; 2123 q[17] = 835; 2124 r[17] = 4009; 2125 q[18] = -2578; 2126 r[18] = -3182; 2127 q[19] = 3205; 2128 r[19] = 2550; 2129 q[20] = -4074; 2130 r[20] = -418; 2131 q[21] = -183; 2132 r[21] = -4091; 2133 q[22] = -2665; 2134 r[22] = -3110; 2135 q[23] = -1367; 2136 r[23] = 3860; 2137 q[24] = -2266; 2138 r[24] = -3411; 2139 q[25] = 3327; 2140 r[25] = -2387; 2141 q[26] = -2807; 2142 r[26] = -2982; 2143 q[27] = -3175; 2144 r[27] = -2587; 2145 q[28] = -4095; 2146 r[28] = 27; 2147 q[29] = -811; 2148 r[29] = -4014; 2149 q[30] = 4082; 2150 r[30] = 332; 2151 q[31] = -2175; 2152 r[31] = 3470; 2153 q[32] = 3112; 2154 r[32] = 2662; 2155 q[33] = 1168; 2156 r[33] = -3925; 2157 q[34] = 2659; 2158 r[34] = 3115; 2159 q[35] = 4048; 2160 r[35] = 622; 2161 q[36] = 4092; 2162 r[36] = -165; 2163 q[37] = -4036; 2164 r[37] = 697; 2165 q[38] = 1081; 2166 r[38] = -3950; 2167 q[39] = -548; 2168 r[39] = 4059; 2169 q[40] = 4038; 2170 r[40] = 685; 2171 q[41] = -511; 2172 r[41] = 4063; 2173 q[42] = 3317; 2174 r[42] = -2402; 2175 q[43] = -3180; 2176 r[43] = 2580; 2177 q[44] = 851; 2178 r[44] = -4006; 2179 q[45] = 2458; 2180 r[45] = -3276; 2181 q[46] = -1453; 2182 r[46] = 3829; 2183 q[47] = -3577; 2184 r[47] = 1995; 2185 q[48] = -3708; 2186 r[48] = -1738; 2187 q[49] = -3890; 2188 r[49] = 1282; 2189 q[50] = 4041; 2190 r[50] = 666; 2191 q[51] = -3511; 2192 r[51] = -2108; 2193 q[52] = -1454; 2194 r[52] = -3828; 2195 q[53] = 2124; 2196 r[53] = 3502; 2197 q[54] = -3159; 2198 r[54] = 2606; 2199 q[55] = 2384; 2200 r[55] = -3330; 2201 q[56] = -3767; 2202 r[56] = -1607; 2203 q[57] = -4063; 2204 r[57] = -513; 2205 q[58] = 3952; 2206 r[58] = -1075; 2207 q[59] = -3778; 2208 r[59] = -1581; 2209 q[60] = -301; 2210 r[60] = -4084; 2211 q[61] = -4026; 2212 r[61] = 751; 2213 q[62] = -3346; 2214 r[62] = 2361; 2215 q[63] = -2426; 2216 r[63] = 3299; 2217 q[64] = 428; 2218 r[64] = -4073; 2219 q[65] = 3968; 2220 r[65] = 1012; 2221 q[66] = 2900; 2222 r[66] = -2892; 2223 q[67] = -263; 2224 r[67] = 4087; 2225 q[68] = 4083; 2226 r[68] = 322; 2227 q[69] = 2024; 2228 r[69] = 3560; 2229 q[70] = 4015; 2230 r[70] = 808; 2231 q[71] = -3971; 2232 r[71] = -1000; 2233 q[72] = 3785; 2234 r[72] = -1564; 2235 q[73] = -3726; 2236 r[73] = 1701; 2237 q[74] = -3714; 2238 r[74] = 1725; 2239 q[75] = 743; 2240 r[75] = 4027; 2241 q[76] = 875; 2242 r[76] = -4001; 2243 q[77] = 294; 2244 r[77] = 4085; 2245 q[78] = 2611; 2246 r[78] = 3155; 2247 q[79] = 2491; 2248 r[79] = -3251; 2249 q[80] = 1558; 2250 r[80] = 3787; 2251 q[81] = -2063; 2252 r[81] = -3538; 2253 q[82] = 3809; 2254 r[82] = -1505; 2255 q[83] = -2987; 2256 r[83] = 2802; 2257 q[84] = -1955; 2258 r[84] = 3599; 2259 q[85] = 1980; 2260 r[85] = -3585; 2261 q[86] = -539; 2262 r[86] = -4060; 2263 q[87] = -3210; 2264 r[87] = 2543; 2265 q[88] = 2415; 2266 r[88] = -3308; 2267 q[89] = 1587; 2268 r[89] = 3775; 2269 q[90] = -3943; 2270 r[90] = 1106; 2271 q[91] = 3476; 2272 r[91] = 2165; 2273 q[92] = 2253; 2274 r[92] = 3420; 2275 q[93] = -2584; 2276 r[93] = 3177; 2277 q[94] = 3804; 2278 r[94] = -1518; 2279 q[95] = -3637; 2280 r[95] = 1883; 2281 q[96] = 3289; 2282 r[96] = -2440; 2283 q[97] = -1621; 2284 r[97] = 3761; 2285 q[98] = 1645; 2286 r[98] = 3751; 2287 q[99] = -3471; 2288 r[99] = 2173; 2289 q[100] = 4071; 2290 r[100] = -449; 2291 q[101] = -872; 2292 r[101] = -4001; 2293 q[102] = -3897; 2294 r[102] = 1259; 2295 q[103] = -3590; 2296 r[103] = 1970; 2297 q[104] = -2456; 2298 r[104] = -3277; 2299 q[105] = -3004; 2300 r[105] = 2783; 2301 q[106] = 2589; 2302 r[106] = 3173; 2303 q[107] = 3727; 2304 r[107] = -1698; 2305 q[108] = 2992; 2306 r[108] = 2796; 2307 q[109] = 794; 2308 r[109] = -4018; 2309 q[110] = -918; 2310 r[110] = 3991; 2311 q[111] = 1446; 2312 r[111] = -3831; 2313 q[112] = 3871; 2314 r[112] = -1338; 2315 q[113] = -612; 2316 r[113] = -4049; 2317 q[114] = -1566; 2318 r[114] = -3784; 2319 q[115] = 672; 2320 r[115] = -4040; 2321 q[116] = 3841; 2322 r[116] = 1422; 2323 q[117] = 3545; 2324 r[117] = -2051; 2325 q[118] = -1982; 2326 r[118] = -3584; 2327 q[119] = -3413; 2328 r[119] = 2263; 2329 q[120] = -3265; 2330 r[120] = -2473; 2331 q[121] = -2876; 2332 r[121] = -2915; 2333 q[122] = 4094; 2334 r[122] = -117; 2335 q[123] = -269; 2336 r[123] = 4087; 2337 q[124] = -4077; 2338 r[124] = 391; 2339 q[125] = -3759; 2340 r[125] = 1626; 2341 q[126] = 1639; 2342 r[126] = 3753; 2343 q[127] = 3041; 2344 r[127] = -2743; 2345 q[128] = 5; 2346 r[128] = 4095; 2347 q[129] = 2778; 2348 r[129] = -3009; 2349 q[130] = 1121; 2350 r[130] = -3939; 2351 q[131] = -455; 2352 r[131] = -4070; 2353 q[132] = 3532; 2354 r[132] = 2073; 2355 q[133] = -143; 2356 r[133] = -4093; 2357 q[134] = -2357; 2358 r[134] = -3349; 2359 q[135] = 458; 2360 r[135] = 4070; 2361 q[136] = -2887; 2362 r[136] = -2904; 2363 q[137] = -1104; 2364 r[137] = 3944; 2365 q[138] = -2104; 2366 r[138] = -3513; 2367 q[139] = 126; 2368 r[139] = 4094; 2369 q[140] = -3655; 2370 r[140] = -1848; 2371 q[141] = -3896; 2372 r[141] = 1263; 2373 q[142] = -3874; 2374 r[142] = -1327; 2375 q[143] = 4058; 2376 r[143] = 553; 2377 q[144] = -1831; 2378 r[144] = -3663; 2379 q[145] = -255; 2380 r[145] = -4088; 2381 q[146] = -1211; 2382 r[146] = 3912; 2383 q[147] = 445; 2384 r[147] = 4071; 2385 q[148] = 2268; 2386 r[148] = 3410; 2387 q[149] = -4010; 2388 r[149] = 833; 2389 q[150] = 2621; 2390 r[150] = 3147; 2391 q[151] = -250; 2392 r[151] = 4088; 2393 q[152] = -3409; 2394 r[152] = -2269; 2395 q[153] = -2710; 2396 r[153] = -3070; 2397 q[154] = 4063; 2398 r[154] = 518; 2399 q[155] = -3611; 2400 r[155] = -1933; 2401 q[156] = -3707; 2402 r[156] = -1741; 2403 q[157] = -1151; 2404 r[157] = -3930; 2405 q[158] = 3976; 2406 r[158] = -983; 2407 q[159] = -1736; 2408 r[159] = 3709; 2409 q[160] = 3669; 2410 r[160] = 1820; 2411 q[161] = -143; 2412 r[161] = 4093; 2413 q[162] = -3879; 2414 r[162] = -1313; 2415 q[163] = -2242; 2416 r[163] = -3427; 2417 q[164] = -4095; 2418 r[164] = 0; 2419 q[165] = -1159; 2420 r[165] = -3928; 2421 q[166] = -3155; 2422 r[166] = 2611; 2423 q[167] = -2887; 2424 r[167] = -2904; 2425 q[168] = -4095; 2426 r[168] = 56; 2427 q[169] = -3861; 2428 r[169] = -1364; 2429 q[170] = -2814; 2430 r[170] = 2976; 2431 q[171] = -3680; 2432 r[171] = -1798; 2433 q[172] = -4094; 2434 r[172] = -107; 2435 q[173] = -3626; 2436 r[173] = 1903; 2437 q[174] = 3403; 2438 r[174] = 2278; 2439 q[175] = -1735; 2440 r[175] = -3710; 2441 q[176] = -2126; 2442 r[176] = -3500; 2443 q[177] = 3183; 2444 r[177] = -2577; 2445 q[178] = -3499; 2446 r[178] = 2128; 2447 q[179] = -1736; 2448 r[179] = 3709; 2449 q[180] = 2592; 2450 r[180] = -3170; 2451 q[181] = 3875; 2452 r[181] = 1326; 2453 q[182] = 3596; 2454 r[182] = 1960; 2455 q[183] = 3915; 2456 r[183] = -1202; 2457 q[184] = 1570; 2458 r[184] = 3783; 2459 q[185] = -3319; 2460 r[185] = -2400; 2461 q[186] = 4019; 2462 r[186] = 787; 2463 q[187] = -187; 2464 r[187] = 4091; 2465 q[188] = 1370; 2466 r[188] = -3859; 2467 q[189] = -4091; 2468 r[189] = 199; 2469 q[190] = 3626; 2470 r[190] = 1904; 2471 q[191] = -2943; 2472 r[191] = 2848; 2473 q[192] = 56; 2474 r[192] = 4095; 2475 q[193] = 2824; 2476 r[193] = 2966; 2477 q[194] = -3994; 2478 r[194] = -904; 2479 q[195] = 56; 2480 r[195] = 4095; 2481 q[196] = -2045; 2482 r[196] = 3548; 2483 q[197] = -3653; 2484 r[197] = 1850; 2485 q[198] = -2864; 2486 r[198] = 2927; 2487 q[199] = -1996; 2488 r[199] = 3576; 2489 q[200] = -4061; 2490 r[200] = 527; 2491 q[201] = 159; 2492 r[201] = 4092; 2493 q[202] = -3363; 2494 r[202] = 2336; 2495 q[203] = -4074; 2496 r[203] = 421; 2497 q[204] = 2043; 2498 r[204] = 3549; 2499 q[205] = 4095; 2500 r[205] = -70; 2501 q[206] = -2107; 2502 r[206] = -3512; 2503 q[207] = -1973; 2504 r[207] = 3589; 2505 q[208] = -3138; 2506 r[208] = 2631; 2507 q[209] = -3625; 2508 r[209] = -1905; 2509 q[210] = 2413; 2510 r[210] = 3309; 2511 q[211] = -50; 2512 r[211] = -4095; 2513 q[212] = 2813; 2514 r[212] = 2976; 2515 q[213] = -535; 2516 r[213] = -4060; 2517 q[214] = 1250; 2518 r[214] = 3900; 2519 q[215] = 1670; 2520 r[215] = -3739; 2521 q[216] = 1945; 2522 r[216] = -3604; 2523 q[217] = -476; 2524 r[217] = -4068; 2525 q[218] = -3659; 2526 r[218] = -1840; 2527 q[219] = 2745; 2528 r[219] = 3039; 2529 q[220] = -674; 2530 r[220] = -4040; 2531 q[221] = 2383; 2532 r[221] = 3330; 2533 q[222] = 4086; 2534 r[222] = 274; 2535 q[223] = -4030; 2536 r[223] = 730; 2537 q[224] = 768; 2538 r[224] = -4023; 2539 q[225] = 3925; 2540 r[225] = 1170; 2541 q[226] = 785; 2542 r[226] = 4019; 2543 q[227] = -3101; 2544 r[227] = -2675; 2545 q[228] = 4030; 2546 r[228] = -729; 2547 q[229] = 3422; 2548 r[229] = 2249; 2549 q[230] = -3847; 2550 r[230] = 1403; 2551 q[231] = 3902; 2552 r[231] = -1243; 2553 q[232] = 2114; 2554 r[232] = -3507; 2555 q[233] = -2359; 2556 r[233] = 3348; 2557 q[234] = 3754; 2558 r[234] = -1638; 2559 q[235] = -4095; 2560 r[235] = -83; 2561 q[236] = 2301; 2562 r[236] = -3388; 2563 q[237] = 3336; 2564 r[237] = 2375; 2565 q[238] = -2045; 2566 r[238] = 3548; 2567 q[239] = -413; 2568 r[239] = -4075; 2569 q[240] = 1848; 2570 r[240] = 3655; 2571 q[241] = 4072; 2572 r[241] = -437; 2573 q[242] = 4069; 2574 r[242] = -463; 2575 q[243] = 1386; 2576 r[243] = -3854; 2577 q[244] = 966; 2578 r[244] = 3980; 2579 q[245] = -1684; 2580 r[245] = -3733; 2581 q[246] = 2953; 2582 r[246] = 2837; 2583 q[247] = -3961; 2584 r[247] = -1040; 2585 q[248] = 3512; 2586 r[248] = -2107; 2587 q[249] = 1363; 2588 r[249] = 3862; 2589 q[250] = 1883; 2590 r[250] = 3637; 2591 q[251] = 2657; 2592 r[251] = 3116; 2593 q[252] = 2347; 2594 r[252] = -3356; 2595 q[253] = -1635; 2596 r[253] = -3755; 2597 q[254] = 3170; 2598 r[254] = 2593; 2599 q[255] = 2856; 2600 r[255] = 2935; 2601 q[256] = 494; 2602 r[256] = 4066; 2603 q[257] = 1936; 2604 r[257] = -3609; 2605 q[258] = 245; 2606 r[258] = 4088; 2607 q[259] = -1211; 2608 r[259] = -3912; 2609 q[260] = -3600; 2610 r[260] = 1952; 2611 q[261] = 1632; 2612 r[261] = 3756; 2613 q[262] = 2341; 2614 r[262] = 3360; 2615 q[263] = 186; 2616 r[263] = -4091; 2617 q[264] = 4011; 2618 r[264] = 829; 2619 q[265] = -3490; 2620 r[265] = -2143; 2621 q[266] = 269; 2622 r[266] = -4087; 2623 q[267] = -2939; 2624 r[267] = 2852; 2625 q[268] = 1600; 2626 r[268] = 3770; 2627 q[269] = -3405; 2628 r[269] = -2275; 2629 q[270] = -3134; 2630 r[270] = -2636; 2631 q[271] = 2642; 2632 r[271] = -3129; 2633 q[272] = 3629; 2634 r[272] = 1898; 2635 q[273] = 3413; 2636 r[273] = 2264; 2637 q[274] = 2050; 2638 r[274] = 3545; 2639 q[275] = 988; 2640 r[275] = -3975; 2641 q[276] = -660; 2642 r[276] = 4042; 2643 q[277] = 978; 2644 r[277] = -3977; 2645 q[278] = 1965; 2646 r[278] = -3593; 2647 q[279] = -1513; 2648 r[279] = -3806; 2649 q[280] = -4076; 2650 r[280] = 401; 2651 q[281] = -4094; 2652 r[281] = -92; 2653 q[282] = -1914; 2654 r[282] = 3621; 2655 q[283] = 2006; 2656 r[283] = -3570; 2657 q[284] = -1550; 2658 r[284] = -3791; 2659 q[285] = 3774; 2660 r[285] = -1591; 2661 q[286] = -3958; 2662 r[286] = 1052; 2663 q[287] = -3576; 2664 r[287] = 1997; 2665 q[288] = -382; 2666 r[288] = 4078; 2667 q[289] = 1288; 2668 r[289] = 3888; 2669 q[290] = -2965; 2670 r[290] = -2825; 2671 q[291] = 1608; 2672 r[291] = 3767; 2673 q[292] = 3052; 2674 r[292] = -2731; 2675 q[293] = -622; 2676 r[293] = 4048; 2677 q[294] = -3836; 2678 r[294] = 1434; 2679 q[295] = -3542; 2680 r[295] = 2056; 2681 q[296] = -2648; 2682 r[296] = 3124; 2683 q[297] = -1178; 2684 r[297] = -3922; 2685 q[298] = -1109; 2686 r[298] = 3942; 2687 q[299] = 3910; 2688 r[299] = 1217; 2689 q[300] = 1199; 2690 r[300] = -3916; 2691 q[301] = -3386; 2692 r[301] = 2303; 2693 q[302] = -3453; 2694 r[302] = 2202; 2695 q[303] = -2877; 2696 r[303] = 2914; 2697 q[304] = 4095; 2698 r[304] = -47; 2699 q[305] = 3635; 2700 r[305] = 1886; 2701 q[306] = -2134; 2702 r[306] = -3495; 2703 q[307] = 613; 2704 r[307] = -4049; 2705 q[308] = -2700; 2706 r[308] = 3079; 2707 q[309] = 4091; 2708 r[309] = -195; 2709 q[310] = 3989; 2710 r[310] = -927; 2711 q[311] = -2385; 2712 r[311] = 3329; 2713 q[312] = 4094; 2714 r[312] = -103; 2715 q[313] = 1044; 2716 r[313] = -3960; 2717 q[314] = -1734; 2718 r[314] = -3710; 2719 q[315] = 1646; 2720 r[315] = 3750; 2721 q[316] = 575; 2722 r[316] = 4055; 2723 q[317] = -2629; 2724 r[317] = -3140; 2725 q[318] = 3266; 2726 r[318] = 2471; 2727 q[319] = 4091; 2728 r[319] = -194; 2729 q[320] = -2154; 2730 r[320] = 3483; 2731 q[321] = 659; 2732 r[321] = 4042; 2733 q[322] = -1785; 2734 r[322] = -3686; 2735 q[323] = -717; 2736 r[323] = -4032; 2737 q[324] = 4095; 2738 r[324] = -37; 2739 q[325] = -2963; 2740 r[325] = -2827; 2741 q[326] = -2645; 2742 r[326] = -3126; 2743 q[327] = 2619; 2744 r[327] = -3148; 2745 q[328] = 1855; 2746 r[328] = -3651; 2747 q[329] = -3726; 2748 r[329] = 1699; 2749 q[330] = -3437; 2750 r[330] = 2227; 2751 q[331] = 2948; 2752 r[331] = 2842; 2753 q[332] = -2125; 2754 r[332] = 3501; 2755 q[333] = -1700; 2756 r[333] = 3726; 2757 q[334] = 4094; 2758 r[334] = -101; 2759 q[335] = 2084; 2760 r[335] = -3525; 2761 q[336] = 3225; 2762 r[336] = -2524; 2763 q[337] = 2220; 2764 r[337] = 3442; 2765 q[338] = 3174; 2766 r[338] = 2588; 2767 q[339] = 229; 2768 r[339] = -4089; 2769 q[340] = -2381; 2770 r[340] = -3332; 2771 q[341] = -3677; 2772 r[341] = -1803; 2773 q[342] = -3191; 2774 r[342] = -2567; 2775 q[343] = 2465; 2776 r[343] = 3270; 2777 q[344] = 2681; 2778 r[344] = -3096; 2779 q[345] = 975; 2780 r[345] = -3978; 2781 q[346] = 2004; 2782 r[346] = -3572; 2783 q[347] = -3442; 2784 r[347] = -2219; 2785 q[348] = 3676; 2786 r[348] = -1805; 2787 q[349] = -3753; 2788 r[349] = 1638; 2789 q[350] = 3544; 2790 r[350] = 2053; 2791 q[351] = 397; 2792 r[351] = -4076; 2793 q[352] = 2221; 2794 r[352] = 3440; 2795 q[353] = -302; 2796 r[353] = 4084; 2797 q[354] = 4083; 2798 r[354] = -323; 2799 q[355] = -2253; 2800 r[355] = -3420; 2801 q[356] = -3038; 2802 r[356] = 2746; 2803 q[357] = 2884; 2804 r[357] = 2908; 2805 q[358] = 4070; 2806 r[358] = 454; 2807 q[359] = -1072; 2808 r[359] = -3953; 2809 q[360] = 3831; 2810 r[360] = 1449; 2811 q[361] = 3663; 2812 r[361] = -1831; 2813 q[362] = -1971; 2814 r[362] = 3590; 2815 q[363] = 3226; 2816 r[363] = -2522; 2817 q[364] = -145; 2818 r[364] = -4093; 2819 q[365] = 1882; 2820 r[365] = -3637; 2821 q[366] = 529; 2822 r[366] = 4061; 2823 q[367] = 2637; 2824 r[367] = 3133; 2825 q[368] = -4077; 2826 r[368] = 389; 2827 q[369] = 2156; 2828 r[369] = -3482; 2829 q[370] = -3276; 2830 r[370] = 2458; 2831 q[371] = -2687; 2832 r[371] = -3090; 2833 q[372] = 3469; 2834 r[372] = -2177; 2835 q[373] = -4093; 2836 r[373] = -139; 2837 q[374] = -850; 2838 r[374] = 4006; 2839 q[375] = -625; 2840 r[375] = 4048; 2841 q[376] = 1110; 2842 r[376] = -3942; 2843 q[377] = -3078; 2844 r[377] = -2702; 2845 q[378] = -2719; 2846 r[378] = 3063; 2847 q[379] = 742; 2848 r[379] = 4028; 2849 q[380] = -3902; 2850 r[380] = -1245; 2851 q[381] = 3888; 2852 r[381] = -1287; 2853 q[382] = -4081; 2854 r[382] = 347; 2855 q[383] = 1070; 2856 r[383] = 3953; 2857 q[384] = -996; 2858 r[384] = -3972; 2859 q[385] = 4041; 2860 r[385] = -668; 2861 q[386] = -2712; 2862 r[386] = 3069; 2863 q[387] = -3403; 2864 r[387] = -2279; 2865 q[388] = -3320; 2866 r[388] = -2398; 2867 q[389] = 3036; 2868 r[389] = -2749; 2869 q[390] = 1308; 2870 r[390] = -3881; 2871 q[391] = 2256; 2872 r[391] = 3418; 2873 q[392] = -1486; 2874 r[392] = 3816; 2875 q[393] = -2771; 2876 r[393] = -3015; 2877 q[394] = -3883; 2878 r[394] = -1302; 2879 q[395] = -3867; 2880 r[395] = -1349; 2881 q[396] = 3952; 2882 r[396] = -1075; 2883 q[397] = -789; 2884 r[397] = 4019; 2885 q[398] = 1458; 2886 r[398] = 3827; 2887 q[399] = 3832; 2888 r[399] = -1446; 2889 q[400] = -3001; 2890 r[400] = -2787; 2891 q[401] = 3463; 2892 r[401] = 2186; 2893 q[402] = 3606; 2894 r[402] = 1942; 2895 q[403] = 4023; 2896 r[403] = 764; 2897 q[404] = 3387; 2898 r[404] = 2303; 2899 q[405] = 2648; 2900 r[405] = -3124; 2901 q[406] = 1370; 2902 r[406] = -3860; 2903 q[407] = -3134; 2904 r[407] = 2636; 2905 q[408] = 4051; 2906 r[408] = -600; 2907 q[409] = -1977; 2908 r[409] = -3587; 2909 q[410] = 3160; 2910 r[410] = 2605; 2911 q[411] = 4042; 2912 r[411] = 659; 2913 q[412] = 3004; 2914 r[412] = 2783; 2915 q[413] = 3370; 2916 r[413] = 2327; 2917 q[414] = -419; 2918 r[414] = -4074; 2919 q[415] = -1968; 2920 r[415] = 3591; 2921 q[416] = -3705; 2922 r[416] = -1746; 2923 q[417] = -3331; 2924 r[417] = -2383; 2925 q[418] = -3634; 2926 r[418] = 1888; 2927 q[419] = -1981; 2928 r[419] = -3584; 2929 q[420] = 4069; 2930 r[420] = -469; 2931 q[421] = -628; 2932 r[421] = -4047; 2933 q[422] = -1900; 2934 r[422] = 3628; 2935 q[423] = 1039; 2936 r[423] = -3961; 2937 q[424] = 2554; 2938 r[424] = -3201; 2939 q[425] = -2955; 2940 r[425] = 2836; 2941 q[426] = 2286; 2942 r[426] = -3398; 2943 q[427] = -1624; 2944 r[427] = 3760; 2945 q[428] = 2213; 2946 r[428] = 3446; 2947 q[429] = -3989; 2948 r[429] = -926; 2949 q[430] = 192; 2950 r[430] = -4091; 2951 q[431] = -723; 2952 r[431] = 4031; 2953 q[432] = 2878; 2954 r[432] = 2913; 2955 q[433] = -2109; 2956 r[433] = 3511; 2957 q[434] = 1463; 2958 r[434] = -3825; 2959 q[435] = -741; 2960 r[435] = -4028; 2961 q[436] = -1314; 2962 r[436] = -3879; 2963 q[437] = 3115; 2964 r[437] = 2659; 2965 q[438] = -3160; 2966 r[438] = -2605; 2967 q[439] = 1868; 2968 r[439] = 3644; 2969 q[440] = -824; 2970 r[440] = 4012; 2971 q[441] = 781; 2972 r[441] = 4020; 2973 q[442] = -1257; 2974 r[442] = -3898; 2975 q[443] = 3331; 2976 r[443] = -2382; 2977 q[444] = 1642; 2978 r[444] = -3752; 2979 q[445] = 3748; 2980 r[445] = -1650; 2981 q[446] = -487; 2982 r[446] = -4066; 2983 q[447] = 3085; 2984 r[447] = -2694; 2985 q[448] = 4009; 2986 r[448] = 839; 2987 q[449] = -2308; 2988 r[449] = -3383; 2989 q[450] = 3850; 2990 r[450] = 1397; 2991 q[451] = -4078; 2992 r[451] = -374; 2993 q[452] = 2989; 2994 r[452] = -2799; 2995 q[453] = 3023; 2996 r[453] = -2762; 2997 q[454] = 1397; 2998 r[454] = -3850; 2999 q[455] = 323; 3000 r[455] = 4083; 3001 q[456] = 268; 3002 r[456] = -4087; 3003 q[457] = 2414; 3004 r[457] = 3308; 3005 q[458] = 3876; 3006 r[458] = 1322; 3007 q[459] = -3584; 3008 r[459] = 1982; 3009 q[460] = 1603; 3010 r[460] = 3769; 3011 q[461] = -1502; 3012 r[461] = 3810; 3013 q[462] = 1318; 3014 r[462] = 3878; 3015 q[463] = 1554; 3016 r[463] = -3789; 3017 q[464] = 2492; 3018 r[464] = 3250; 3019 q[465] = -4093; 3020 r[465] = -154; 3021 q[466] = 4008; 3022 r[466] = 842; 3023 q[467] = -2279; 3024 r[467] = 3403; 3025 q[468] = 3013; 3026 r[468] = 2774; 3027 q[469] = 2557; 3028 r[469] = 3199; 3029 q[470] = 4068; 3030 r[470] = 475; 3031 q[471] = 3324; 3032 r[471] = -2392; 3033 q[472] = 2653; 3034 r[472] = -3120; 3035 q[473] = 796; 3036 r[473] = 4017; 3037 q[474] = -1312; 3038 r[474] = 3880; 3039 q[475] = 1794; 3040 r[475] = 3681; 3041 q[476] = -2347; 3042 r[476] = -3356; 3043 q[477] = -4008; 3044 r[477] = -840; 3045 q[478] = -3773; 3046 r[478] = -1592; 3047 q[479] = 1609; 3048 r[479] = 3766; 3049 q[480] = -1564; 3050 r[480] = -3785; 3051 q[481] = 3004; 3052 r[481] = 2784; 3053 q[482] = 1258; 3054 r[482] = 3897; 3055 q[483] = 3729; 3056 r[483] = 1693; 3057 q[484] = -4095; 3058 r[484] = -28; 3059 q[485] = -4093; 3060 r[485] = -146; 3061 q[486] = 1393; 3062 r[486] = -3851; 3063 q[487] = 297; 3064 r[487] = -4085; 3065 q[488] = 2294; 3066 r[488] = 3393; 3067 q[489] = -2562; 3068 r[489] = 3195; 3069 q[490] = -1716; 3070 r[490] = -3718; 3071 q[491] = 2224; 3072 r[491] = -3439; 3073 q[492] = 2032; 3074 r[492] = 3555; 3075 q[493] = -2968; 3076 r[493] = 2822; 3077 q[494] = 2338; 3078 r[494] = 3363; 3079 q[495] = 1584; 3080 r[495] = -3776; 3081 q[496] = -3072; 3082 r[496] = 2708; 3083 q[497] = -1596; 3084 r[497] = -3771; 3085 q[498] = -2256; 3086 r[498] = -3418; 3087 q[499] = 4095; 3088 r[499] = 89; 3089 q[500] = -1949; 3090 r[500] = 3602; 3091 q[501] = 1844; 3092 r[501] = 3657; 3093 q[502] = -3375; 3094 r[502] = 2319; 3095 q[503] = -1481; 3096 r[503] = -3818; 3097 q[504] = 3228; 3098 r[504] = -2520; 3099 q[505] = 1116; 3100 r[505] = 3940; 3101 q[506] = -2783; 3102 r[506] = 3004; 3103 q[507] = 3915; 3104 r[507] = 1201; 3105 q[508] = 283; 3106 r[508] = 4086; 3107 q[509] = -3732; 3108 r[509] = 1685; 3109 q[510] = -433; 3110 r[510] = -4072; 3111 q[511] = -3667; 3112 r[511] = 1823; 3113 q[512] = 3883; 3114 r[512] = 1300; 3115 q[513] = -3742; 3116 r[513] = 1663; 3117 q[514] = 4093; 3118 r[514] = -143; 3119 q[515] = 3874; 3120 r[515] = 1328; 3121 q[516] = -3800; 3122 r[516] = 1528; 3123 q[517] = -1257; 3124 r[517] = 3898; 3125 q[518] = -1606; 3126 r[518] = 3767; 3127 q[519] = 3394; 3128 r[519] = 2291; 3129 q[520] = 2255; 3130 r[520] = 3419; 3131 q[521] = -4094; 3132 r[521] = 120; 3133 q[522] = -3767; 3134 r[522] = 1606; 3135 q[523] = 1849; 3136 r[523] = -3654; 3137 q[524] = -2883; 3138 r[524] = 2908; 3139 q[525] = 3469; 3140 r[525] = 2176; 3141 q[526] = 2654; 3142 r[526] = 3119; 3143 q[527] = -239; 3144 r[527] = 4088; 3145 q[528] = -651; 3146 r[528] = 4043; 3147 q[529] = -1140; 3148 r[529] = 3934; 3149 q[530] = 328; 3150 r[530] = -4082; 3151 q[531] = 3246; 3152 r[531] = 2497; 3153 q[532] = 4026; 3154 r[532] = -753; 3155 q[533] = -2041; 3156 r[533] = -3550; 3157 q[534] = -1154; 3158 r[534] = 3929; 3159 q[535] = -2710; 3160 r[535] = 3070; 3161 q[536] = -2860; 3162 r[536] = 2932; 3163 q[537] = 2097; 3164 r[537] = 3517; 3165 q[538] = 3492; 3166 r[538] = -2140; 3167 q[539] = 3123; 3168 r[539] = 2649; 3169 q[540] = 3360; 3170 r[540] = 2342; 3171 q[541] = 2498; 3172 r[541] = 3245; 3173 q[542] = 3976; 3174 r[542] = 982; 3175 q[543] = -2441; 3176 r[543] = -3288; 3177 q[544] = 3601; 3178 r[544] = 1951; 3179 q[545] = -4008; 3180 r[545] = -842; 3181 q[546] = 1243; 3182 r[546] = 3902; 3183 q[547] = 4069; 3184 r[547] = 466; 3185 q[548] = -2031; 3186 r[548] = 3556; 3187 q[549] = 4077; 3188 r[549] = 386; 3189 q[550] = -3112; 3190 r[550] = -2663; 3191 q[551] = 4087; 3192 r[551] = -262; 3193 q[552] = 4087; 3194 r[552] = 266; 3195 q[553] = -3907; 3196 r[553] = -1228; 3197 q[554] = -1611; 3198 r[554] = 3765; 3199 q[555] = 3066; 3200 r[555] = -2715; 3201 q[556] = 2657; 3202 r[556] = 3117; 3203 q[557] = 3912; 3204 r[557] = -1213; 3205 q[558] = -2531; 3206 r[558] = -3220; 3207 q[559] = 3500; 3208 r[559] = -2127; 3209 q[560] = -76; 3210 r[560] = -4095; 3211 q[561] = 3413; 3212 r[561] = -2264; 3213 q[562] = -4071; 3214 r[562] = -448; 3215 q[563] = 828; 3216 r[563] = 4011; 3217 q[564] = 3664; 3218 r[564] = 1830; 3219 q[565] = -1578; 3220 r[565] = 3779; 3221 q[566] = 3555; 3222 r[566] = 2033; 3223 q[567] = 3868; 3224 r[567] = -1345; 3225 q[568] = 4054; 3226 r[568] = -580; 3227 q[569] = -4094; 3228 r[569] = 124; 3229 q[570] = -3820; 3230 r[570] = -1477; 3231 q[571] = -3658; 3232 r[571] = -1842; 3233 q[572] = 2595; 3234 r[572] = 3168; 3235 q[573] = 3354; 3236 r[573] = 2350; 3237 q[574] = -701; 3238 r[574] = -4035; 3239 q[575] = -772; 3240 r[575] = -4022; 3241 q[576] = 2799; 3242 r[576] = 2990; 3243 q[577] = -3632; 3244 r[577] = 1893; 3245 q[578] = 310; 3246 r[578] = 4084; 3247 q[579] = 3984; 3248 r[579] = -947; 3249 q[580] = 3794; 3250 r[580] = -1542; 3251 q[581] = -2419; 3252 r[581] = 3304; 3253 q[582] = -3916; 3254 r[582] = 1200; 3255 q[583] = -3886; 3256 r[583] = 1292; 3257 q[584] = -3299; 3258 r[584] = 2426; 3259 q[585] = -437; 3260 r[585] = 4072; 3261 q[586] = 2053; 3262 r[586] = -3544; 3263 q[587] = 3987; 3264 r[587] = 937; 3265 q[588] = -789; 3266 r[588] = -4019; 3267 q[589] = 4055; 3268 r[589] = -575; 3269 q[590] = -3894; 3270 r[590] = 1270; 3271 q[591] = 4003; 3272 r[591] = -864; 3273 q[592] = -3060; 3274 r[592] = 2721; 3275 q[593] = -4009; 3276 r[593] = 836; 3277 q[594] = -1655; 3278 r[594] = -3746; 3279 q[595] = 3954; 3280 r[595] = -1067; 3281 q[596] = -773; 3282 r[596] = 4022; 3283 q[597] = -422; 3284 r[597] = 4074; 3285 q[598] = -3384; 3286 r[598] = 2306; 3287 q[599] = 195; 3288 r[599] = -4091; 3289 q[600] = -298; 3290 r[600] = 4085; 3291 q[601] = -3988; 3292 r[601] = 931; 3293 q[602] = 2014; 3294 r[602] = -3566; 3295 q[603] = 3349; 3296 r[603] = -2357; 3297 q[604] = 3800; 3298 r[604] = 1526; 3299 q[605] = 3858; 3300 r[605] = 1374; 3301 q[606] = 2947; 3302 r[606] = 2844; 3303 q[607] = -1483; 3304 r[607] = -3818; 3305 q[608] = 4056; 3306 r[608] = -565; 3307 q[609] = 2612; 3308 r[609] = -3154; 3309 q[610] = 2326; 3310 r[610] = 3371; 3311 q[611] = -3545; 3312 r[611] = 2051; 3313 q[612] = -1001; 3314 r[612] = -3971; 3315 q[613] = 3211; 3316 r[613] = 2541; 3317 q[614] = -2717; 3318 r[614] = 3065; 3319 q[615] = -3159; 3320 r[615] = -2606; 3321 q[616] = 2869; 3322 r[616] = -2922; 3323 q[617] = -1290; 3324 r[617] = -3887; 3325 q[618] = 2479; 3326 r[618] = 3260; 3327 q[619] = 3420; 3328 r[619] = 2252; 3329 q[620] = 1823; 3330 r[620] = 3667; 3331 q[621] = 3368; 3332 r[621] = 2330; 3333 q[622] = -3819; 3334 r[622] = -1480; 3335 q[623] = 3800; 3336 r[623] = 1528; 3337 q[624] = 3773; 3338 r[624] = 1594; 3339 q[625] = -189; 3340 r[625] = -4091; 3341 q[626] = -4067; 3342 r[626] = -485; 3343 q[627] = 2277; 3344 r[627] = -3404; 3345 q[628] = -4089; 3346 r[628] = -233; 3347 q[629] = -3634; 3348 r[629] = 1889; 3349 q[630] = 3292; 3350 r[630] = 2437; 3351 q[631] = -530; 3352 r[631] = 4061; 3353 q[632] = -3109; 3354 r[632] = 2666; 3355 q[633] = -3741; 3356 r[633] = 1667; 3357 q[634] = -1903; 3358 r[634] = -3626; 3359 q[635] = 3879; 3360 r[635] = -1315; 3361 q[636] = 4083; 3362 r[636] = -315; 3363 q[637] = -1148; 3364 r[637] = 3931; 3365 q[638] = 2630; 3366 r[638] = 3139; 3367 q[639] = -4001; 3368 r[639] = 876; 3369 q[640] = -2295; 3370 r[640] = -3392; 3371 q[641] = 1090; 3372 r[641] = -3948; 3373 q[642] = -3024; 3374 r[642] = 2762; 3375 q[643] = 2728; 3376 r[643] = -3054; 3377 q[644] = -3305; 3378 r[644] = 2419; 3379 q[645] = 60; 3380 r[645] = 4095; 3381 q[646] = 4048; 3382 r[646] = -620; 3383 q[647] = 589; 3384 r[647] = -4053; 3385 q[648] = -3867; 3386 r[648] = 1347; 3387 q[649] = -2944; 3388 r[649] = -2847; 3389 q[650] = -2721; 3390 r[650] = 3060; 3391 q[651] = 2928; 3392 r[651] = 2863; 3393 q[652] = 801; 3394 r[652] = 4016; 3395 q[653] = -3644; 3396 r[653] = 1870; 3397 q[654] = -1648; 3398 r[654] = -3749; 3399 q[655] = 825; 3400 r[655] = -4012; 3401 q[656] = -2036; 3402 r[656] = -3553; 3403 q[657] = -1192; 3404 r[657] = -3918; 3405 q[658] = 2875; 3406 r[658] = 2916; 3407 q[659] = -1831; 3408 r[659] = -3663; 3409 q[660] = -2865; 3410 r[660] = -2926; 3411 q[661] = -575; 3412 r[661] = -4055; 3413 q[662] = -3870; 3414 r[662] = 1340; 3415 q[663] = -4080; 3416 r[663] = -356; 3417 q[664] = -2176; 3418 r[664] = -3469; 3419 q[665] = -2986; 3420 r[665] = -2803; 3421 q[666] = 3978; 3422 r[666] = -972; 3423 q[667] = 2437; 3424 r[667] = 3291; 3425 q[668] = -3528; 3426 r[668] = 2080; 3427 q[669] = -3300; 3428 r[669] = -2425; 3429 q[670] = 3085; 3430 r[670] = 2693; 3431 q[671] = -3700; 3432 r[671] = -1756; 3433 q[672] = 3216; 3434 r[672] = -2535; 3435 q[673] = 4094; 3436 r[673] = -91; 3437 q[674] = 3775; 3438 r[674] = -1589; 3439 q[675] = 1097; 3440 r[675] = -3946; 3441 q[676] = -152; 3442 r[676] = -4093; 3443 q[677] = -3490; 3444 r[677] = 2142; 3445 q[678] = 3747; 3446 r[678] = 1654; 3447 q[679] = -1490; 3448 r[679] = -3815; 3449 q[680] = -3998; 3450 r[680] = -886; 3451 q[681] = 3726; 3452 r[681] = -1700; 3453 q[682] = -1600; 3454 r[682] = 3770; 3455 q[683] = -87; 3456 r[683] = 4095; 3457 q[684] = 2538; 3458 r[684] = -3214; 3459 q[685] = -4095; 3460 r[685] = 52; 3461 q[686] = -3993; 3462 r[686] = -910; 3463 q[687] = 4051; 3464 r[687] = 603; 3465 q[688] = -1242; 3466 r[688] = -3902; 3467 q[689] = 2155; 3468 r[689] = 3482; 3469 q[690] = 1270; 3470 r[690] = 3893; 3471 q[691] = 1919; 3472 r[691] = -3618; 3473 q[692] = -3145; 3474 r[692] = 2623; 3475 q[693] = 2475; 3476 r[693] = 3263; 3477 q[694] = 2226; 3478 r[694] = -3437; 3479 q[695] = -3894; 3480 r[695] = -1269; 3481 q[696] = -429; 3482 r[696] = 4073; 3483 q[697] = -1346; 3484 r[697] = 3868; 3485 q[698] = 1297; 3486 r[698] = 3885; 3487 q[699] = 1699; 3488 r[699] = 3726; 3489 q[700] = -3375; 3490 r[700] = 2319; 3491 q[701] = 1577; 3492 r[701] = -3779; 3493 q[702] = -63; 3494 r[702] = 4095; 3495 q[703] = 1215; 3496 r[703] = -3911; 3497 q[704] = -1492; 3498 r[704] = 3814; 3499 q[705] = -1530; 3500 r[705] = -3799; 3501 q[706] = 3442; 3502 r[706] = 2218; 3503 q[707] = -3867; 3504 r[707] = -1349; 3505 q[708] = -3291; 3506 r[708] = -2437; 3507 q[709] = -2253; 3508 r[709] = -3420; 3509 q[710] = -150; 3510 r[710] = -4093; 3511 q[711] = -2686; 3512 r[711] = -3092; 3513 q[712] = 3470; 3514 r[712] = 2175; 3515 q[713] = -3826; 3516 r[713] = -1461; 3517 q[714] = -3148; 3518 r[714] = 2619; 3519 q[715] = -3858; 3520 r[715] = 1375; 3521 q[716] = -3844; 3522 r[716] = -1412; 3523 q[717] = -3652; 3524 r[717] = 1854; 3525 q[718] = 4018; 3526 r[718] = -791; 3527 q[719] = 179; 3528 r[719] = -4092; 3529 q[720] = 3498; 3530 r[720] = 2129; 3531 q[721] = -1999; 3532 r[721] = -3574; 3533 q[722] = 3531; 3534 r[722] = 2075; 3535 q[723] = 4050; 3536 r[723] = -606; 3537 q[724] = -1639; 3538 r[724] = 3753; 3539 q[725] = -3661; 3540 r[725] = 1835; 3541 q[726] = 4039; 3542 r[726] = 679; 3543 q[727] = 3561; 3544 r[727] = 2023; 3545 q[728] = 528; 3546 r[728] = 4061; 3547 q[729] = -634; 3548 r[729] = -4046; 3549 q[730] = 364; 3550 r[730] = -4079; 3551 q[731] = 2735; 3552 r[731] = 3048; 3553 q[732] = 3978; 3554 r[732] = 973; 3555 q[733] = -4073; 3556 r[733] = -427; 3557 q[734] = -3722; 3558 r[734] = 1708; 3559 q[735] = 2356; 3560 r[735] = -3350; 3561 q[736] = -1125; 3562 r[736] = -3938; 3563 q[737] = 4054; 3564 r[737] = 580; 3565 q[738] = 3328; 3566 r[738] = -2387; 3567 q[739] = 1439; 3568 r[739] = -3834; 3569 q[740] = 1746; 3570 r[740] = 3705; 3571 q[741] = 2507; 3572 r[741] = 3238; 3573 q[742] = 3839; 3574 r[742] = -1427; 3575 q[743] = 488; 3576 r[743] = -4066; 3577 q[744] = 1187; 3578 r[744] = 3920; 3579 q[745] = 2038; 3580 r[745] = -3552; 3581 q[746] = -905; 3582 r[746] = -3994; 3583 q[747] = -236; 3584 r[747] = 4089; 3585 q[748] = 208; 3586 r[748] = -4090; 3587 q[749] = 1660; 3588 r[749] = 3744; 3589 q[750] = -4074; 3590 r[750] = -415; 3591 q[751] = -2304; 3592 r[751] = 3385; 3593 q[752] = -2457; 3594 r[752] = 3276; 3595 q[753] = 3302; 3596 r[753] = 2423; 3597 q[754] = 1778; 3598 r[754] = -3689; 3599 q[755] = 2019; 3600 r[755] = 3563; 3601 q[756] = 4037; 3602 r[756] = 687; 3603 q[757] = -2365; 3604 r[757] = 3343; 3605 q[758] = 5; 3606 r[758] = -4095; 3607 q[759] = 160; 3608 r[759] = -4092; 3609 3610 } /*initRand*/ 3611 3612 /** 3613 * initializes the MEL-2_LINEAR LOOKUP TABLE 3614 * @param sig_inObj : sig PU internal object of the sub-object 3615 * @return void 3616 * @remarks translated from matlab code to c-code 3617 * @callgraph 3618 * @callergraph 3619 * 3620 * input 3621 * - bilinTab : base address of bilinTable destination vector 3622 * - alpha : warping factor 3623 * - size : size of the vectors to be generated 3624 * - A,B : base address of array of indexes for lookup table implementation 3625 * - D : base address of delta array for lookup table implementation 3626 * 3627 * output 3628 * - bilinTab, A, B, D : initialized vectors 3629 */ 3630 void mel_2_lin_init(sig_innerobj_t *sig_inObj) 3631 { 3632 3633 /*Declare variables tied to I/O PARAMS formerly passed by value or reference*/ 3634 picoos_single alpha; 3635 picoos_int32 *D; 3636 picoos_int32 size; 3637 picoos_int16 *A; 3638 3639 /*Link local variables with sig data object*/ 3640 3641 alpha = sig_inObj->warp_p; 3642 size = (sig_inObj->hfftsize_p) + 1; 3643 A = sig_inObj->A_p; 3644 D = sig_inObj->d_p; 3645 /* 3646 fixed point interpolation tables 3647 scaling factor: 0x20 3648 corresponding bit shift: 5 3649 */ 3650 3651 A[0] = 0; 3652 D[0] = 0; 3653 A[1] = 2; 3654 D[1] = 14; 3655 A[2] = 4; 3656 D[2] = 29; 3657 A[3] = 7; 3658 D[3] = 11; 3659 A[4] = 9; 3660 D[4] = 24; 3661 A[5] = 12; 3662 D[5] = 5; 3663 A[6] = 14; 3664 D[6] = 18; 3665 A[7] = 16; 3666 D[7] = 30; 3667 A[8] = 19; 3668 D[8] = 9; 3669 A[9] = 21; 3670 D[9] = 19; 3671 A[10] = 23; 3672 D[10] = 29; 3673 A[11] = 26; 3674 D[11] = 5; 3675 A[12] = 28; 3676 D[12] = 12; 3677 A[13] = 30; 3678 D[13] = 19; 3679 A[14] = 32; 3680 D[14] = 24; 3681 A[15] = 34; 3682 D[15] = 27; 3683 A[16] = 36; 3684 D[16] = 30; 3685 A[17] = 38; 3686 D[17] = 31; 3687 A[18] = 40; 3688 D[18] = 31; 3689 A[19] = 42; 3690 D[19] = 29; 3691 A[20] = 44; 3692 D[20] = 26; 3693 A[21] = 46; 3694 D[21] = 22; 3695 A[22] = 48; 3696 D[22] = 17; 3697 A[23] = 50; 3698 D[23] = 10; 3699 A[24] = 52; 3700 D[24] = 2; 3701 A[25] = 53; 3702 D[25] = 24; 3703 A[26] = 55; 3704 D[26] = 13; 3705 A[27] = 57; 3706 D[27] = 1; 3707 A[28] = 58; 3708 D[28] = 20; 3709 A[29] = 60; 3710 D[29] = 5; 3711 A[30] = 61; 3712 D[30] = 21; 3713 A[31] = 63; 3714 D[31] = 4; 3715 A[32] = 64; 3716 D[32] = 18; 3717 A[33] = 65; 3718 D[33] = 31; 3719 A[34] = 67; 3720 D[34] = 11; 3721 A[35] = 68; 3722 D[35] = 21; 3723 A[36] = 69; 3724 D[36] = 31; 3725 A[37] = 71; 3726 D[37] = 7; 3727 A[38] = 72; 3728 D[38] = 14; 3729 A[39] = 73; 3730 D[39] = 21; 3731 A[40] = 74; 3732 D[40] = 27; 3733 A[41] = 75; 3734 D[41] = 31; 3735 A[42] = 77; 3736 D[42] = 3; 3737 A[43] = 78; 3738 D[43] = 6; 3739 A[44] = 79; 3740 D[44] = 8; 3741 A[45] = 80; 3742 D[45] = 10; 3743 A[46] = 81; 3744 D[46] = 10; 3745 A[47] = 82; 3746 D[47] = 10; 3747 A[48] = 83; 3748 D[48] = 9; 3749 A[49] = 84; 3750 D[49] = 8; 3751 A[50] = 85; 3752 D[50] = 6; 3753 A[51] = 86; 3754 D[51] = 3; 3755 A[52] = 86; 3756 D[52] = 31; 3757 A[53] = 87; 3758 D[53] = 27; 3759 A[54] = 88; 3760 D[54] = 23; 3761 A[55] = 89; 3762 D[55] = 18; 3763 A[56] = 90; 3764 D[56] = 12; 3765 A[57] = 91; 3766 D[57] = 6; 3767 A[58] = 91; 3768 D[58] = 31; 3769 A[59] = 92; 3770 D[59] = 24; 3771 A[60] = 93; 3772 D[60] = 16; 3773 A[61] = 94; 3774 D[61] = 8; 3775 A[62] = 94; 3776 D[62] = 31; 3777 A[63] = 95; 3778 D[63] = 22; 3779 A[64] = 96; 3780 D[64] = 13; 3781 A[65] = 97; 3782 D[65] = 3; 3783 A[66] = 97; 3784 D[66] = 25; 3785 A[67] = 98; 3786 D[67] = 14; 3787 A[68] = 99; 3788 D[68] = 3; 3789 A[69] = 99; 3790 D[69] = 24; 3791 A[70] = 100; 3792 D[70] = 13; 3793 A[71] = 101; 3794 D[71] = 1; 3795 A[72] = 101; 3796 D[72] = 21; 3797 A[73] = 102; 3798 D[73] = 8; 3799 A[74] = 102; 3800 D[74] = 27; 3801 A[75] = 103; 3802 D[75] = 14; 3803 A[76] = 104; 3804 D[76] = 1; 3805 A[77] = 104; 3806 D[77] = 19; 3807 A[78] = 105; 3808 D[78] = 6; 3809 A[79] = 105; 3810 D[79] = 24; 3811 A[80] = 106; 3812 D[80] = 9; 3813 A[81] = 106; 3814 D[81] = 27; 3815 A[82] = 107; 3816 D[82] = 12; 3817 A[83] = 107; 3818 D[83] = 29; 3819 A[84] = 108; 3820 D[84] = 14; 3821 A[85] = 108; 3822 D[85] = 31; 3823 A[86] = 109; 3824 D[86] = 15; 3825 A[87] = 109; 3826 D[87] = 31; 3827 A[88] = 110; 3828 D[88] = 16; 3829 A[89] = 110; 3830 D[89] = 31; 3831 A[90] = 111; 3832 D[90] = 15; 3833 A[91] = 111; 3834 D[91] = 31; 3835 A[92] = 112; 3836 D[92] = 14; 3837 A[93] = 112; 3838 D[93] = 30; 3839 A[94] = 113; 3840 D[94] = 13; 3841 A[95] = 113; 3842 D[95] = 28; 3843 A[96] = 114; 3844 D[96] = 11; 3845 A[97] = 114; 3846 D[97] = 26; 3847 A[98] = 115; 3848 D[98] = 9; 3849 A[99] = 115; 3850 D[99] = 23; 3851 A[100] = 116; 3852 D[100] = 6; 3853 A[101] = 116; 3854 D[101] = 20; 3855 A[102] = 117; 3856 D[102] = 2; 3857 A[103] = 117; 3858 D[103] = 16; 3859 A[104] = 117; 3860 D[104] = 31; 3861 A[105] = 118; 3862 D[105] = 13; 3863 A[106] = 118; 3864 D[106] = 27; 3865 A[107] = 119; 3866 D[107] = 8; 3867 A[108] = 119; 3868 D[108] = 22; 3869 A[109] = 120; 3870 D[109] = 4; 3871 A[110] = 120; 3872 D[110] = 17; 3873 A[111] = 120; 3874 D[111] = 31; 3875 A[112] = 121; 3876 D[112] = 13; 3877 A[113] = 121; 3878 D[113] = 26; 3879 A[114] = 122; 3880 D[114] = 8; 3881 A[115] = 122; 3882 D[115] = 21; 3883 A[116] = 123; 3884 D[116] = 2; 3885 A[117] = 123; 3886 D[117] = 15; 3887 A[118] = 123; 3888 D[118] = 29; 3889 A[119] = 124; 3890 D[119] = 10; 3891 A[120] = 124; 3892 D[120] = 23; 3893 A[121] = 125; 3894 D[121] = 4; 3895 A[122] = 125; 3896 D[122] = 17; 3897 A[123] = 125; 3898 D[123] = 31; 3899 A[124] = 126; 3900 D[124] = 12; 3901 A[125] = 126; 3902 D[125] = 25; 3903 A[126] = 127; 3904 D[126] = 6; 3905 A[127] = 127; 3906 D[127] = 19; 3907 A[128] = 128; 3908 D[128] = 0; 3909 3910 }/*mel_2_lin_init*/ 3911 3912 /** 3913 * function to be documented 3914 * @param ang : ?? 3915 * @param table : ?? 3916 * @param cs : ?? 3917 * @param sn : ?? 3918 * @return void 3919 * @callgraph 3920 * @callergraph 3921 */ 3922 static void get_trig(picoos_int32 ang, picoos_int32 *table, picoos_int32 *cs, 3923 picoos_int32 *sn) 3924 { 3925 picoos_int32 i, j, k; 3926 3927 i = k = ang >> PICODSP_PI_SHIFT; /* * PICODSP_COS_TABLE_LEN2/PICODSP_FIX_SCALE2 */ 3928 if (i < 0) 3929 i = -i; 3930 j = 1; 3931 i &= (PICODSP_COS_TABLE_LEN4 - 1); 3932 if (i > PICODSP_COS_TABLE_LEN2) 3933 i = PICODSP_COS_TABLE_LEN4 - i; 3934 if (i > PICODSP_COS_TABLE_LEN) { 3935 j = -1; 3936 i = PICODSP_COS_TABLE_LEN2 - i; 3937 } 3938 if (j == 1) 3939 *cs = table[i]; 3940 else 3941 *cs = -table[i]; 3942 3943 i = k - PICODSP_COS_TABLE_LEN; 3944 if (i < 0) 3945 i = -i; 3946 j = 1; 3947 i &= (PICODSP_COS_TABLE_LEN4 - 1); 3948 if (i > PICODSP_COS_TABLE_LEN2) 3949 i = PICODSP_COS_TABLE_LEN4 - i; 3950 if (i > PICODSP_COS_TABLE_LEN) { 3951 j = -1; 3952 i = PICODSP_COS_TABLE_LEN2 - i; 3953 } 3954 if (j == 1) 3955 *sn = table[i]; 3956 else 3957 *sn = -table[i]; 3958 }/*get_trig*/ 3959 3960 /** 3961 * function to be documented 3962 * @param sig_inObj : sig PU internal object of the sub-object 3963 * @return void 3964 * @callgraph 3965 * @callergraph 3966 */ 3967 void save_transition_frame(sig_innerobj_t *sig_inObj) 3968 { 3969 picoos_int32 *tmp, *tmp2; /*for loop unrolling*/ 3970 3971 if (sig_inObj->voiced_p != sig_inObj->prevVoiced_p) { 3972 sig_inObj->VoicTrans = sig_inObj->prevVoiced_p; /*remember last voicing transition*/ 3973 tmp = sig_inObj->ImpResp_p; 3974 tmp2 = sig_inObj->imp_p; 3975 FAST_DEVICE(PICODSP_FFTSIZE,*(tmp++)=*(tmp2++);); 3976 if (sig_inObj->voiced_p == 1) 3977 sig_inObj->nV = 0; 3978 else 3979 sig_inObj->nU = 0; /*to avoid problems in case of very short voiced or unvoiced parts (less than 4 frames long)*/ 3980 } 3981 }/*save_transition_frame*/ 3982 3983 /** 3984 * calculates an unweighted excitation window 3985 * @param sig_inObj : sig PU internal object of the sub-object 3986 * @param nextPeak : position of next peak (excitation position) 3987 * @return PICO_OK 3988 * @callgraph 3989 * @callergraph 3990 * input 3991 * - hop : hop size in samples 3992 * - winlen : excitation window length 3993 * - E : energy 3994 * - F0 : pitch 3995 * - nextPeak : state that remembers next excitation index 3996 * - Fs - sampling frequency 3997 * output 3998 * - LocV, LocU : (MAX_EN size) location of excitation points 3999 * - EnV, EnU : (MAX_EN size) RMS values of excitation (scaled) 4000 * - nV, nU : (integers) number of excitation points 4001 * - nextPeak new position of lastPeak to calculate next frame 4002 */ 4003 static void get_simple_excitation(sig_innerobj_t *sig_inObj, 4004 picoos_int16 *nextPeak) 4005 { 4006 /*Define local variables*/ 4007 picoos_int16 nI, nJ, k; 4008 /* picoos_single InvSqrt3=(picoos_single)2/(picoos_single)sqrt(3.0); *//*constant*/ 4009 picoos_int32 Ti, sqrtTi; 4010 picoos_int16 hop, winlen, Fs; 4011 picoos_single E, F0; 4012 picoos_int16 voiced; 4013 picoos_single fact; /*normalization factor*/ 4014 picoos_single rounding = 0.5f; 4015 4016 /*Link local variables to sig object*/ 4017 hop = sig_inObj->hop_p; 4018 winlen = sig_inObj->m2_p; 4019 Fs = sig_inObj->Fs_p; 4020 E = sig_inObj->E_p; 4021 F0 = sig_inObj->F0_p; 4022 voiced = sig_inObj->voiced_p; 4023 4024 E = (E > 5) ? 9 : (E > 1) ? 2 * E - 1 : E; 4025 4026 4027 /* shift previous excitation window by hop samples*/ 4028 for (nI = 0; nI < sig_inObj->nV; nI++) { 4029 sig_inObj->LocV[nI] = sig_inObj->LocV[nI] - hop; 4030 } 4031 for (nI = 0; nI < sig_inObj->nU; nI++) { 4032 sig_inObj->LocU[nI] = sig_inObj->LocU[nI] - hop; 4033 } 4034 4035 /*get rid of the voiced points that fall out of the interval*/ 4036 nI = 0; 4037 while ((sig_inObj->LocV[nI] < 0) && nI < sig_inObj->nV) 4038 nI++; 4039 4040 for (nJ = nI; nJ < sig_inObj->nV; nJ++) { 4041 sig_inObj->LocV[nJ - nI] = sig_inObj->LocV[nJ]; 4042 sig_inObj->EnV[nJ - nI] = sig_inObj->EnV[nJ]; 4043 } 4044 sig_inObj->nV -= nI; 4045 /*get rid of the unvoiced points that fall out of the interval */ 4046 nI = 0; 4047 while ((sig_inObj->LocU[nI] < 0) && nI < sig_inObj->nU) 4048 nI++; 4049 4050 for (nJ = nI; nJ < sig_inObj->nU; nJ++) { 4051 sig_inObj->LocU[nJ - nI] = sig_inObj->LocU[nJ]; 4052 sig_inObj->EnU[nJ - nI] = sig_inObj->EnU[nJ]; 4053 } 4054 sig_inObj->nU -= nI; 4055 4056 *nextPeak -= hop; 4057 k = *nextPeak; 4058 4059 fact = 3; 4060 if (voiced == 0) { /*Unvoiced*/ 4061 4062 Ti = (picoos_int32) (rounding + (picoos_single) Fs 4063 / (picoos_single) sig_inObj->Fuv_p); /* round Period*/ 4064 sqrtTi = (picoos_int32) (E * sqrt((double) Fs 4065 / (hop * sig_inObj->Fuv_p)) * fact * PICODSP_GETEXC_K1); 4066 while (k < winlen) { 4067 if (k < winlen) { 4068 sig_inObj->LocU[sig_inObj->nU] = k; 4069 sig_inObj->EnU[sig_inObj->nU] = sqrtTi; 4070 sig_inObj->nU++; 4071 k += (picoos_int16) Ti; 4072 } 4073 } 4074 } else { /*Voiced*/ 4075 Ti 4076 = (picoos_int32) (rounding + (picoos_single) Fs 4077 / (picoos_single) F0); /*Period*/ 4078 sqrtTi = (picoos_int32) (E 4079 * sqrt((double) Fs / (hop * sig_inObj->F0_p)) * fact 4080 * PICODSP_GETEXC_K1); 4081 while (k < winlen) { 4082 sig_inObj->LocV[sig_inObj->nV] = k; 4083 sig_inObj->EnV[sig_inObj->nV] = sqrtTi; 4084 sig_inObj->nV++; 4085 k += (picoos_int16) Ti; 4086 } 4087 } 4088 *nextPeak = k; 4089 4090 }/*get_simple_excitation*/ 4091 4092 #ifdef __cplusplus 4093 } 4094 #endif 4095 4096 /* end picosig2.c */ 4097