melp_syn.c
上传用户:csczyc
上传日期:2021-02-19
资源大小:1051k
文件大小:23k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2. 2.4 kbps MELP Proposed Federal Standard speech coder
  3. Fixed-point C code, version 1.0
  4. Copyright (c) 1998, Texas Instruments, Inc.  
  5. Texas Instruments has intellectual property rights on the MELP
  6. algorithm.  The Texas Instruments contact for licensing issues for
  7. commercial and non-government use is William Gordon, Director,
  8. Government Contracts, Texas Instruments Incorporated, Semiconductor
  9. Group (phone 972 480 7442).
  10. The fixed-point version of the voice codec Mixed Excitation Linear
  11. Prediction (MELP) is based on specifications on the C-language software
  12. simulation contained in GSM 06.06 which is protected by copyright and
  13. is the property of the European Telecommunications Standards Institute
  14. (ETSI). This standard is available from the ETSI publication office
  15. tel. +33 (0)4 92 94 42 58. ETSI has granted a license to United States
  16. Department of Defense to use the C-language software simulation contained
  17. in GSM 06.06 for the purposes of the development of a fixed-point
  18. version of the voice codec Mixed Excitation Linear Prediction (MELP).
  19. Requests for authorization to make other use of the GSM 06.06 or
  20. otherwise distribute or modify them need to be addressed to the ETSI
  21. Secretariat fax: +33 493 65 47 16.
  22. */
  23. /*
  24.     Name: melp_syn.c
  25.     Description: MELP synthesis
  26.       This program takes the new parameters for a speech
  27.       frame and synthesizes the output speech.  It keeps
  28.       an internal record of the previous frame parameters
  29.       to use for interpolation.
  30.     Inputs:
  31.       *par - MELP parameter structure
  32.     Outputs: 
  33.       speech[] - output speech signal
  34.     Returns: void
  35. */
  36. /* compiler include files */
  37.  
  38. #include <stdio.h>
  39. #include <math.h>
  40. #include "mathhalf.h"
  41. #include "melp.h"
  42. #include "spbstd.h"
  43. #include "lpc.h"
  44. #include "mat.h"
  45. #include "vq.h"
  46. #include "fs.h"
  47. #include "math_lib.h"
  48. #include "constant.h"
  49. #include "wmops.h"
  50. /* compiler constants */
  51. #define ORIGINAL_SYNTH_GAIN 0
  52.  
  53. #if (MIX_ORD > DISP_ORD)
  54. #define BEGIN MIX_ORD
  55. #else
  56. #define BEGIN DISP_ORD
  57. #endif
  58. #define TILT_ORD 1
  59. #if (ORIGINAL_SYNTH_GAIN)
  60. #define SYN_GAIN_Q4 16000     /* (1000.0*(1<<4)) */
  61. #else
  62. #define SYN_GAIN_Q4 32000     /* (2000.0*(1<<4)) */
  63. #endif
  64. #define SCALEOVER    10
  65. #define INV_SCALEOVER_Q18  26214    /* ((1.0/SCALEOVER)*(1<<18)) */
  66. #define PDEL SCALEOVER
  67. /* external memory references */
  68.  
  69. extern Shortword bp_cof[NUM_BANDS][MIX_ORD+1];
  70. extern Shortword disp_cof[DISP_ORD+1];
  71. extern Shortword msvq_cb[];
  72. extern Shortword msvq_cb_mean[];
  73. extern Shortword fsvq_cb[];
  74. extern Shortword fsvq_weighted;
  75. extern FILE *fp_indat, *fp_outdat;
  76. /* temporary memory */
  77. static Shortword sigbuf[BEGIN+PITCHMAX];
  78. static Shortword sig2[BEGIN+PITCHMAX];
  79. static Shortword fs_real[PITCHMAX];
  80. static Shortword sp_out[BEGIN+FRAME];
  81. /* permanent memory */
  82.  
  83. static Shortword firstcall = 1; /* Just used for noise gain init */
  84. static Shortword prev_gain_err;    
  85. static Shortword sigsave[PITCHMAX];
  86. static struct melp_param prev_par;
  87. static Shortword syn_begin;
  88. static Shortword prev_scale;
  89. static Shortword noise_gain = (Shortword)MIN_NOISE_Q8;
  90. static Shortword pulse_del[MIX_ORD],noise_del[MIX_ORD];
  91. static Shortword lpc_del[LPC_ORD],ase_del[LPC_ORD],tilt_del[TILT_ORD];
  92. static Shortword disp_del[DISP_ORD];
  93. static Shortword prev_lpc_gain;
  94. static struct msvq_param vq_par;  /* MSVQ parameters */
  95. static struct msvq_param fs_vq_par;  /* Fourier series VQ parameters */
  96. static Shortword w_fs_inv[NUM_HARM];
  97. /* these can be saved or recomputed */
  98. static Shortword prev_pcof[MIX_ORD+1],prev_ncof[MIX_ORD+1];
  99. static Shortword prev_tilt;
  100. //static Shortword prev_gain;   
  101. /*static Shortword frame=0;*/
  102. void melp_syn(struct melp_param *par,Shortword speech_out[])
  103. {
  104.     Shortword i, gaincnt;
  105.     Shortword erase;
  106.     Shortword length;
  107.     Shortword intfact, intfact1, ifact, ifact_gain;
  108.     Shortword gain,pulse_gain,pitch,jitter;
  109.     Shortword curr_tilt,tilt_cof[TILT_ORD+1];
  110.     Shortword sig_prob,syn_gain,lpc_gain;
  111.     Shortword lsf[LPC_ORD+1];
  112.     Shortword lpc[LPC_ORD+1];
  113.     Shortword ase_num[LPC_ORD+1],ase_den[LPC_ORD+1];
  114.     Shortword curr_pcof[MIX_ORD+1],curr_ncof[MIX_ORD+1];
  115.     Shortword pulse_cof[MIX_ORD+1],noise_cof[MIX_ORD+1];
  116.     Shortword temp1,temp2;
  117.     Longword L_temp1,L_temp2;
  118. Longword L_temp3,L_temp4;
  119. Shortword swRnd;
  120.     
  121.     /* Copy previous period of processed speech to output array */
  122.     if (syn_begin > 0) {
  123. if (syn_begin > FRAME) {
  124.     v_equ(&sp_out[BEGIN],&sigsave[0],FRAME);
  125.     /* past end: save remainder in sigsave[0] */
  126.     v_equ(&sigsave[0],&sigsave[FRAME],(Shortword)(syn_begin-FRAME));
  127. }
  128. else 
  129.   v_equ(&sp_out[BEGIN],&sigsave[0],syn_begin);
  130.     }
  131.     
  132.     erase = 0; /* no erasures yet */
  133.     
  134.     /* Update MSVQ information */
  135.     par->msvq_stages = vq_par.num_stages;
  136.     par->msvq_bits = vq_par.num_bits;
  137.     par->msvq_levels = vq_par.num_levels;
  138.     par->msvq_index = vq_par.indices;
  139.     par->fsvq_index = fs_vq_par.indices;
  140.     
  141.     /* Read and decode channel input buffer */
  142.     erase = melp_chn_read(par,&prev_par);
  143.     if (par->uv_flag != 1 && !erase) { 
  144. /* Un-weight Fourier magnitudes */
  145. window_Q(&par->fs_mag[0],w_fs_inv,&par->fs_mag[0],NUM_HARM,14);
  146.     }
  147.     /* Update adaptive noise level estimate based on last gain */
  148.     if (firstcall) {
  149. firstcall = 0;
  150. noise_gain = par->gain[NUM_GAINFR-1];   /* noise_gain in Q8 */
  151.     }
  152.     
  153.     else if (!erase) {
  154. for (i = 0; i < NUM_GAINFR; i++) {
  155.     noise_est(par->gain[i],&noise_gain,(Shortword)UPCONST_Q19,
  156.       (Shortword)DOWNCONST_Q17,(Shortword)MIN_NOISE_Q8,
  157.       (Shortword)MAX_NOISE_Q8);
  158.     /* Adjust gain based on noise level (noise suppression) */
  159.     noise_sup(&par->gain[i],noise_gain,(Shortword)MAX_NS_SUP_Q8,
  160.       (Shortword)MAX_NS_ATT_Q8,(Shortword)NFACT_Q8);
  161. }
  162.     
  163.     }
  164.     
  165.     /* Clamp LSP bandwidths to avoid sharp LPC filters */
  166.     lpc_clamp(par->lsf,BWMIN_Q15,LPC_ORD);
  167.     
  168.     /* Calculate spectral tilt for current frame for spectral enhancement */
  169.     tilt_cof[0] = ONE_Q15;        /* tilt_cof in Q15 */
  170.     lpc_lsp2pred(par->lsf,lpc,LPC_ORD);
  171. #if (!ORIGINAL_SYNTH_GAIN)
  172.     /* Use LPC prediction gain for adaptive scaling */
  173.     /* lpc_gain = sqrt(lpc_pred2refl(lpc,sig2,LPC_ORD));*/
  174.     lpc_gain = lpc_pred2refl(lpc,sig2,LPC_ORD);
  175.     lpc_gain = sqrt_fxp(lpc_gain,15);     /* lpc_gain in Q15 */
  176. #else
  177.     /* Original synthesis scaling */
  178.     lpc_pred2refl(lpc,sig2,LPC_ORD);
  179.     lpc_gain = ONE_Q15;
  180. #endif
  181.     if (sig2[1] < 0)
  182.       curr_tilt = shr_a(sig2[1],1);    /* curr_tilt in Q15 */
  183.     else
  184.       curr_tilt = 0;
  185.    
  186.     /* Disable pitch interpolation for high-pitched onsets */
  187.     /* if (par->pitch < 0.5*prev_par.pitch && 
  188.            par->gain[0] > 6.0 + prev_par.gain[NUM_GAINFR-1]) { */
  189.     temp1 = shr_a(prev_par.pitch,1);
  190.     temp2 = (Shortword)SIX_Q8 + prev_par.gain[NUM_GAINFR-1];
  191. //    compare_nonzero();    compare_nonzero();mark del
  192.     if ((par->pitch < temp1) && (par->gain[0] > temp2)) {
  193. /* copy current pitch into previous */
  194. prev_par.pitch = par->pitch;
  195.     }
  196.     
  197.     /* Set pulse and noise coefficients based on voicing strengths */
  198.     v_zap(curr_pcof,MIX_ORD+1);    /* curr_pcof in Q14 */
  199.     v_zap(curr_ncof,MIX_ORD+1);    /* curr_ncof in Q14 */
  200.     for (i = 0; i < NUM_BANDS; i++) {
  201. if (par->bpvc[i] > X05_Q14)
  202.     v_add(curr_pcof,&bp_cof[i][0],MIX_ORD+1);    /* bp_cof in Q14 */
  203. else
  204.     v_add(curr_ncof,&bp_cof[i][0],MIX_ORD+1);
  205.     }
  206.     /* Process each pitch period */
  207.     
  208.     while (syn_begin < FRAME) {
  209. /* interpolate previous and current parameters */
  210. ifact = divide_s(syn_begin,FRAME);    /* ifact in Q15 */
  211. if (syn_begin >= GAINFR) {
  212.     gaincnt = 2;
  213.     temp1 = sub(syn_begin,GAINFR);
  214.     ifact_gain = divide_s(temp1,GAINFR);
  215. }
  216. else {
  217.     gaincnt = 1;
  218.     ifact_gain = divide_s(syn_begin,GAINFR);
  219. }
  220. /* interpolate gain */
  221. if (gaincnt > 1) {
  222.   /* gain = ifact_gain*par->gain[gaincnt-1] + 
  223.             (1.0-ifact_gain)*par->gain[gaincnt-2]; */
  224. /*   L_temp1 = L_mult(par->gain[gaincnt-1],ifact_gain);             */
  225. /*    temp1 = sub(ONE_Q15,ifact_gain);                                  */
  226. /*    L_temp2 = L_mult(par->gain[gaincnt-2],temp1);                     */
  227. /*    gain = extract_h(L_add(L_temp1,L_temp2));      gain in Q8     */
  228.        L_temp1 = _smpy(par->gain[gaincnt-1],ifact_gain);
  229.        temp1 = sub(ONE_Q15,ifact_gain);
  230.    L_temp2 = _smpy(par->gain[gaincnt-2],temp1);
  231.    L_temp3 = _sadd(L_temp1,L_temp2);
  232.    gain = (Shortword) (0x0000ffffL & (L_temp3 >> 16));
  233. }
  234. else {
  235.   /* gain = ifact_gain*par->gain[gaincnt-1] + 
  236.     (1.0-ifact_gain)*prev_par.gain[NUM_GAINFR-1]; */
  237.   /* L_temp1 = L_mult(par->gain[gaincnt-1],ifact_gain);             */
  238. /*    temp1 = sub(ONE_Q15,ifact_gain);                                  */
  239. /*    L_temp2 = L_mult(prev_par.gain[NUM_GAINFR-1],temp1);              */
  240. /*    gain = extract_h(L_add(L_temp1,L_temp2));      gain in Q8     */
  241.       L_temp1 = _smpy(par->gain[gaincnt-1],ifact_gain);
  242.       temp1 = sub(ONE_Q15,ifact_gain);
  243.   L_temp2 = _smpy(prev_par.gain[NUM_GAINFR-1],temp1);
  244.   L_temp3 = _sadd(L_temp1,L_temp2);
  245.   gain =  (Shortword) (0x0000ffffL & (L_temp3 >> 16));
  246. }
  247. /* Set overall interpolation path based on gain change */
  248. temp1 = sub(par->gain[NUM_GAINFR-1],prev_par.gain[NUM_GAINFR-1]);
  249. // compare_nonzero();mark del
  250. if (abs_s(temp1) > SIX_Q8) {
  251.   /* Power surge: use gain adjusted interpolation */
  252.   /* intfact = (gain - prev_par.gain[NUM_GAINFR-1]) / temp; */
  253.   temp2 = sub(gain,prev_par.gain[NUM_GAINFR-1]);
  254.   if (((temp2 > 0) && (temp1 < 0)) || ((temp2 < 0) && (temp1 > 0)))
  255.     intfact = 0;
  256.   else {
  257.     /* temp1 = abs_s(temp1); */
  258. /*      temp2 = abs_s(temp2);  */
  259.         L_temp3 = _abs2((Longword)temp1);
  260. temp1 = (Shortword) (0x0000ffffL & L_temp3);
  261. L_temp3 = _abs2((Longword)temp2);
  262. temp2 = (Shortword) (0x0000ffffL & L_temp3);
  263.     if (temp2 >= temp1)
  264.       intfact = ONE_Q15;
  265.     else
  266.       intfact = divide_s(temp2,temp1);    /* intfact in Q15 */
  267.   }
  268. }
  269. else
  270.   /* Otherwise, linear interpolation */
  271.   intfact = ifact;
  272. /* interpolate LSF's and convert to LPC filter */
  273. interp_array(prev_par.lsf,par->lsf,lsf,intfact,LPC_ORD+1);
  274. lpc_lsp2pred(lsf,lpc,LPC_ORD);
  275. /* Check signal probability for adaptive spectral enhancement filter */
  276. /*  temp1 = add(noise_gain,(Shortword)X12_Q8);    */
  277. /*  temp2 = add(noise_gain,(Shortword)X30_Q8);   */
  278.     L_temp3 = _sadd2((Longword)noise_gain,(Longword)X12_Q8);
  279. temp1 = (Shortword) (0x0000ffffL & L_temp3);
  280. L_temp4 = _sadd2((Longword)noise_gain,(Longword)X30_Q8);
  281. temp2 = (Shortword) (0x0000ffffL & L_temp4);
  282. /* sig_prob in Q15 */
  283. sig_prob = lin_int_bnd(gain,temp1,temp2,0,ONE_Q15);
  284. /* Calculate adaptive spectral enhancement filter coefficients */
  285. ase_num[0] = ONE_Q12;    /* ase_num and ase_den in Q12 */
  286. /* temp1 = mult(sig_prob,(Shortword)ASE_NUM_BW_Q15); */
  287.     L_temp3 = _smpy(sig_prob,(Shortword)ASE_NUM_BW_Q15);
  288. temp1 = (Shortword) (0x0000ffffL & (L_temp3 >> 16));
  289. lpc_bw_expand(lpc,ase_num,temp1,LPC_ORD);
  290. /*  temp1 = mult(sig_prob,(Shortword)ASE_DEN_BW_Q15);  */
  291.     L_temp4 = _smpy(sig_prob,(Shortword)ASE_DEN_BW_Q15);
  292. temp1 = (Shortword) (0x0000ffffL & (L_temp4 >> 16));
  293. lpc_bw_expand(lpc,ase_den,temp1,LPC_ORD);
  294. /* tilt_cof[1] = sig_prob*(intfact*curr_tilt + 
  295. (1.0-intfact)*prev_tilt); */
  296. /* temp1 = mult(curr_tilt,intfact);                             */
  297. /*  intfact1 = sub(ONE_Q15,intfact);                                */
  298. /*  temp2 = mult(prev_tilt,intfact1);                               */
  299. /*  temp1 = add(temp1,temp2);                                       */
  300. /*  tilt_cof[1] = mult(sig_prob,temp1);     tilt_cof in Q15     */
  301.     L_temp3 = _smpy(curr_tilt,intfact);
  302. temp1 = (Shortword) (0x0000ffffL & (L_temp3 >> 16));
  303.     intfact1 = sub(ONE_Q15,intfact);
  304. L_temp4 = _smpy(prev_tilt,intfact1);
  305. temp2 = (Shortword) (0x0000ffffL & (L_temp4 >> 16));
  306. L_temp3 = _sadd2((Longword)temp1,(Longword)temp2);
  307. temp1 = (Shortword) (0x0000ffffL & L_temp3);
  308. L_temp4 = _smpy(sig_prob,temp1);
  309.     tilt_cof[1] = (Shortword) (0x0000ffffL & (L_temp4 >> 16));
  310. /* interpolate pitch and pulse gain */
  311. /* syn_gain = SYN_GAIN*(intfact*lpc_gain + 
  312.               (1.0-intfact)*prev_lpc_gain); */
  313. /* temp1 = mult(lpc_gain,intfact);       lpc_gain in Q15              */
  314. /*  temp2 = mult(prev_lpc_gain,intfact1);                                     */
  315. /*  temp1 = add(temp1,temp2);       temp1 in Q15                          */
  316. /*  syn_gain = mult((Shortword)SYN_GAIN_Q4,temp1);     syn_gain in Q4    */
  317.     L_temp3 = _smpy(lpc_gain,intfact);
  318. temp1 = (Shortword) (0x0000ffffL & (L_temp3 >> 16));
  319. L_temp4 = _smpy(prev_lpc_gain,intfact1);
  320.     temp2 =  (Shortword) (0x0000ffffL & (L_temp4 >> 16));
  321. L_temp3 = _sadd2((Longword)temp1,(Longword)temp2);
  322. temp1 = (Shortword) (0x0000ffffL & L_temp3);
  323. L_temp4 = _smpy((Shortword)SYN_GAIN_Q4,temp1);
  324.     syn_gain = (Shortword) (0x0000ffffL & (L_temp4 >> 16));
  325. /* pitch = intfact*par->pitch + (1.0-intfact)*prev_par.pitch; */
  326. /*  temp1 = mult(par->pitch,intfact);                 */
  327. /*  temp2 = mult(prev_par.pitch,intfact1);            */
  328. /*  pitch = add(temp1,temp2);     pitch in Q7    */
  329.     L_temp3 = _smpy(par->pitch,intfact);
  330. temp1 = (Shortword) (0x0000ffffL & (L_temp3 >> 16));
  331. L_temp4 = _smpy(prev_par.pitch,intfact1);
  332.     temp2 =  (Shortword) (0x0000ffffL & (L_temp4 >> 16));
  333. L_temp3 = _sadd2((Longword)temp1,(Longword)temp2);
  334. pitch =  (Shortword) (0x0000ffffL & L_temp3);
  335. /* pulse_gain = syn_gain*sqrt(pitch); */
  336. temp1 = sqrt_fxp(pitch,7);
  337. /*  L_temp1 = L_mult(syn_gain,temp1);                            */
  338. /*  L_temp1 = L_shl(L_temp1,4);                                  */
  339. /*  pulse_gain = extract_h(L_temp1);    pulse_gain in Q0   */
  340.     L_temp1 = _smpy(syn_gain,temp1);
  341. L_temp1 = _sshl(L_temp1,4);
  342.     pulse_gain = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  343. /* interpolate pulse and noise coefficients */
  344. temp1 = sqrt_fxp(ifact,15);
  345. interp_array(prev_pcof,curr_pcof,pulse_cof,temp1,MIX_ORD+1);
  346. interp_array(prev_ncof,curr_ncof,noise_cof,temp1,MIX_ORD+1);
  347. /* interpolate jitter */
  348. /* jitter = ifact*par->jitter + (1.0-ifact)*prev_par.jitter; */
  349. /*  temp1 = mult(par->jitter,ifact);     */
  350. /*  temp2 = sub(ONE_Q15,ifact);          */
  351. /*  temp2 = mult(prev_par.jitter,temp2); */
  352. /*  jitter = add(temp1,temp2);          */
  353.     L_temp3 = _smpy(par->jitter,ifact);
  354.     temp1 = (Shortword) (0x0000ffffL & (L_temp3 >> 16));
  355.     temp2 = sub(ONE_Q15,ifact);
  356. L_temp4 = _smpy(prev_par.jitter,temp2);
  357. temp2 = (Shortword) (0x0000ffffL & (L_temp4 >> 16));
  358. L_temp3 = _sadd2((Longword)temp1,(Longword)temp2);
  359. jitter = (Shortword) (0x0000ffffL & L_temp3);
  360. /* scale gain by 0.05 but keep gain in log */
  361. /* gain = pow(10.0,0.05*gain); */
  362. /* gain = mult((Shortword)X005_Q19,gain);       gain in Q12  */
  363. L_temp3 = _smpy((Shortword)X005_Q19,gain);
  364. gain = (Shortword) (0x0000ffffL & (L_temp3 >> 16));
  365. /* Set period length based on pitch and jitter */
  366. rand_num(&temp1,ONE_Q15,1);
  367. /* length = pitch * (1.0-jitter*temp) + 0.5; */
  368. /*  temp1 = mult(jitter,temp1);                          */
  369. /*  temp1 = shr(temp1,1);            temp1 in Q14    */
  370. /*  temp1 = sub(ONE_Q14,temp1);                          */
  371. /*  temp1 = mult(pitch,temp1);      length in Q6   */
  372.     L_temp3 = _smpy(jitter,temp1);
  373. L_temp3 = _shr2(L_temp3,1);
  374. temp1 = (Shortword) (0x0000ffffL & (L_temp3 >> 16));
  375.     temp1 = sub(ONE_Q14,temp1);
  376. L_temp4 = _smpy(pitch,temp1);
  377. temp1 = (Shortword) (0x0000ffffL & (L_temp4 >> 16));
  378. /*  length = shift_r(temp1,-6);     length in Q0 with rounding  */
  379. L_temp3 = _shr2((Longword)temp1,5);
  380. swRnd = (Shortword) (0x0000ffffL & L_temp3);
  381. swRnd = (Shortword) (swRnd & (Shortword)0x1);
  382. L_temp4 = _shr2((Longword)temp1,6);
  383. L_temp3 = _sadd2(L_temp4,(Longword)swRnd);
  384. length = (Shortword) (0x0000ffffL & L_temp3);
  385. // compare_nonzero();mark del
  386. if (length < PITCHMIN)
  387.     length = PITCHMIN;
  388. // compare_nonzero();mark del
  389. if (length > PITCHMAX)
  390.     length = PITCHMAX;
  391. /* Use inverse DFT for pulse excitation */
  392. fill(fs_real,ONE_Q13,length);
  393. fs_real[0] = 0;
  394. interp_array(prev_par.fs_mag,par->fs_mag,&fs_real[1],intfact,
  395.      NUM_HARM);
  396. idft_real(fs_real,&sigbuf[BEGIN],length);   /* sigbuf in Q15 */
  397. /* Delay overall signal by PDEL samples (circular shift) */
  398. /* use fs_real as a scratch buffer */
  399. v_equ(fs_real,&sigbuf[BEGIN],length);
  400. v_equ(&sigbuf[BEGIN+PDEL],fs_real,(Shortword)(length-PDEL));
  401. v_equ(&sigbuf[BEGIN],&fs_real[length-PDEL],PDEL);
  402. /* Scale by pulse gain */
  403. v_scale(&sigbuf[BEGIN],pulse_gain,length);    /* sigbuf in Q0 */
  404. /* Filter and scale pulse excitation */
  405. v_equ(&sigbuf[BEGIN-MIX_ORD],pulse_del,MIX_ORD);
  406. v_equ(pulse_del,&sigbuf[length+BEGIN-MIX_ORD],MIX_ORD);
  407. zerflt_Q(&sigbuf[BEGIN],pulse_cof,&sigbuf[BEGIN],MIX_ORD,length,14);
  408. /* Get scaled noise excitation */
  409. /*  temp1 = shr(mult((Shortword)X1_732_Q14,syn_gain),3);   temp1 in Q0     */
  410.     L_temp3 = _smpy((Shortword)X1_732_Q14,syn_gain);
  411. L_temp3 = _shr2(L_temp3,3);
  412. temp1 = (Shortword) (0x0000ffffL & (L_temp3 >> 16));
  413. rand_num(&sig2[BEGIN],temp1,length);   /* sig2 in Q0 */
  414. /* Filter noise excitation */
  415. v_equ(&sig2[BEGIN-MIX_ORD],noise_del,MIX_ORD);
  416. v_equ(noise_del,&sig2[length+BEGIN-MIX_ORD],MIX_ORD);
  417. zerflt_Q(&sig2[BEGIN],noise_cof,&sig2[BEGIN],MIX_ORD,length,14);
  418. /* Add two excitation signals (mixed excitation) */
  419. v_add(&sigbuf[BEGIN],&sig2[BEGIN],length);   /* sigbuf in Q0 */
  420. /* Adaptive spectral enhancement */
  421. v_equ(&sigbuf[BEGIN-LPC_ORD],ase_del,LPC_ORD);
  422. lpc_synthesis(&sigbuf[BEGIN],&sigbuf[BEGIN],ase_den,LPC_ORD,length);
  423. v_equ(ase_del,&sigbuf[BEGIN+length-LPC_ORD],LPC_ORD);
  424. zerflt(&sigbuf[BEGIN],ase_num,&sigbuf[BEGIN],LPC_ORD,length);
  425. v_equ(&sigbuf[BEGIN-TILT_ORD],tilt_del,TILT_ORD);
  426. v_equ(tilt_del,&sigbuf[length+BEGIN-TILT_ORD],TILT_ORD);
  427. zerflt_Q(&sigbuf[BEGIN],tilt_cof,&sigbuf[BEGIN],TILT_ORD,length,15);
  428. /* Perform LPC synthesis filtering */
  429. v_equ(&sigbuf[BEGIN-LPC_ORD],lpc_del,LPC_ORD);
  430. lpc_synthesis(&sigbuf[BEGIN],&sigbuf[BEGIN],lpc,LPC_ORD,length);
  431. v_equ(lpc_del,&sigbuf[length+BEGIN-LPC_ORD],LPC_ORD);
  432. /* Adjust scaling of synthetic speech */
  433. /* sigbuf in Q0 */
  434. scale_adj(&sigbuf[BEGIN],gain,&prev_scale,length,
  435.   SCALEOVER,(Shortword)INV_SCALEOVER_Q18);
  436. /* Copy processed speech to output array (not past frame end) */
  437. // compare_nonzero();mark del
  438. if (add(syn_begin,length) > FRAME) {
  439.     v_equ(&sp_out[BEGIN+syn_begin],&sigbuf[BEGIN],
  440.   (Shortword)(FRAME-syn_begin));
  441.     /* past end: save remainder in sigsave[0] */
  442.     v_equ(&sigsave[0],&sigbuf[BEGIN+FRAME-syn_begin],
  443.   (Shortword)(length-(FRAME-syn_begin)));
  444. }
  445. else
  446.     v_equ(&sp_out[BEGIN+syn_begin],&sigbuf[BEGIN],length);
  447. /* Update syn_begin for next period */
  448. syn_begin = add(syn_begin,length);
  449.     }
  450.     /* Implement pulse dispersion filter on output speech */
  451.     v_equ(&sp_out[BEGIN-DISP_ORD],disp_del,DISP_ORD);
  452.     v_equ(disp_del,&sp_out[FRAME+BEGIN-DISP_ORD],DISP_ORD);
  453.     zerflt_Q(&sp_out[BEGIN],disp_cof,speech_out,DISP_ORD,FRAME,15);
  454.     /* Save previous pulse and noise filters for next frame */
  455.     v_equ(prev_pcof,curr_pcof,MIX_ORD+1);
  456.     v_equ(prev_ncof,curr_ncof,MIX_ORD+1);
  457.     /* Copy current parameters to previous parameters for next time */
  458.     prev_par = *par;
  459.     prev_tilt = curr_tilt;
  460.     prev_lpc_gain = lpc_gain;
  461.     /* Update syn_begin for next frame */
  462.     syn_begin = sub(syn_begin,FRAME);
  463. //#if (COMPLEXITY_COUNT) mark del
  464. //complexity_count();
  465. //#endif
  466. }
  467. /* 
  468.  *
  469.  * Subroutine melp_syn_init(): perform initialization for melp 
  470.  * synthesis
  471.  *
  472.  */
  473. #define INV_LPC_ORD  2979   /* ((1.0/(LPC_ORD+1))*(1<<15)+0.5) */
  474. void melp_syn_init()
  475. {
  476.     Shortword i;
  477.     Shortword w_fs[NUM_HARM];
  478. Longword L_temp;
  479.     v_zap(prev_par.gain,NUM_GAINFR);
  480.     prev_par.pitch = UV_PITCH_Q7;
  481.     prev_par.lsf[0] = 0;
  482.     for (i = 1; i < LPC_ORD+1; i++){
  483.      /*  prev_par.lsf[i] = add(prev_par.lsf[i-1],(Shortword)INV_LPC_ORD); */
  484.     L_temp =  _sadd2((Longword)prev_par.lsf[i-1],(Longword)INV_LPC_ORD);
  485.         prev_par.lsf[i] = (Shortword) (0x0000ffffL & L_temp);
  486.   }
  487.     prev_par.jitter = 0;
  488.     v_zap(&prev_par.bpvc[0],NUM_BANDS);
  489.     prev_tilt=0;
  490. //    prev_gain = 0;
  491.     prev_scale = 0;
  492.     prev_lpc_gain = ONE_Q15;
  493.     syn_begin = 0;
  494.     noise_gain = (Shortword)MIN_NOISE_Q8;
  495.     firstcall = 1;
  496.     prev_gain_err = 0;
  497.     v_zap(pulse_del,MIX_ORD);
  498.     v_zap(noise_del,MIX_ORD);
  499.     v_zap(lpc_del,LPC_ORD);
  500.     v_zap(ase_del,LPC_ORD);
  501.     v_zap(tilt_del,TILT_ORD);
  502.     v_zap(disp_del,DISP_ORD);
  503.     v_zap(sig2,BEGIN+PITCHMAX);
  504.     v_zap(sigbuf,BEGIN+PITCHMAX);
  505.     v_zap(sigsave,PITCHMAX);
  506.     v_zap(prev_pcof,MIX_ORD+1);
  507.     v_zap(prev_ncof,MIX_ORD+1);
  508.     prev_ncof[MIX_ORD/2] = ONE_Q15;
  509.     fill(prev_par.fs_mag,ONE_Q13,NUM_HARM);
  510.     /* 
  511.      * Initialize multi-stage vector quantization (read codebook) 
  512.      */
  513.  
  514.     vq_par.num_best = MSVQ_M;
  515.     vq_par.num_stages = 4;
  516.     vq_par.dimension = 10;
  517.     /* 
  518.      * Allocate memory for number of levels per stage and indices
  519.      * and for number of bits per stage 
  520.      */
  521.  
  522.     MEM_ALLOC(MALLOC,vq_par.num_levels,vq_par.num_stages,Shortword);
  523.     MEM_ALLOC(MALLOC,vq_par.indices,vq_par.num_stages,Shortword);
  524.     MEM_ALLOC(MALLOC,vq_par.num_bits,vq_par.num_stages,Shortword);
  525.     vq_par.num_levels[0] = 128;
  526.     vq_par.num_levels[1] = 64;
  527.     vq_par.num_levels[2] = 64;
  528.     vq_par.num_levels[3] = 64;
  529.     vq_par.num_bits[0] = 7;
  530.     vq_par.num_bits[1] = 6;
  531.     vq_par.num_bits[2] = 6;
  532.     vq_par.num_bits[3] = 6;
  533.     vq_par.cb = msvq_cb;
  534.     vq_par.cb_mean = msvq_cb_mean;
  535.     /* 
  536.      * Initialize Fourier magnitude vector quantization (read codebook) 
  537.      */
  538.  
  539.     fs_vq_par.num_best = 1;
  540.     fs_vq_par.num_stages = 1;
  541.     fs_vq_par.dimension = NUM_HARM;
  542.     /* 
  543.      * Allocate memory for number of levels per stage and indices
  544.      * and for number of bits per stage 
  545.      */
  546.  
  547.     MEM_ALLOC(MALLOC,fs_vq_par.num_levels,fs_vq_par.num_stages,Shortword);
  548.     MEM_ALLOC(MALLOC,fs_vq_par.indices,fs_vq_par.num_stages,Shortword);
  549.     MEM_ALLOC(MALLOC,fs_vq_par.num_bits,fs_vq_par.num_stages,Shortword);
  550.     fs_vq_par.num_levels[0] = FS_LEVELS;
  551.     fs_vq_par.num_bits[0] = FS_BITS;
  552.     fs_vq_par.cb = fsvq_cb;
  553.     /* 
  554.      * Initialize fixed MSE weighting and inverse of weighting 
  555.      */
  556.     vq_fsw(w_fs, NUM_HARM, (Shortword)X60_Q9);
  557.     for (i = 0; i < NUM_HARM; i++)
  558.       w_fs_inv[i] = divide_s(ONE_Q13,w_fs[i]);    /* w_fs_inv in Q14 */
  559.     /* 
  560.      * Pre-weight codebook (assume single stage only) 
  561.      */
  562.     if (fsvq_weighted == 0)
  563.       {
  564.   fsvq_weighted = 1;
  565.   for (i = 0; i < fs_vq_par.num_levels[0]; i++)
  566.     window_Q(&fs_vq_par.cb[i*NUM_HARM],w_fs,
  567.      &fs_vq_par.cb[i*NUM_HARM],NUM_HARM,14);
  568.       }
  569. }