%修改抽样间隔和程序最后两行
%可以观察量化输入输出关系
n=input('请输入量化级数,k=[8]');
if isempty(n),
n=8;
end
%产生题目要求的函数
endtime = 2; %结束时间
dt = 0.1; %抽样间隔
t = 0:dt:endtime;
a = zeros(size(t)); %产生一个长度为N的全0序列
for tt=1:1/dt
a(tt+[0:endtime/2-1]*(2/dt))=t(tt); %t when 0 <= t < 1
end
for tt=1/dt+1:2/dt
a(tt+[0:endtime/2-1]*(2/dt))=2-t(tt); % -t+2 when 1 <= t < 2
end;
%A率非线性
A = 87.56;
amax=max(abs(a));
c = zeros(size(a));
for i = 1:length(a);
if((a(i)/amax)<=1/A)
c(i) = A*a(i)/(1+log(A));
end
if((a(i)/amax)>1/A)
c(i) = (1+log(A*a(i)))/(1+log(A));
end
end
%均匀量化
c_quan=c;
b_quan=c_quan;
d=1/n;%量化间隔
q=d.*[1:n];
q=q-d/2;%量化电平
for i=1:n
%定位第i个量化间隔码子
c_quan(find((q(i)-d/2<=c_quan) & (c_quan<=q(i)+d/2)))=...
q(i).*ones(1,length(find((q(i)-d/2<=c_quan)&(c_quan<=q(i)+d/2))));
%赋值为相应的量化电平
b_quan(find(c_quan==q(i))) =(i-1) .* ones(1,length(find(c_quan==q(i))));
end
nu=ceil(log2(n));%编码
code=zeros(length(a),nu);
for i=1:length(a)
for j=nu:-1:0
if (fix(b_quan(i)/(2^j))==1)
code(i,(nu-j))=1;
b_quan(i)=b_quan(i)-2^j;
end
end
end
%A率非线性的逆运算
for i = 1:length(c_quan);
if( (c_quan(i)) <= 1/(1+log(A)) )
a_quan(i) = (1+log(A))*c_quan(i)/A;
end
if((c_quan(i))>1/A)
a_quan(i) = exp((1+log(A))*c_quan(i)-1)/A;
end
end
sqnr=20*log10(norm(a)/norm(a-a_quan));%求量化信噪比
disp('量化信噪比')
disp(sqnr)
disp('量化误差')
disp(a - a_quan)
disp('编码结果')
disp(code)
plot(t,a,'r-')
hold on;
plot(t,a_quan,'.b')
%plot(t,a_quan,'b-')
%axis([0 1 0 1])