function p=upcm()
%此函数无需返回值,只是完成一些画图的功能,它调用了许多子程序,包括编码译码,误码序号产生程序。它画出信号编码前和译码后的时域信号和频谱图,以u律的15折线图,用于u律的编译码
%
%
mu=0;
sigma=1;
m=1;
n=1000;
t=1:1000;
fh=1000;
fs=1000000
v=normrnd(mu,sigma,m,n); 产生随机正态分布
w=2*pi*(1:1000).*fh./fs; 采样频率
figure(1);
stem(t,v);
axis([0,1000,-5,5]);
xlabel('t');
ylabel('v(t)');
title('原始时域信号');
xk=fft(v);
figure(2);
stem(w,xk);
axis([0,2*pi,-50,50]);
xlabel('w');
ylabel('v(k)');
title('原始信号频谱');
x=(2.^(1:8)-1)./255
y=0.125:0.125:1;
figure(3);
subplot(2,1,1);
plot(x,y);
axis([0,1,0,1]);
xlabel('x');
ylabel('y=f(x)');
title('u律15折线');
x=0:0.001:1;
y=log2(1+x.*255)./log2(1+255);
subplot(2,2,3);
plot(x,y);
axis([0,1,0,1]);
xlabel('x');
ylabel('y=f(x)');
title('u律对数特性');
for k1=1:1000
b1=v(k1);
[bm1,ju2]=bianma(b1);
ju(k1)=ju2;
if k1==1
bm=bm1;
else
bm=char(bm,bm1);
end
end
k=8;
wn=wmxl(k)
for l=1:8
k0=wn(l);
chuli=bm(k0,:);
fz=chuli(l)
if fz=='1'
chuli(l)='0';
else chuli(l)='1';
end
bm(k0,:)=chuli;
end
for k1=1:1000
x1=bm(k1,:);
ym(k1)=yima(x1);
end
subplot(2,2,4);
stem(v,ju);
axis([-1,1,-130,130]);
xlabel('输入x');
ylabel('输出y');
title('输入输出关系图');
t=1:1000;
figure(4);
subplot(2,1,1);
stem(t,ym);
axis([0,1000,-5,5]);
xlabel('t');
ylabel('v1(t)');
title('解码时域信号');
xv=fft(ym);
w=2*pi*(1:1000).*fh./fs;
subplot(2,1,2);
stem(w,xv);
axis([0,2*pi,-50,50]);
xlabel('w');
ylabel('v1(k)');
title('解码频谱');
%----------------- 以下都为子程序------------------------------------------
%--------------------------------------------------------------------------
function [bm,ju]= bianma(b1)
%用于将十进制编成二进制
% bm 编码输出
% b1 输入参数
%
%
%
a1=3.2;
a0=4079.5*b1./a1;
if b1<0
s='0';
else
s='1';
end;
a2=abs(a0);
if a2<=15.5
c1=fix(a2+0.5);
d1='000';
e1=dec2bin(c1,4);
p=strcat(d1,e1);
else if a2<=47.5
b2=a2-15.5;
c2=fix(b2./2);
d2='001';
e2=dec2bin(c2,4);
p=strcat(d2,e2);
else if a2<=111.5
b3=a2-47.5;
c3=fix(b3./4);
d3='010';
e3=dec2bin(c3,4);
p=strcat(d3,e3);
else if a2<=239.5
b4=a2-111.5;
c4=fix(b4./8);
d4='011';
e4=dec2bin(c4,4);
p=strcat(d4,e4);
else if a2<=495.5
b5=a2-239.5;
c5=fix(b5./16);
d5='100';
e5=dec2bin(c5,4);
p=strcat(d5,e5);
else if a2<=1007.5
b6=a2-495.5;
c6=fix(b6./32);
d6='101';
e6=dec2bin(c6,4);
p=strcat(d6,e6);
else if a2<=2031.5
b7=a2-1007.5;
c7=fix(b7./64);
d7='110';
e7=dec2bin(c7,4);
p=strcat(d7,e7);
else
b8=a2-2031.5;
c8=fix(b8./128);
d8='111';
e8=dec2bin(c8,4);
p=strcat(d8,e8);
end;
end
end
end
end
end
end
end
ju1=bin2dec(p);
if s=='1'
ju=ju1;
else ju=-ju1;
end
bm=strcat(s,p);
%-------------------------------------------------------------------------
function ym=yima(x1)
%将二进制编码译成输出电平
%ym 译码输出
%x1 编码序列
%
%
%
a0=3.2;
jy=x1(1);
dl=x1(2:4);
dl0=bin2dec(dl);
dp=x1(5:8);
dp0=bin2dec(dp);
switch dl0
case 0
yl=dp0*1;
case 1
yl=dp0*2+16.5;
case 2
yl=dp0*4+49.5;
case 3
yl=dp0*8+115.5;
case 4
yl=dp0*16+247.5;
case 5
yl=dp0*32+511.5;
case 6
yl=dp0*64+1039.5;
case 7
yl=dp0*128+2095.5;
end
jg=yl*a0./4097.5;
if jy=='1'
ym=jg;
else
ym=-jg;
end
%--------------------------------------------------------------------------
function wn=wmxl(k)
%产生误码序列的编号
%k 码字长度
%
wn=fix(1000*rand(1,k))