matlab adpcm编码,求助 求G.721 ADPCM语音编码

程序运行不了 总是出错 求助!!!!!

%主程序

clc;clear;

coe=[1,0,1,0,0,0,0,0,0,0,0];

coe1=[0,0,0];

coe2=[0,0,0,0,0,0,0,0,0,0];

coe3=[0];

Dqk=zeros(1,7);%自适应你量化器输出

fid=fopen('speech1.txt');

a=fscanf(fid,'%e\n');

fclose(fid);

fid=fopen('spp.txt','wt');%存放解码输出波形

for i=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

fclose(fid);

fid=fopen('spp.txt','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(7);

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(Ik_pre)) );   %快速非锁定标度因子计算

if   Yuk_pre<1.06

Yuk_pre=1.06;

else

if  Yuk_pre>10.00

Yuk_pre=10.00;

end

end

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( Ik_pre, Yk_pre ,coe1,Tdk_pre,Trk_pre);

%自适应速度控制与自适应预测

if  Alk<0.0

Alk=0.0;

else

if  Alk>1.0

Alk=1.0;

end

end

[Yk,coe3]=Yk_com(Ik_pre,Alk,Yk_pre,coe3);     %量化阶距自适应因子计算

Ik = Ik_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(Ik_pre,Yk_pre,coe1,Tdk_pre,Trk_pre)

Dmsk_p2=coe1(1);

Dmlk_p2=coe1(2);

Apk_pre2=coe1(3);

Dmsk_p1=(1-2^(-5))*Dmsk_p2+2^(-5)*fi_result(abs(Ik_pre));

Dmlk_p1=(1-2^(-7))*Dmlk_p2+2^(-7)*fi_result(abs(Ik_pre));

coe1(1)=Dmsk_p1;

coe1(2)=Dmlk_p1;

if ((abs(Dmsk_p1-Dmlk_p1)>=2^(-3)*Dmlk_p1)|(Yk_pre<3)|(Tdk_pre==1))

Apk_pre1=(1-2^(-4))*Apk_pre2+2^(-3);

else

if (Trk_pre==1)

Apk_pre1=1;

else

Apk_pre1=(1-2^(-4))*Apk_pre2;

end

coe1(3)=Apk_pre1;

end

if Apk_pre1>=1

Alk=1;

else

Alk=Apk_pre1;

end

h=Alk;

%采样值与其估计值差值计算奇函数

function d=Dk_com(Slk,Sek);

Dk=Slk-Sek;

d=Dk;

%自适应逆量化器输出子函数

function f=Dqk_com(Ik,Yk)

if Ik>=0

Dqsk=0;

i=Ik;

else

Dqsk=1;

i=-Ik;

end

switch i

case 7

Dqlnk=3.32;

case 6

Dqlnk=2.91;

case 5

Dqlnk=2.52;

case 4

Dqlnk=2.13;

case 3

Dqlnk=1.66;

case 2

Dqlnk=1.05;

case 1

Dqlnk=0.031;

case 0

Dqlnk=-1000;

end

%归一化输出

Dqlk=Dqlnk+Yk;

Dqk=2^Dqlk;

if Dqsk==1

Dqk=-Dqk;

end

f=Dqk;

%自适应预测中f函数值计算子函数

function b=f_com(a)

if abs(a)<=0.5

b=4*a;

else

b=2*sgn_com(a);

end

%速度控制中F[I(k)]计算子函数

function w=fi_result(in)

switch in

case 0

fi=0;

case 1

fi=0;

case 2

fi=0;

case 3

fi=1;

case 4

fi=1;

case 5

fi=1;

case 6

fi=3;

case 7

fi=7;

end

w=fi;

%自适应量化并编码输出子函数

function f=Ik_com(Dk,Yk)

if Dk>0

Dsk=0;

else

Dsk=1;

end

if Dk==0

Dk=Dk+0.0001;

end

Dlk=log(abs(Dk))/log(2);

Dlnk=Dlk-Yk;

x=Dlnk;

a=10;

if Dlnk

Ik=0;

end

if -0.98<=Dlnk&Dlnk<0.62

Ik=1;

end

if 0.62<=Dlnk&Dlnk<1.38

Ik=2;

end

if 1.38<=Dlnk&Dlnk<1.91

Ik=3;

end

if 1.91<=Dlnk&Dlnk<2.34

Ik=4;

end

if 2.34<=Dlnk&Dlnk<2.72

Ik=5;

end

if 2.72<=Dlnk&Dlnk<3.12

Ik=6;

end

if Dlnk>=3.12

Ik=7;

end

if Dsk==1

Ik=-Ik;

end

f=Ik;

%自适应预测子函数

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-2^(-8))*b1_pre+2^(-7)*sgn_com(Dqk(7))*sgn_com(Dqk(6));

b2=(1-2^(-8))*b2_pre+2^(-7)*sgn_com(Dqk(7))*sgn_com(Dqk(5));

b3=(1-2^(-8))*b3_pre+2^(-7)*sgn_com(Dqk(7))*sgn_com(Dqk(4));

b4=(1-2^(-8))*b4_pre+2^(-7)*sgn_com(Dqk(7))*sgn_com(Dqk(3));

b5=(1-2^(-8))*b5_pre+2^(-7)*sgn_com(Dqk(7))*sgn_com(Dqk(2));

b6=(1-2^(-8))*b6_pre+2^(-7)*sgn_com(Dqk(7))*sgn_com(Dqk(1));

%二阶极点预测器系数

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;

if abs(p_pre1)<=0.000001;

a1=(1-2^(-8))*a1_pre;

a2=(1-2^(-7))*a2_pre;

else

a1=(1-2^(-8))*a1_pre+(3*2^(-8))*sgn_com(p_pre1)*sgn_com(p_pre2);

a2=(1-2^(-7))*a2_pre+2^(-7)*(sgn_com(p_pre1)*sgn_com(p_pre3)-f_com(a1_pre)*sgn_com(p_pre1)*sgn_com(p_pre2));

end

%自适应预测和重建信号计算器

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函数

function b=sgn_com(a)

if a>=0.000001

b=1;

else

b=-1;

end

%重建信号输出子函数

function Srk=Srk_com(Dqk,Sek)

Srk=Dqk+Sek;

%单频信号判定子函数

function Tdk=Tdk_com(A2k)

if (A2k

Tdk=1;

else

Tdk=0;

end

Tdk=Tdk;

%窄带信号顺便判定子函数

function Trk=Trk_com(A2k,Dqk,Ylk)

if (A2kpow(24.2,Ylk))

Trk=1;

else

Trk=0;

end

Trk=Trk;

%量化器标度因子自适应wi的选取子函数

function J=wi_result(in)

switch in

case 0

wi=-0.75;

case 1

wi=1.13;

case 2

wi=2.56;

case 3

wi=4.00;

case 4

wi=7.00;

case 5

wi=12.38;

case 6

wi=22.19;

case 7

wi=70.13;

end

J=wi;

%量化阶矩自适应因子计算子函数

function [Yk,coe3]=Yk_com(Ik_pre,Alk,Yk_pre,coe3);

Yl_pre_pre=coe3;

Yu_pre=(1-2^(-5))*Yk_pre+2^(-5)*wi_result(abs(Ik_pre));

Yl_pre=yl_result(Yl_pre_pre,Yu_pre);

coe3=Yl_pre;

Yk=Alk*Yu_pre+(1-Alk)*Yl_pre;

%锁定标度因子计算子函数

function yl=yl_result(yl_pre,yu_now)

yl=(1-2^(-6))*yl_pre+2^(-6)*yu_now;

yl=yl;

%快速非锁定标度因子计算子函数

function yu=yu_result(y_now,wi_now)

yu=(1-2^(-5))*y_now+2^(-5)*wi_now;

yu=yu;

错误提示

??? Error using ==> plot

Vectors must be the same lengths.

Error in ==> d at 23

plot(a);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值