⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 melp_encode.m

📁 语音编码中的MELP的经典估计
💻 M
字号:
%%%%%%%%RUN This Program to Encode%%%%%%%%%%%%%

%Global varible and constant
%global dcr_ord dcr_num dcr_den FRL cheb_s sig_in
%global butt_1000ord butt_1000num butt_1000den state butter_s sig_1000
%global melp_bands state_b melp_envelopes state_e pre_intp
%global G2p ham_win
%global buffer pavg
melp_init;
for FRN=1:(Nframe-1)             %%%%%%%%%%%%%%%%%%%%
%Refresh buffers
%Get new speech(filted by 4-order chebyshev filter)
sig_in(1:FRL)=sig_in(FRL+1:FRL*2);                  
%Refresh 1000Hz speech buffer
sig_1000(1:FRL)=sig_1000(FRL+1:FRL*2);
%Refresh bandpass speech                       
melp_bands(:,1:FRL)=melp_bands(:,FRL+1:FRL*2);              
%Refresh envelope bandpass speech
melp_envelopes(:,1:FRL)=melp_envelopes(:,FRL+1:FRL*2);      

%Get a new frame speech
sig_origin=s(FRN*FRL+1:(FRN+1)*FRL);                         
%Reduce the direct current
[sig_in(FRL+1:FRL*2),cheb_s]=melp_iir(sig_origin,cheb_s,dcr_ord,dcr_num,dcr_den,FRL);

%Get integer pitch
[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);
cur_intp=intpitch(sig_1000,160,40);

%bandpass analyze
%Get bandpass and envelopes
[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);
%Get fractal pitch
[p2,vp(1)]=pitch2(melp_bands(1,:),cur_intp);
%bandpass voicing analyse
vp(2:5)=melp_bpva(melp_bands,melp_envelopes,p2);
%pre_intp=cur_intp;
r2=vp(1);

%jitter
if vp(1)<0.5
    jitter=1;
else
    jitter=0;
end

%LPC analyse
e_lpc=melp_lpc(sig_in(81:280));
%temp_lpc=lpc(sig_in(81:280),10);
%e_lpc=temp_lpc(2:11);

%LPC Residual
e_resid=lpc_residual(e_lpc,sig_in,350);

%Peakness Check
peak=sqrt(e_resid(106:265)*e_resid(106:265)'/160)/(sum(abs(e_resid(106:265)))/160);
%peak=sqrt(160)*norm(e_resid(106:265))/norm(e_resid(106:265),1);

%jitter voice detect
if peak>1.34
    vp(1)=1;
end
if peak>1.6
    vp(2:3)=1;
end

%Final pitch dectect
temp_s(1:6)=0;
[fltd_resid,temp_s]=melp_iir(e_resid,temp_s,butt_1000ord,butt_1000num,butt_1000den,350);
temp(1:5)=0;
fltd_resid=[temp,fltd_resid,temp];
%global pavg;
[p3,r3]=pitch3(sig_in,fltd_resid,p2,pavg);

%Gain
G=melp_gain(sig_in,vp(1),p2);

%Refresh average pitch
[pavg,buffer]=melp_APU(p3,r3,G(2),buffer);

%Get LSF 
LSF=melp_lpc2lsf(e_lpc);

%minimun distance expand
LSF=lsf_clmp(LSF);

%Muti-stage Vector Quatization
MSVQ=melp_msvq(e_lpc,LSF);

%Gain quantization
QG=melp_Qgain(G2p,G);
G2p=G(2);

%Fourier Spectrum Magnitude
lsfs=d_lsf(MSVQ);
lpc2=melp_lsf2lpc(lsfs);
tresid2=lpc_residual(lpc2,sig_in(76:285),200);
resid2=tresid2.*ham_win;
resid2(201:512)=0;
magf=abs(fft(resid2));
fm=find_harm(magf,p3);
function melp_encode
%Quantize Fourier Magnitude
QFM=melp_FMCQ(fm);

%组帧  C(N)=struct('ls',0,'fm',0,'pitch',0,'G',0,'vp',0,'jt',0);
c(FRN).ls=MSVQ;
c(FRN).QFM=QFM;
c(FRN).G=QG;
if vp(1)>0.6
    c(FRN).pitch=p3;
    c(FRN).vp=vp(2:5);
    c(FRN).jt=jitter;
else
    c(FRN).pitch=0;
    c(FRN).vp=0;
    c(FRN).jt=0;    
end
end
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -