clc
% clear all
close all
fs=100;
t=1/fs:1/fs:1;
n=8;
s1=cos(2*pi*t);
s=s1/max(abs(s1)); %信号归一化
y=Alaw(s); %A律量化
[qu c] = u_quantize(y,n);
qu1=decode(c,length(s),ceil(log2(n))+1);
x=invAlaw(qu1);
x=x*max(abs(s1));
plot(t,s1)
hold on
plot(t,x,'r')
figure(2)
function y=Alaw(s0)
A=87.6;
A0=1/A;
s=abs(s0);
y=zeros(1,length(s));
y(find(s<=A0))=(A*s(find(s<=A0))/(1+log(A))).*sign(s0(s<=A0));
y(find(s>A0))=((1+log(A*s(find(s>A0))))/(1+log(A))).*sign(s0(s>A0));
function x=invAlaw(y)
A=87.6;
A0=1/A;
y0=abs(y);
index=find(y0<=1/(log(A)+1));
% x(index)=(log(A)+1)/A*y0(index).*sign(y(index));
x(index) = y0(index)*(1+log(A))/A.*sign(y(index));
index=find(y0>1/(log(A)+1));
x(index) = 1/A*exp(y0(index)*(1+log(A))-1).*sign(y(index));
% x(index)=1/A*exp(y0(index)/(1/(log(A)+1))-1).*sign(y(index));
function [qu c] = u_quantize(y0,n)
%%%%%%%%均匀量化
m=0:1/n:1;
q=m(1:n)+1/(2*n);
n1=ceil(log2(n));
y=abs(y0);
for i=1:n
qu(find((y>=m(i)) & y<=m(i+1))) = q(i);
codi(find((y>=m(i)) & y<=m(i+1))) = i-1;
end
qu=qu.*sign(y0);
%%%%%%%%编码
c=zeros(1,length(y0)*(n1+1));
for k=1:length(y0)
c((k-1)*(n1+1)+2:k*(n1+1)) = dectobin(codi(k),n1);
if y0(k)>0
c((k-1)*(n1+1)+1) = 1;
end
end
% cod=dec2bin(codi);
% [r l]=size(cod);
% for k=1:r
% c((k-1)*(l+1)+1)=sign(y0(k)+abs(y0(k)));
% for k1=2:l+1
% c((k-1)*(l+1)+k1)=str2num(cod(k,k1-1));
% end
% end
% % cod = str2num(cod);
% %%%%%%%将符号数组转换为数字
% r=ceil(log2(n+1));
% c=zeros(1,length(codi)*r);
% for k=1:length(codi)
% l=length(cod(k,:));
% for j=1:length(cod(k,:))
% c((k-1)*r+j)=str2num(cod(k,j)); % end
% end
function qu1=decode(c,N,n0)
% N=length(c)/8;
n=2^(n0-1);
m=0:1/n:1;
q=m(1:n)+1/(2*n);
% mi=zeros(1,N);
for i=1:N
mi=bintodec(c((i-1)*n0+2:i*n0));
qu1(i)=q(mi+1);
if c((i-1)*n0+1)==0
qu1(i)=-qu1(i);