melp_encode.m
Upload User: xxy784
Upload Date: 2015-01-28
Package Size: 726k
Code Size: 3k
Development Platform:

Matlab

  1. %%%%%%%%RUN This Program to Encode%%%%%%%%%%%%%
  2. %Global varible and constant
  3. %global dcr_ord dcr_num dcr_den FRL cheb_s sig_in
  4. %global butt_1000ord butt_1000num butt_1000den state butter_s sig_1000
  5. %global melp_bands state_b melp_envelopes state_e pre_intp
  6. %global G2p ham_win
  7. %global buffer pavg
  8. melp_init;
  9. for FRN=1:(Nframe-1)             %%%%%%%%%%%%%%%%%%%%
  10. %Refresh buffers
  11. %Get new speech(filted by 4-order chebyshev filter)
  12. sig_in(1:FRL)=sig_in(FRL+1:FRL*2);                  
  13. %Refresh 1000Hz speech buffer
  14. sig_1000(1:FRL)=sig_1000(FRL+1:FRL*2);
  15. %Refresh bandpass speech                       
  16. melp_bands(:,1:FRL)=melp_bands(:,FRL+1:FRL*2);              
  17. %Refresh envelope bandpass speech
  18. melp_envelopes(:,1:FRL)=melp_envelopes(:,FRL+1:FRL*2);      
  19. %Get a new frame speech
  20. sig_origin=s(FRN*FRL+1:(FRN+1)*FRL);                         
  21. %Reduce the direct current
  22. [sig_in(FRL+1:FRL*2),cheb_s]=melp_iir(sig_origin,cheb_s,dcr_ord,dcr_num,dcr_den,FRL);
  23. %Get integer pitch
  24. [sig_1000(FRL+1:FRL*2),butter_s]=melp_iir(sig_in(FRL+1:FRL*2),butter_s,butt_1000ord,butt_1000num,butt_1000den,180);
  25. cur_intp=intpitch(sig_1000,160,40);
  26. %bandpass analyze
  27. %Get bandpass and envelopes
  28. [melp_bands(:,FRL+1:FRL*2),state_b,melp_envelopes(:,FRL+1:FRL*2),state_e]=melp_5b(sig_in(FRL+1:FRL*2),state_b,state_e);
  29. %Get fractal pitch
  30. [p2,vp(1)]=pitch2(melp_bands(1,:),cur_intp);
  31. %bandpass voicing analyse
  32. vp(2:5)=melp_bpva(melp_bands,melp_envelopes,p2);
  33. %pre_intp=cur_intp;
  34. r2=vp(1);
  35. %jitter
  36. if vp(1)<0.5
  37.     jitter=1;
  38. else
  39.     jitter=0;
  40. end
  41. %LPC analyse
  42. e_lpc=melp_lpc(sig_in(81:280));
  43. %temp_lpc=lpc(sig_in(81:280),10);
  44. %e_lpc=temp_lpc(2:11);
  45. %LPC Residual
  46. e_resid=lpc_residual(e_lpc,sig_in,350);
  47. %Peakness Check
  48. peak=sqrt(e_resid(106:265)*e_resid(106:265)'/160)/(sum(abs(e_resid(106:265)))/160);
  49. %peak=sqrt(160)*norm(e_resid(106:265))/norm(e_resid(106:265),1);
  50. %jitter voice detect
  51. if peak>1.34
  52.     vp(1)=1;
  53. end
  54. if peak>1.6
  55.     vp(2:3)=1;
  56. end
  57. %Final pitch dectect
  58. temp_s(1:6)=0;
  59. [fltd_resid,temp_s]=melp_iir(e_resid,temp_s,butt_1000ord,butt_1000num,butt_1000den,350);
  60. temp(1:5)=0;
  61. fltd_resid=[temp,fltd_resid,temp];
  62. %global pavg;
  63. [p3,r3]=pitch3(sig_in,fltd_resid,p2,pavg);
  64. %Gain
  65. G=melp_gain(sig_in,vp(1),p2);
  66. %Refresh average pitch
  67. [pavg,buffer]=melp_APU(p3,r3,G(2),buffer);
  68. %Get LSF 
  69. LSF=melp_lpc2lsf(e_lpc);
  70. %minimun distance expand
  71. LSF=lsf_clmp(LSF);
  72. %Muti-stage Vector Quatization
  73. MSVQ=melp_msvq(e_lpc,LSF);
  74. %Gain quantization
  75. QG=melp_Qgain(G2p,G);
  76. G2p=G(2);
  77. %Fourier Spectrum Magnitude
  78. lsfs=d_lsf(MSVQ);
  79. lpc2=melp_lsf2lpc(lsfs);
  80. tresid2=lpc_residual(lpc2,sig_in(76:285),200);
  81. resid2=tresid2.*ham_win;
  82. resid2(201:512)=0;
  83. magf=abs(fft(resid2));
  84. fm=find_harm(magf,p3);
  85. function melp_encode
  86. %Quantize Fourier Magnitude
  87. QFM=melp_FMCQ(fm);
  88. %组帧  C(N)=struct('ls',0,'fm',0,'pitch',0,'G',0,'vp',0,'jt',0);
  89. c(FRN).ls=MSVQ;
  90. c(FRN).QFM=QFM;
  91. c(FRN).G=QG;
  92. if vp(1)>0.6
  93.     c(FRN).pitch=p3;
  94.     c(FRN).vp=vp(2:5);
  95.     c(FRN).jt=jitter;
  96. else
  97.     c(FRN).pitch=0;
  98.     c(FRN).vp=0;
  99.     c(FRN).jt=0;    
  100. end
  101. end
  102.