(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第六章内容,有兴趣的读者请阅读原书)
clear all
nsamp=10;%每个脉冲信号的抽样点数
s0=ones(1,nsamp);%基带脉冲信号,其中s0的信号为1,1,1,1,1,1,1,1,1,1
s1=[1 1 1 1 1 -1 -1 -1 -1 -1];%s1的信号为1,1,1,1,1,-1,-1,-1,-1,-1
nsymbol=100000;%每种信噪比下的发送符号数
EbN0=0:12;%信噪比
msg=randi([0,1],1,nsymbol);%消息比特
s00=zeros(nsymbol,1);
s11=zeros(nsymbol,1);
indx=find(msg==0);%比特0在发送消息中的位置
s00(indx)=1;%将含有信号0的位置设置为标志1
s00=s00*s0;%比特0影射为发送波形s0
indx1=find(msg==1);%比特1在发送消息中的位置
s11(indx1)=1;%将含有信号1的位置设置为标志1
s11=s11*s1;%比特1映射为发送波形s1(1)
s=s00+s11;%总的发送波形
s=s.';%数据转置,方便接收端处理
for indx=1:length(EbN0)
decmsg=zeros(1,nsymbol);
r=awgn(s,EbN0(indx)-7);%发送信号通过AWGN信道(2)
r00=s0*r;%对s0进行互相关处理
r11=s1*r;%与s1进行互相关处理
indx1=find(r11>=r00);%当r11>r00时,证明判决结果是s1,当r11<r00时,证明判决结果是s0
decmsg(indx1)=1;%判决(3)
[err,ber(indx)]=biterr(msg,decmsg);%得到误比特率
end
semilogy(EbN0,ber,'-ko',EbN0,qfunc(sqrt(10.^(EbN0/10))));%(4)
title('二进制正交信号误比特率性能')
xlabel('EbN0');ylabel('误比特率Pe')
legend('仿真结果','理论结果')
(1):映射规则如下:
(2)发射信号通过AWGN
(3)互相关处理
由图6-2,可知,得到信号r(t)后让r(t)对s0和s1做互相关,若一个位置s0的互相关结果比s1的互相关结果大,那么这个位置可以被判决为s0,反之可以判决为s1。
(4)这里计算差错概率时,我们已知的是信噪比是dB形式,而在计算时需要转化成倍数形式
公式为: 倍数=根号下(10^(分贝/10));(见公式6-11)
clear all
nsamp=10;
s0=ones(1,nsamp);
s1=-s0;%双极性信号,s1=-s0
nsymbol=100000;
EbN0=0:10;
msg=randi([0,1],1,nsymbol);%消息比特
s00=zeros(nsymbol,1);
s11=zeros(nsymbol,1);
indx=find(msg==0);
s00(indx)=1;
s00=s00*s0;
indx1=find(msg==1);
s11(indx1)=1;
s11=s11*s1;
s=s00+s11;
s=s';
for indx=1:length(EbN0)
decmsg=zeros(1,nsymbol);
r=awgn(s,EbN0(indx)-7);
r00=s0*r;%只需要和s0进行相关
indx1=find(r00<0);
decmsg(indx1)=1;
[err,ber(indx)]=biterr(msg,decmsg);
end
semilogy(EbN0,ber,'-ko',EbN0,qfunc(sqrt(10.^(EbN0/10))),'-k*',EbN0,qfunc(sqrt(2*10.^(EbN0/10))));
title('双极性信号误比特率性能')
xlabel('EbN0');ylabel('误比特率Pe')
legend('仿真结果','正交信号误理论误比特率','双极性信号误理论误比特率')
例6.4和6.1的区别是,因为s0和s1是双极性信号,所以判决时只需要求一个互相关的情况,然后与0比较即可得出结果。
clear all
nsamp=10;
s1=ones(1,nsamp);
s0=zeros(1,nsamp);
nsymbol=100000;
EbN0=0:10;
msg=randi([0,1],1,nsymbol);%消息比特
s00=zeros(nsymbol,1);
s11=zeros(nsymbol,1);
indx=find(msg==0);
s00(indx)=1;
s00=s00*s0;
indx1=find(msg==1);
s11(indx1)=1;
s11=s11*s1;
s=s00+s11;
s=s';
for indx=1:length(EbN0)
decmsg=zeros(1,nsymbol);
r=awgn(s,EbN0(indx)-7);
r00=s1*r;%只需要和s0进行相关
indx1=find(r00>5);
decmsg(indx1)=1;
[err,ber(indx)]=biterr(msg,decmsg);
end
semilogy(EbN0,ber,'-ko',EbN0,qfunc(sqrt(10.^(EbN0/10)/2)),EbN0,qfunc(sqrt(10.^(EbN0/10))),'-k*',EbN0,qfunc(sqrt(2*10.^(EbN0/10))));
title('单极性信号在AWGN信道下的误比特率性能')
xlabel('Eb/N0');ylabel('误比特率Pe')
legend('单极性信号仿真结果','单极性信号信号误理论误比特率','正交信号误理论误比特率','双极性信号误理论误比特率')
这里的s0设置成了0 0 0 0 0 0 0 0 0 0(即只有n(t))
s1为1 1 1 1 1 1 1 1 1 1(s(t)和n(t))
因为阈值是信号能量Eb/2,所以s(t)的能量=10*1的平方=10;10/2=5,所以阈值为5
clear all
nsymbol=100000;
nsamp=10;
M=4;
graycode=[0 1 3 2];
EsN0=0:15;
msg=randi([0,3],1,nsymbol);
msg1=graycode(msg+1);%格雷码映射
msg2=pammod(msg1,M);%4-PAM调制
s=rectpulse(msg2,nsamp);%矩形脉冲成形
for indx=1:length(EsN0)
decmsg=zeros(1,nsymbol);
r=awgn(real(s),EsN0(indx)-7,'measured');%(1)
r1=intdump(r,nsamp);%相关器输出
%y=intdump(x,nsamp)对信号x进行一个符号周期的积分,然后将平均值输出到y中。nsamp是每个符号的采样数。
msg_demod=pamdemod(r1,M);%判决
decmsg=graycode(msg_demod+1);%格雷码逆映射
[err,ber(indx)]=biterr(msg,decmsg,log2(M));%求误比特率
[err,ser(indx)]=symerr(msg,decmsg);
end
semilogy(EsN0,ber,'-ko',EsN0,ser,'-k*',EsN0,1.5*qfunc(sqrt(0.4*10.^(EsN0/10))));
title('4-PAM信号在AWGN信道下的性能')
xlabel('Es/N0');ylabel('误比特率和误符号率')
legend('误比特率','误符号率','理论误符号率')
(1):
awgn函数默认对PAM信号添加的是复数噪声,因此,使用real函数说明添加的是实数噪声。
之前在信道仿真那篇文章中提到了QPSK信号的传输
再加上上题可以得到PSK类型信号的调制解调方法(文章链接见下)
产生发送符号->格雷编码映射->使用pskmod函数进行调制->使用rectpulse进行矩形脉冲成形->加上干扰/噪声(传输过程)->采用intdump函数进行矩形脉冲成形的逆过程(相关器输出)->格雷码逆映射->恢复原信号