📄 main.m
字号:
[x,fs,nbits] = wavread('4.wav'); % 读取语音文件
xlength=length(x);%计算声音文件样本数
poles_num=16
[fr,frmsize,frmcnt]= frame(x);
errorpre=zeros(1,frmsize);
%save all parameter
codeA=zeros(10,frmcnt);
codeN=zeros(10,frmcnt);
btotal=zeros(1,frmcnt);
pitchtotal=zeros(1,frmcnt);
vtotal=zeros(frmcnt,frmsize);
linatotal=zeros(poles_num,frmcnt);
splast=zeros(1,frmsize/2-1);
spwoutpre=zeros(1,frmsize/2-1);
splast1=zeros(1,frmsize/2-1);
spwoutpre1=zeros(1,frmsize/2-1);
%caculate all frames
for i=1:frmcnt
[win,win_length]=window(fr(i,:));
lina=covariance(poles_num,win_length,win);
ha=hAInverse(lina,poles_num,frmsize);
inA=amplitude(fr(i,:),frmsize,ha,0);
inlocation=location(inA,fr(i,:),frmsize);
loa=inlocation;
A1=zeros(1,10);
N1=zeros(1,10);
for k=1:10
A1(k)=amplitude(fr(i,:),frmsize,ha,loa);
N1(k)=location(A1(k),fr(i,:),frmsize);
loa=N1(k);
end
codeA(:,i)=A1';
codeN(:,i)=N1';
pitch_marks = find_pmark(fr(i,:))
STErrorFrame=STErrorPredict(lina,poles_num,win_length,fr(i,:),frmsize);
[v,bvalue]=LTermPrediction(errorpre,STErrorFrame,fr(i,:),frmsize,pitch_marks);%save all parameter and input to VQ
btotal(1,i)=bvalue;
pitchtotal(1,i)=pitch_marks;
vtotal(i,:)=v;
linatotal(:,i)=lina;
errorpre=STErrorFrame;
%combine each frame to a intergral signal
end
% VQ process
% define the code number
pitchCodeNum=8;%boundary [1,276] ,use[0,256]
bvalueCodeNum=15;%[-1.2097,0.9884],use[-1.5000,1.5000]
vCodeNum=12;%[-0.1132,0.1029],use[-0.1500,0.1500]
linaCodeNum=16;%[-3.0848,2.8283],use[-3.2000,3.2000]
nkCodeNum=9;%[1,320],[1,320]
AkCodeNum=6;%[-0.0032,0.0026],[-0.0032,0.0032]
% define the coding boundary
pitchCodeBoundary=[20,276];
bvalueCodeBoundary=[-1.5000,1.5000];
vCodeBoundary=[-0.1500,0.1500];
linaCodeBoundary=[-3.2000,3.2000];
nkCodeBoundary=[1,320];
AkCodeBoundary=[-0.0033,0.0033];
[maxA,minA]=updownbound(codeA,10,frmcnt);
[maxN,minN]=updownbound(codeN,10,frmcnt);
AcodeBook=VQcode(AkCodeNum,AkCodeBoundary,codeA,10,frmcnt,'AcodeBook.txt');
NcodeBook=VQcode(nkCodeNum,nkCodeBoundary,codeN,10,frmcnt,'NcodeBook.txt');
pitchcodeBook=VQcode(pitchCodeNum,pitchCodeBoundary,pitchtotal,1,frmcnt,'pitchcodeBook.txt');
bcodeBook=VQcode(bvalueCodeNum,bvalueCodeBoundary,btotal,1,frmcnt,'bcodeBook.txt');
vcodeBook=VQcode(vCodeNum,vCodeBoundary,vtotal,frmcnt,frmsize,'vcodeBook.txt');
linacodeBook=VQcode(linaCodeNum,linaCodeBoundary,linatotal,poles_num,frmcnt,'linacodeBook.txt');
% VQ decode
pitchVQdecode=VQdecode(pitchCodeNum,pitchCodeBoundary,1,frmcnt,'pitchcodeBook.txt')
bVQdecode=VQdecode(bvalueCodeNum,bvalueCodeBoundary,1,frmcnt,'bcodeBook.txt')
vVQdecode=VQdecode(vCodeNum,vCodeBoundary,frmcnt,frmsize,'vcodeBook.txt')
linadecode=VQdecode(linaCodeNum,linaCodeBoundary,poles_num,frmcnt,'linacodeBook.txt')
AdecodeBook=VQdecode(AkCodeNum,AkCodeBoundary,10,frmcnt,'AcodeBook.txt')
NdecodeBook=VQdecode(nkCodeNum,nkCodeBoundary,10,frmcnt,'NcodeBook.txt')
for i=1:frmcnt
Ade1=AdecodeBook(:,i);
Nde1=NdecodeBook(:,i);
linade=linadecode(:,i);
s=zeros(1,320);
out=zeros(1,320);
ha1=hAInverse(linade,poles_num,frmsize);
newout=zeros(1,320);
for j=1:320
for k=1:10
s(j)=s(j)+Ade1(k)*DeltaSdef(j-Nde1(k));
end
end
out=conv(ha1,s);
newout=out(1:320);
[splast1,spwoutpre1,spwout1]=combine(newout,160,320,i,splast1,spwoutpre1);
sp=LTermDecode(frmsize,pitchVQdecode(1,i),vVQdecode(i,:),bVQdecode(1,i),poles_num,linadecode(:,i));
[splast,spwoutpre,spwout]=combine(sp,win_length,frmsize,i,splast,spwoutpre);
end
splast=[splast,spwout];
wavwrite(splast,16000,'test4.wav');
%[bBoundary,pitchBoundary,vBoundary,linaBoundary]=findBoundary(btotal,pitchTotal,vtotal,linatotal,frmcnt,frmsize,poles_num)
%wavwrite(x,16000,'C:\Documents and Settings\zcl\桌面\project\TDPSOLA的matlab代码\original.wav');
splast1=[splast1,spwout1];
wavwrite(splast1,fs,'new4.wav');
figure(1);
plot(splast1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -