clc;
close all;
clear all;
%**************************
FS=20;%码元速率
TS=1/FS;
L=100;%采样总时间100秒
N=50;%每个码元持续的个数
t=(0:FS*L*N-1)/(FS*N);%时间坐标
%**************************
%r=[zeros(1,FS*L/4),ones(1,FS*L/2),zeros(1,FS*L/4)];
%r=[1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 ];%验证数列HDB3编码结果应为
% [-10 0 0-1 1 0 0 0 1-1 1-1 0 0-1 1 0 0 1-1 1 ]
figure(1)
subplot(321)
r=randsrc(1,FS*L,[0 1]);%ones(1,FS*L)%
showR=reshape(ones(N,1)*r,1,[]);
stairs(t,showR),grid on;
title('原始基带信号');
axis([0 1 -.2 1.2])
subplot(322)
FW=abs(pwelch(showR));
yt=(FS*N/2)*(0:length(FW)-1)/length(FW);
plot(yt,FW,'r'),grid
title('原始基带信号的功率谱密度');
axis([0 80 0 20])
subplot(323)
h=zeros(1,length(r));
flag1=-1;%1的正负极性标志位
flag0=0;%0个数的计数标志位
flag0v=0;%V的正负极性标志位
flagn0=-1;%前一个非零脉冲极性标志位
for i=1:length(r)
if r(i)==1
h(i)=flag1;
flagn0=h(i);%非零脉冲极性标志位置数
flag1=-flag1;%1的标志位转换极性
end
if r(i)==0
if (i>1)&(r(i-1)==0)
flag0=flag0+1;%0计数器加1
else
flag0=1;
end
if flag0<4
h(i)=0;
end
if flag0==4
if flag0v==0
h(i)=-flag1;
flagn0=h(i);%非零脉冲极性标志位置数
flag0v=flag1;
else
if flag0v==flagn0 %判断是V极性标志位所应该的极性是否与前一个非零脉冲极性标志位相同
h(i)=flag0v;
flagn0=h(i);%非零脉冲极性标志位置数
else %如果不同则曾加B转换位
h(i-3)=flag0v;
h(i)=flag0v;
flagn0=h(i);%非零脉冲极性标志位置数
end
flag0v=-flag0v;
end
flag0=0;
end
end
end
HDB=reshape(ones(N,1)*h,1,[]);
stairs(t,HDB),grid on;
title('经过HDB3编码以后的信号');
axis([0 1 -1.2 1.2])
subplot(324)
FW=abs(pwelch(HDB));
yt=(FS*N/2)*(0:length(FW)-1)/length(FW);
plot(yt,FW),grid
title('经过HDB3编码以后的功率谱密度');
axis([0 80 0 20])
subplot(325)
y0=fft(HDB);
low=0;%带通滤波器低频为(FS*N/2)*0/length(y1)=0Hz
high=2000;%带通滤波器高频为(FS*N/2)*2000/length(y1)=10Hz
bpf1=[zeros(1,low),ones(1,high-low),zeros(1,length(y0)-2*high),ones(1,high-low),zeros(1,low)];
y1=real(ifft(y0.*bpf1));
plot(t,y1),grid on;
title('经过波形变换以后的信号');
axis([0 1 -1.5 1.5])
subplot(326)
FW=abs((pwelch(y1)));
yt=(FS*N/2)*(0:length(FW)-1)/length(FW);
plot(yt,FW),grid
title('经过波形变换以后的信号功率谱密度');
axis([0 80 0 20])
figure(2)
subplot(321)
y2=y1+normrnd(0,1,1,length(y1));
plot(t,y2),grid;
title('增加功率为1的加性白噪声以后的信号');
axis([0 1 -5 5])
subplot(322)
FW=abs(pwelch(y2));
yt=(FS*N/2)*(0:length(FW)-1)/length(FW);
plot(yt,FW),grid
title('经过信道以后的信号功率谱密度');
axis([0 100 0 20])
subplot(323)
y3=fft(y2);
low=0;%带通滤波器低频为(FS*N/2)*000/length(y1)=0Hz
high=2000;%带通滤波器高频为(FS*N/2)*2000/length(y1)=10Hz
bpf2=[zeros(1,low),ones(1,high-low),zeros(1,length(y0)-2*high),ones(1,high-low),zeros(1,low)];
y4=real(ifft(y3.*bpf2));
plot(t,y4),grid on;
title('经过LPF以后的信号');
axis([0 1 -1.5 1.5])
subplot(324)
FW=abs(pwelch(y4));
yt=(FS*N/2)*(0:length(FW)-1)/length(FW);
plot(yt,FW),grid
title('经过LPF以后的功率谱密度');
axis([0 100 0 20])
subplot(325)
SOV=zeros(1,length(y4));
for i=1:length(y4)
if i==25
if y4(i)>.79
SOV(i:i+50)=1;
elseif y4(i)<-.81
SOV(i:i+50)=-1;
else
SOV(i:i+50)=0;
end
end
if mod(i+25,50)==0
if y4(i)>.79
SOV(i:i+50)=1;
elseif y4(i)<-.81
SOV(i:i+50)=-1;
else
SOV(i:i+50)=0;
end
end
end
stairs(t,HDB,'rx'),grid on;
axis([0 1 -1.5 1.5]);
hold on;
stairs((0:length(SOV)-25)/(FS*N),SOV(25:length(SOV))),grid on;
axis([0 1 -1.5 1.5]);
title('经过抽样判决后的信号');
subplot(326)
H=(bpf1.*bpf2);
yt=(FS*N/2)*(0:length(H)-1)/length(H);
stairs(yt,H,'x'),grid on
axis([0 40 -.2 1.5]);
title('带通频域特性曲线');
figure(3)
subplot(211)
y5=reshape(SOV(25:100024),50,[]);
y6=y5(1,:);
flag1=1;
for i=1:length(y6)
if y6(i)==0
ENDS(i)=0;
else
if y6(i)==-flag1
ENDS(i)=1;
flag1=-flag1;
else
ENDS(i)=0;
if ENDS(i-3)~=0
ENDS(i-3)=0;
flag1=-flag1;
end
end
end
end
stairs(t,showR/2,'rx'),grid on;
hold on
y7=reshape(ones(N,1)*ENDS,1,[]);
stairs(t,y7),grid on;
legend('红色为原始信号的1/2')
title('经过HDB3解码以后的信号');
axis([0 1 -.2 1.2])
subplot(212)
ER=r-ENDS;
count0=zeros(1,length(ER));
for i=1:length(ER)
if ER(i)~=0
count0(i)=1;
end
end
COUN=sum(count0)/length(ER)
hist(count0),grid on
axis([.99 1 -.2 100]);
xlabel('x轴无意义')
ylabel('y轴为错误个数')
title('2000个信号中的判决错误数');