完整word版ADPCM语音编码标准MATLAB实现Word文档格式.docx
《完整word版ADPCM语音编码标准MATLAB实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《完整word版ADPCM语音编码标准MATLAB实现Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
a=fscanf(fid,%e\n'
fclose(fid);
spp.txt'
'
wt'
%存放解码输出波形
fori=1:
size(a,1);
Slk=a(i);
[coe,coe1,coe2,coe3,Dqk]=adpcm(Slk,coe,coe1,coe2,coe3,Dqk);
fprintf(fid,'
%f\n'
coe2(5));
end
fid=fopen('
rt'
b=fscanf(fid,'
%e\n'
subplot(211);
plot(a);
subplot(212);
plot(b);
%语音编解码子函数程序adpcm.m
function[coe,coe1,coe2,coe3,Dqk]=adpcm(Slk,coe,coe1,coe2,coe3,Dqk)%语音编解
码函数
Yk_pre=coe2
(1);
%初值传递
Sek_pre=coe2
(2);
Ik_pre=coe2(3);
Ylk_pre_pre=coe2(4);
Srk_pre=coe2(5);
Srk_pre_pre=coe2(6);
a2=coe2⑺;
Tdk_pre=coe2(8);
Trk_pre=coe2(9);
Num=coe2(10);
coe2(10)=coe2(10)+1;
[Sek,coe]=Sek_com(Srk_pre,Srk_pre_pre,Dqk,coe);
%自适应预测
Dk=Dk_com(Slk,Sek);
%采样值与其估值差值计算
Yuk_pre=yu_result(Yk_pre,wi_result(abs(lk_pre)));
ifYuk_pre<
1.06
Yuk_pre=1.06;
else
ifYuk_pre>
10.00Yuk_pre=10.00;
Ylk_pre=yl_result(Ylk_pre_pre,Yuk_pre);
%
Trk_pre=Trk_com(a2,Dqk(6),Ylk_pre);
Tdk_pre=Tdk_com(a2);
%单频信号判定
[Alk,coe1]=Alk_com(lk_pre,Yk_pre,coe1,Tdk_pre,Trk_pre);
%自适应速度控制与自适应预测
ifAlk<
0.0
Alk=0.0;
ifAlk>
1.0
Alk=1.0;
量化阶距自适应因子计算
[Yk,coe3]=Yk_com(lk_pre,Alk,Yk_pre,coe3);
Ik=lk_com(Dk,Yk);
%自适应量化并编码输出
Yk_pre=Yk;
Srk_pre_pre=Srk_pre;
Sek_pre=Sek;
Ylk_pre_pre=Ylk_pre;
Ik_pre=Ik;
coe2
(1)=Yk;
coe2(6)=Srk_pre;
coe2
(2)=Sek;
coe2(4)=Ylk_pre;
coe2(3)=Ik;
Dqk
(1)=Dqk
(2);
Dqk
(2)=Dqk(3);
Dqk(3)=Dqk(4);
Dqk(4)=Dqk(5);
Dqk(5)=Dqk(6);
Dqk(6)=Dqk(7);
自适应逆量化器输出
重建信号输出
Dqk(7)=Dqk_com(Ik_pre,Yk_pre);
Srk_pre=Srk_com(Dqk(7),Sek_pre);
%coe2(5)=Srk_pre;
%自适应速度控制与自适应预测子函数function[h,coe1]=Alk_com(lk_pre,Yk_pre,coe1,Tdk_pre,Trk_pre)Dmsk_p2=coe1
(1);
Dmlk_p2=coe1
(2);
Apk_pre2=coe1(3);
Dmsk_p1=(1-2A(-5))*Dmsk_p2+2A(-5)*fi_result(abs(Ik_pre));
Dmlk_p1=(1-2A(-7))*Dmlk_p2+2A(-7)*fi_result(abs(Ik_pre));
coe1
(1)=Dmsk_p1;
coe1
(2)=Dmlk_p1;
if((abs(Dmsk_p1-Dmlk_p1)>
=2A(-3)*Dmlk_p1)|(Yk_pre<
3)|(Tdk_pre==1))
Apk_pre仁(1-2A(-4))*Apk_pre2+2A(-3);
if(Trk_pre==1)
Apk_pre仁1;
Apk_pre仁(1-2A(-4))*Apk_pre2;
end
coe1(3)=Apk_pre1;
ifApk_pre1>
=1
Alk=1;
Alk=Apk_pre1;
h=Alk;
%采样值与其估计值差值计算奇函数
functiond=Dk_com(Slk,Sek);
Dk=Slk-Sek;
d=Dk;
%自适应逆量化器输出子函数
functionf=Dqk_com(lk,Yk)
ifIk>
=0
Dqsk=0;
i=Ik;
Dqsk=1;
i=-Ik;
switchi
case7
Dqlnk=3.32;
case6
Dqlnk=2.91;
case5
Dqlnk=2.52;
case4
Dqlnk=2.13;
case3
Dqlnk=1.66;
case2
Dqlnk=1.05;
case1
Dqlnk=0.031;
case0
Dqlnk=-1000;
%日一化输出
Dqlk=Dqlnk+Yk;
Dqk=2ADqlk;
ifDqsk==1
Dqk=-Dqk;
f=Dqk;
%自适应预测中f函数值计算子函数
functionb=f_com(a)
ifabs(a)<
=0.5
b=4*a;
b=2*sgn_com(a);
%速度控制中F[l(k)]计算子函数
functionw=fi_result(in)
switchin
fi=0;
fi=1;
fi=3;
fi=7;
w=fi;
%自适应量化并编码输出子函数
functionf=lk_com(Dk,Yk)
ifDk>
Dsk=0;
Dsk=1;
ifDk==0
Dk=Dk+0.0001;
Dlk=log(abs(Dk))/log
(2);
Dlnk=Dlk-Yk;
x=Dlnk;
a=10;
ifDlnk<
-0.98
lk=0;
if-0.98<
=Dlnk&
Dlnk<
0.62
lk=1;
if0.62<
=DInk&
DInk<
1.38
lk=2;
if1.38<
1.91
lk=3;
if1.91<
2.34
lk=4;
if2.34<
2.72
lk=5;
if2.72<
3.12
lk=6;
ifDink>
=3.12
lk=7;
ifDsk==1
lk=-lk;
f=lk;
%自适应预测子函数
function[g,f]=Sek_com(Srk_pre,Srk_pre_pre,Dqk,coe)
a1_pre=coe
(1);
a2_pre=coe
(2);
b1_pre=coe(3);
b2_pre=coe(4);
b3_pre=coe(5);
b4_pre=coe(6);
b5_pre=coe(7);
b6_pre=coe(8);
Sezk_pre=coe(9);
p_pre2=coe(10);
p_pre3=coe(11);
%六阶零点预测器系数
b1=(1-2A(-8))*b1_pre+2A(-7)*sgn_com(Dqk(7))*sgn_com(Dqk(6));
b2=(1-2A(-8))*b2_pre+2A(-7)*sgn_com(Dqk(7))*sgn_com(Dqk(5));
b3=(1-2A(-8))*b3_pre+2A(-7)*sgn_com(Dqk(7))*sgn_com(Dqk(4));
b4=(1-2A(-8))*b4_pre+2A(-7)*sgn_com(Dqk(7))*sgn_com(Dqk(3));
b5=(1-2A(-8))*b5_pre+2A(-7)*sgn_com(Dqk(7))*sgn_com(Dqk
(2));
b6=(1-2A(-8))*b6_pre+2A(-7)*sgn_com(Dqk(7))*sgn_com(Dqk
(1));
9二阶极点预测器系数
Sezk=b1*Dqk(7)+b2*Dqk(6)+b3*Dqk(5)+b4*Dqk(4)+b5*Dqk(3)+b6*Dqk
(2);
p_pre1=Dqk(7)+Sezk_pre;
ifabs(p_pre1)<
=0.000001;
a1=(1-2A(-8))*a1_pre;
a2=(1-2A(-7))*a2_pre;
a仁(1-2A(-8))*a1_pre+(3*2A(-8))*sgn_com(p_pre1)*sgn_com(p_pre2);
a2=(1-2A(-7))*a2_pre+2A(-7)*(sgn_com(p_pre1)*sgn_com(p_pre3)-f_com(a1_pre)*sgn_com(p_pre1)*sgn_com(p_pre2));
%自适应预测和重建信号计算器
coe
(1)=a1;
coe
(2)=a2;
coe(3)=b1;
coe(4)=b2;
coe(5)=b3;
coe(6)=b4;
coe(7)=b5;
coe(8)=b6;
coe(9)=Sezk;
coe(10)=p_pre1;
coe(11)=p_pre2;
g=(a1*Srk_pre+a2*Srk_pre_pre+Sezk);
f=coe;
%sgn_com函数
functionb=sgn_com(a)
ifa>
=0.000001
b=1;