文档库 最新最全的文档下载
当前位置:文档库 › PCM编解码的MATLAB实现

PCM编解码的MATLAB实现

PCM编解码的MATLAB实现
PCM编解码的MATLAB实现

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);

相关文档