melp_ana.c
上传用户:cxx_68
上传日期:2021-02-21
资源大小:161k
文件大小:13k
源码类别:

语音压缩

开发平台:

Visual 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_ana.c
  25.     Description: MELP analysis
  26.     Inputs:
  27.       speech[] - input speech signal
  28.     Outputs: 
  29.       *par - MELP parameter structure
  30.     Returns: void
  31. */
  32. /* compiler include files */
  33. #include <stdio.h>
  34. #include <math.h>
  35. #include "mathhalf.h"
  36. #include "melp.h"
  37. #include "spbstd.h"
  38. #include "lpc.h"
  39. #include "mat.h"
  40. #include "vq.h"
  41. #include "fs.h"
  42. #include "pit.h"
  43. #include "math_lib.h"
  44. #include "constant.h"
  45. #include "wmops.h"
  46. /* compiler constants */
  47. #define BEGIN 0
  48. #define END 1
  49. #define HF_CORR_Q15 4       /* 0.0001220703125 in Q15 */
  50. #define LAG_WIN 0.005  /* not used */
  51. #define PDECAY_Q15 31129            /* (0.95*(1<<15)) */
  52. #define PDECAY_PITCH_Q7 320         /* ((0.05*DEFAULT_PITCH)*(1<<7)) */
  53. #define PEAK_THRESH_Q12 5488        /* (1.34*(1<<12)) */
  54. #define PEAK_THR2_Q12 6553          /* (1.6*(1<<12)) */
  55. #define SILENCE_DB_Q8 7680          /* (30.0*(1<<8)) */
  56. #define MAX_ORD LPF_ORD
  57. #define FRAME_BEG (PITCHMAX-(FRAME/2))
  58. #define FRAME_END (FRAME_BEG+FRAME)
  59. #define PITCH_BEG (FRAME_END-PITCHMAX)
  60. #define PITCH_FR ((2*PITCHMAX)+1)
  61. #define IN_BEG (PITCH_BEG+PITCH_FR-FRAME)
  62. #define SIG_LENGTH (LPF_ORD+PITCH_FR)
  63. /* external memory references */
  64.  
  65. extern Shortword win_cof[];
  66. extern Shortword lpf_num[];
  67. extern Shortword lpf_den[];
  68. extern Shortword msvq_cb[];
  69. extern Shortword msvq_cb_mean[];
  70. extern Shortword fsvq_cb[];
  71. extern Shortword fsvq_weighted;
  72. extern FILE *fp_indat,*fp_outdat;
  73. /* memory definitions */
  74.  
  75. static Shortword sigbuf[SIG_LENGTH];
  76. static Shortword speech[IN_BEG+FRAME];
  77. static Shortword dcdelin[DC_ORD];
  78. static Shortword dcdelout_hi[DC_ORD];
  79. static Shortword dcdelout_lo[DC_ORD];
  80. static Shortword lpfsp_delin[LPF_ORD];
  81. static Shortword lpfsp_delout[LPF_ORD];
  82. static Shortword pitch_avg;
  83. static Shortword fpitch[2];
  84. static struct msvq_param vq_par;  /* MSVQ parameters */
  85. static struct msvq_param fs_vq_par;  /* Fourier series VQ parameters */
  86. static Shortword w_fs[NUM_HARM];
  87. Shortword frames=0;
  88. void melp_ana(Shortword sp_in[],struct melp_param *par)
  89. {
  90.     Shortword i;
  91.     Shortword begin;
  92.     Shortword sub_pitch;
  93.     Shortword temp,pcorr,bpthresh;
  94.     Shortword r[LPC_ORD+1],refc[LPC_ORD+1],lpc[LPC_ORD+1];
  95.     Shortword weights[LPC_ORD];
  96.     Shortword section;
  97.     Shortword temp_delin[LPF_ORD];
  98.     Shortword temp_delout[LPF_ORD];
  99.     /* char in_num[20];*/
  100.     /* Remove DC from input speech */
  101.     dc_rmv(sp_in,&speech[IN_BEG],dcdelin,dcdelout_hi,dcdelout_lo,FRAME);
  102. #if (COMPLEXITY_COUNT)
  103. complexity_count();
  104. #endif
  105.     /* Copy input speech to pitch window and lowpass filter */
  106.     v_equ(&sigbuf[LPF_ORD],&speech[PITCH_BEG],PITCH_FR);
  107.     for (section=0; section<LPF_ORD/2; section++) {
  108.       iir_2nd_s(&sigbuf[LPF_ORD],&lpf_den[section*3],&lpf_num[section*3],
  109.                 &sigbuf[LPF_ORD],&lpfsp_delin[section*2],
  110.                 &lpfsp_delout[section*2],FRAME);
  111.       /* save delay buffers for the next overlapping frame */
  112.       for (i = section*2; i < section*2+2; i++) {
  113.         temp_delin[i] = lpfsp_delin[i];      data_move();
  114.         temp_delout[i] = lpfsp_delout[i];      data_move();
  115.       }
  116.       iir_2nd_s(&sigbuf[LPF_ORD+FRAME],&lpf_den[section*3],
  117.                 &lpf_num[section*3],&sigbuf[LPF_ORD+FRAME],
  118.                 &lpfsp_delin[section*2],&lpfsp_delout[section*2],
  119.                 PITCH_FR-FRAME);
  120.       /* restore delay buffers for the next overlapping frame */
  121.       for (i = section*2; i < section*2+2; i++) {
  122.         lpfsp_delin[i] = temp_delin[i];      data_move();
  123.         lpfsp_delout[i] = temp_delout[i];      data_move();
  124.       }
  125.     }
  126. #if (COMPLEXITY_COUNT)
  127. complexity_count();
  128. #endif
  129.     /* Perform global pitch search at frame end on lowpass speech signal */
  130.     /* Note: avoid short pitches due to formant tracking */
  131.     f_pitch_scale(&sigbuf[LPF_ORD],&sigbuf[LPF_ORD],PITCH_FR);
  132.     fpitch[END] = find_pitch(&sigbuf[LPF_ORD+(PITCH_FR/2)],&temp,
  133.      (2*PITCHMIN),PITCHMAX,PITCHMAX);
  134.     fpitch[END] = shl(fpitch[END],7);     /* fpitch in Q7 */
  135. #if (COMPLEXITY_COUNT)
  136. complexity_count();
  137. #endif
  138.     /* Perform bandpass voicing analysis for end of frame */
  139.     bpvc_ana(&speech[FRAME_END], fpitch, &par->bpvc[0], &sub_pitch);
  140. #if (COMPLEXITY_COUNT)
  141. complexity_count();
  142. #endif
  143.     /* Force jitter if lowest band voicing strength is weak */    
  144.     if (par->bpvc[0] < VJIT_Q14)      /* par->bpvc in Q14 */
  145. par->jitter = (Shortword)MAX_JITTER_Q15;   /* par->jitter in Q15 */
  146.     else
  147. par->jitter = (Shortword)0;
  148.     /* Calculate LPC for end of frame */
  149.     lpc_autocorr(&speech[(FRAME_END-(LPC_FRAME/2))],win_cof,r,
  150.                  HF_CORR_Q15,(Shortword)LAG_WIN,LPC_ORD,LPC_FRAME);
  151.     lpc[0] = ONE_Q12;        /* 1 in Q12 */
  152.     lpc_schur(r,lpc,refc,LPC_ORD);     /* lpc in Q12, refc in Q15 */
  153. #if (COMPLEXITY_COUNT)
  154. complexity_count();
  155. #endif
  156.     /* Calculate LPC residual */
  157.     zerflt(&speech[PITCH_BEG],lpc,&sigbuf[LPF_ORD],LPC_ORD,PITCH_FR);
  158. #if (COMPLEXITY_COUNT)
  159. complexity_count();
  160. #endif
  161.     /* Check peakiness of residual signal */
  162.     begin = (LPF_ORD+(PITCHMAX/2));
  163.     temp = peakiness(&sigbuf[begin],PITCHMAX);    /* temp in Q12 */
  164. #if (COMPLEXITY_COUNT)
  165. complexity_count();
  166. #endif
  167.     /* Peakiness: force lowest band to be voiced  */
  168.     if (temp > PEAK_THRESH_Q12) {
  169. par->bpvc[0] = 1<<14;
  170.     }
  171.     /* Extreme peakiness: force second and third bands to be voiced */
  172.     if (temp > PEAK_THR2_Q12) {
  173. par->bpvc[1] = 1<<14;
  174. par->bpvc[2] = 1<<14;
  175.     }
  176.     /* Calculate overall frame pitch using lowpass filtered residual */
  177.     par->pitch = pitch_ana(&speech[FRAME_END], &sigbuf[LPF_ORD+PITCHMAX], 
  178.    sub_pitch,pitch_avg,&pcorr);
  179. #if (COMPLEXITY_COUNT)
  180. complexity_count();
  181. #endif
  182.     bpthresh = (Shortword)BPTHRESH_Q14;
  183.     /* Calculate gain of input speech for each gain subframe */
  184.     for (i = 0; i < NUM_GAINFR; i++) {
  185. if (par->bpvc[0] > bpthresh) {
  186.     /* voiced mode: pitch synchronous window length */
  187.     temp = sub_pitch;
  188.     par->gain[i] = gain_ana(&speech[FRAME_BEG+(i+1)*GAINFR],
  189.     temp,MIN_GAINFR,PITCHMAX_X2);
  190. }
  191. else {
  192.     temp = (Shortword)GAIN_PITCH_Q7;
  193.     par->gain[i] = gain_ana(&speech[FRAME_BEG+(i+1)*GAINFR],
  194.     temp,0,PITCHMAX_X2);
  195. }
  196.     }
  197. #if (COMPLEXITY_COUNT)
  198. complexity_count();
  199. #endif
  200.     /* Update average pitch value */
  201.     if (par->gain[NUM_GAINFR-1] > SILENCE_DB_Q8)    /* par->gain in Q8 */
  202.       temp = pcorr;
  203.     else
  204.       temp = 0;
  205.     /* pcorr in Q14 */
  206.     pitch_avg = p_avg_update(par->pitch,temp,(Shortword)VMIN_Q14);
  207.     /* Calculate Line Spectral Frequencies */
  208.     lpc_pred2lsp(lpc,par->lsf,LPC_ORD);
  209. #if (COMPLEXITY_COUNT)
  210. complexity_count();
  211. #endif
  212.     /* Force minimum LSF bandwidth (separation) */
  213.     lpc_clamp(par->lsf,BWMIN_Q15,LPC_ORD);
  214.     /* Quantize MELP parameters to 2400 bps and generate bitstream */
  215.     /* Quantize LSF's with MSVQ */
  216.     vq_lspw(weights, &par->lsf[1], lpc, LPC_ORD);
  217.     msvq_enc(&par->lsf[1], weights, &par->lsf[1], vq_par);
  218. #if (COMPLEXITY_COUNT)
  219. complexity_count();
  220. #endif
  221. frames++;
  222.     par->msvq_index = vq_par.indices;
  223.     /* Force minimum LSF bandwidth (separation) */
  224.     lpc_clamp(par->lsf,BWMIN_Q15,LPC_ORD);
  225.     /* Quantize logarithmic pitch period */
  226.     /* Reserve all zero code for completely unvoiced */
  227.     par->pitch = log10_fxp(par->pitch,7);      /* par->pitch in Q12 */
  228.     quant_u(&par->pitch,&par->pitch_index,(Shortword)PIT_QLO_Q12,
  229.     (Shortword)PIT_QUP_Q12,PIT_QLEV_M1,PIT_QLEV_M1_Q8,1,7);
  230.     /* convert pitch back to linear in Q7 */
  231.     par->pitch = pow10_fxp(par->pitch,7);
  232.     /* Quantize gain terms with uniform log quantizer */
  233.     q_gain(par->gain, par->gain_index,(Shortword)GN_QLO_Q8,
  234.    (Shortword)GN_QUP_Q8,GN_QLEV_M1,GN_QLEV_M1_Q10,0,5);
  235.     
  236.     /* Quantize jitter */
  237.     /* quant_u(&par->jitter,&par->jit_index,0,MAX_JITTER_Q15,2); */
  238.     if (par->jitter < shr((Shortword)MAX_JITTER_Q15,1)) {
  239.       par->jitter = 0;
  240.       par->jit_index = 0;
  241.     }
  242.     else {
  243.       par->jitter = (Shortword)MAX_JITTER_Q15;
  244.       par->jit_index = 1;
  245.     }
  246.     /* Quantize bandpass voicing */
  247.     par->uv_flag = q_bpvc(&par->bpvc[0],&par->bpvc_index,bpthresh,
  248.   NUM_BANDS);
  249. #if (COMPLEXITY_COUNT)
  250. complexity_count();
  251. #endif
  252.     /* Calculate Fourier coefficients of residual signal from quantized LPC */
  253.     fill(par->fs_mag,ONE_Q13,NUM_HARM);
  254.     if (par->bpvc[0] > bpthresh) {
  255. lpc_lsp2pred(par->lsf,lpc,LPC_ORD);
  256. zerflt(&speech[(FRAME_END-(LPC_FRAME/2))],lpc,sigbuf,
  257.        LPC_ORD,LPC_FRAME);
  258. window(sigbuf,win_cof,sigbuf,LPC_FRAME);
  259. find_harm(sigbuf, par->fs_mag, par->pitch, NUM_HARM, LPC_FRAME);
  260.     }
  261. #if (COMPLEXITY_COUNT)
  262. complexity_count();
  263. #endif
  264.     
  265.     /* quantize Fourier coefficients */
  266.     /* pre-weight vector, then use Euclidean distance */
  267.     window_Q(&par->fs_mag[0],w_fs,&par->fs_mag[0],NUM_HARM,14);
  268.     fsvq_enc(&par->fs_mag[0], &par->fs_mag[0], fs_vq_par);
  269. #if (COMPLEXITY_COUNT)
  270. complexity_count();
  271. #endif
  272.     /* Set MELP indeces to point to same array */
  273.     par->fsvq_index = fs_vq_par.indices;
  274.     /* Update MSVQ information */
  275.     par->msvq_stages = vq_par.num_stages;
  276.     par->msvq_bits = vq_par.num_bits;
  277.     /* Write channel bitstream */
  278.     melp_chn_write(par);
  279.     /* Update delay buffers for next frame */
  280.     v_equ(&speech[0],&speech[FRAME],IN_BEG);
  281.     fpitch[BEGIN] = fpitch[END];
  282. #if (COMPLEXITY_COUNT)
  283. complexity_count();
  284. #endif
  285. } /* melp_ana */
  286. /* 
  287.  * melp_ana_init: perform initialization 
  288.  */
  289. void melp_ana_init()
  290. {
  291.     Shortword j;
  292.     bpvc_ana_init(FRAME,PITCHMIN,PITCHMAX,NUM_BANDS,2,MINLENGTH);
  293.     pitch_ana_init(PITCHMIN,PITCHMAX,FRAME,LPF_ORD,MINLENGTH);
  294.     p_avg_init((Shortword)PDECAY_Q15,DEFAULT_PITCH_Q7,
  295.        (Shortword)PDECAY_PITCH_Q7,3);
  296.     v_zap(speech,IN_BEG+FRAME);
  297.     pitch_avg=DEFAULT_PITCH_Q7;
  298.     fill(fpitch,DEFAULT_PITCH_Q7,2);
  299.     v_zap(lpfsp_delin,LPF_ORD);
  300.     v_zap(lpfsp_delout,LPF_ORD);
  301.     /* Initialize multi-stage vector quantization (read codebook) */
  302.     vq_par.num_best = MSVQ_M;
  303.     vq_par.num_stages = 4;
  304.     vq_par.dimension = 10;
  305.     /* 
  306.      * Allocate memory for number of levels per stage and indices
  307.      * and for number of bits per stage 
  308.      */
  309.  
  310.     MEM_ALLOC(MALLOC,vq_par.num_levels,vq_par.num_stages,Shortword);
  311.     MEM_ALLOC(MALLOC,vq_par.indices,vq_par.num_stages,Shortword);
  312.     MEM_ALLOC(MALLOC,vq_par.num_bits,vq_par.num_stages,Shortword);
  313.     vq_par.num_levels[0] = 128;
  314.     vq_par.num_levels[1] = 64;
  315.     vq_par.num_levels[2] = 64;
  316.     vq_par.num_levels[3] = 64;
  317.     vq_par.num_bits[0] = 7;
  318.     vq_par.num_bits[1] = 6;
  319.     vq_par.num_bits[2] = 6;
  320.     vq_par.num_bits[3] = 6;
  321.     vq_par.cb = msvq_cb;
  322.     vq_par.cb_mean = msvq_cb_mean;
  323.     /* Initialize Fourier magnitude vector quantization (read codebook) */
  324.     fs_vq_par.num_best = 1;
  325.     fs_vq_par.num_stages = 1;
  326.     fs_vq_par.dimension = NUM_HARM;
  327.     /* 
  328.      * Allocate memory for number of levels per stage and indices
  329.      * and for number of bits per stage 
  330.      */
  331.  
  332.     MEM_ALLOC(MALLOC,fs_vq_par.num_levels,fs_vq_par.num_stages,Shortword);
  333.     MEM_ALLOC(MALLOC,fs_vq_par.indices,fs_vq_par.num_stages,Shortword);
  334.     MEM_ALLOC(MALLOC,fs_vq_par.num_bits,fs_vq_par.num_stages,Shortword);
  335.     fs_vq_par.num_levels[0] = FS_LEVELS;
  336.     fs_vq_par.num_bits[0] = FS_BITS;
  337.     fs_vq_par.cb = fsvq_cb;
  338.     /* Initialize fixed MSE weighting and inverse of weighting */
  339.     vq_fsw(w_fs, NUM_HARM, X60_Q9);
  340.     /* Pre-weight codebook (assume single stage only) */
  341.     if (fsvq_weighted == 0)
  342.       {
  343.   fsvq_weighted = 1;
  344.   for (j = 0; j < fs_vq_par.num_levels[0]; j++)
  345.             window_Q(&fs_vq_par.cb[j*NUM_HARM],w_fs,
  346.      &fs_vq_par.cb[j*NUM_HARM],NUM_HARM,14);
  347.       }
  348.     /* Initialize wr_array and wi_array */
  349.     fs_init();
  350. } /* melp_ana_init */