MATLAB实现十三折线编码
源代码:
%主函数:
function pcm()
t=0:0.1:6pi;
x=sin(t); %模拟信源
subplot(2,1,1);
plot(t,x);
title ( ‘原始模拟信号’ );
t1=0:2pi/32:6*pi; %按每周期取32个点抽样
x1=sin(t1);
subplot(2,1,2);
plot(t1,x1);
stem(t1,x1);
title ( ‘抽样信号’ );
x2=zhexian_(x1); %13折线
x3=bianma(x2); %调用编码函数
x1
x2
x3
%编码函数
`function y=bianma(x)
z=sign(x);
x=x/max(x); %归一化
x=abs(x); %取绝对值
x=2048*x;
x=fix(x); %量化,靠0取整
y=zeros(length(x),8); %储存矩阵(全零)
%段落码判断
for m=1:length(x)
if x(m)>128&&x(m)<2048 %在第五段与第八段之间,段落码第一位为1
y(m,2)=1;
end
if (x(m)>32&&x(m)<128)||(x(m)>512&&x(m)<2048)%在第三第四第七第八段内,段落码第二位为1
y(m,3)=1;
end
if (x(m)>16&&x(m)<32)||(x(m)>64&&x(m)<128)||(x(m)>256&&x(m)<512)||(x(m)>1024&&x(m)<2048)%在第二第四第六第八段内,段落码第三位为1
y(m,4)=1;
end
%符号位判断
if z(m)>0 %符号为正,符号位为1
y(m,1)=1;
else if z(m)<0 %符号为负,符号位为0
y(m,1)=0;
end
end
%段内码判断
n=zeros(length(x));
for m=1:length(x)
n(m)=y(m,2)*4+y(m,3)*2+y(m,4)+1; %找到位于第几段
end
a=[0,16,32,64,128,256,512,1024]; %量化间隔
b=[1,1,2,4,8,16,32,64]; %除以16,得到每段最小的量化间隔
for m=1:length(x)
q=ceil((x(m)-a(n(m)))/b(n(m))); %求出在段内的位置
if q==0
y(m,(5:8))=[0,0,0,0]; %输入为0,输出为0
else k=num2str(dec2bin(q-1,4)); %段内码编码为二进制
y(m,5)=str2num(k(1));
y(m,6)=str2num(k(2));
y(m,7)=str2num(k(3));
y(m,8)=str2num(k(4));
end
end
end`
编码结果:
抽样值:
对应十三折线值:
编码值: