自学内容网 自学内容网

matlab仿真 数字信号载波传输(上)

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真   刘学勇编著第七 章内容,有兴趣的读者请阅读原书)

 

clear all
nsymbol=100000;%每种信噪比下的发送符号数
T=1;%符号周期
fs=100;%每个符号的采样点数
ts=1/fs;%采样时间间隔
t=0:ts:T-ts;%时间矢量
fc=10;%载波频率
c=sqrt(2/T)*cos(2*pi*fc*t);%载波信号(1)

M=4;%4-PAM
graycode=[0 1 3 2];%格雷编码准则
EsN0=0:15;%信噪比,Es/N0
snr1=10.^(EsN0/10);%信噪比转化为线性值
msg=randi([0 3],1,nsymbol);%消息数据
msg1=graycode(msg+1);%格雷映射        
msgmod=pammod(msg1,M).';%基带4-PAM调制

tx=msgmod*c;%载波调制(2)
tx1=reshape(tx.',1,length(msgmod)*length(c));
spow=norm(tx1).^2/nsymbol;%求每个符号的平均功率(3)
for indx=1:length(EsN0)
    sigma=sqrt(spow/(2*snr1(indx)));%加入高斯白噪声(4)
    rx=tx1+sigma*randn(1,length(tx1));
    rx1=reshape(rx,length(c),length(msgmod));
    y=(c*rx1)/length(c);%相关运算(5)
    y1=pamdemod(y,M);
    decmsg=graycode(y1+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*snr1)));(6)
title('4-PAM载波信号在AWGN信道下的性能');
xlabel('Es/N0');ylabel('误比特率和误符号率')
legend('误比特率','误符号率','理论误符号率')

(1)由式7-4可知,传输信号的波形需要乘上根号下(2/T),保证PAM信号不是带限的.

(2)由式7-6可知,调制信号等于PAM调制乘上载波信号

(3)norm是求范数,其中默认情况是求二范数,二范数求后再平方等于幅度值的平方和,即符号的能量,除以符号的长度即为符号的功率。

(4)这里是用信噪比和信号功率求出噪声幅度,首先在求功率的时候使用了幅度的平方,所以最外面需要加上根号

个人理解为在计算噪声幅度时使用的是白噪声的功率谱密度进行计算,而信噪比的计算使用的是噪声的功率,两者的关系为:白噪声的功率谱密度=噪声功率/2。

(5)rx1是已调信号,c是载波,即为对载波进行互相关运算(式7-9)

(6)见式7-12,其中由于是PAM,所以式子中的M=4

 

 

 

clear all
nsymbol=100000;%每种信噪比下的发送符号数
T=1;%符号周期
fs=100;%每个符号的采样点数
ts=1/fs;%采样时间间隔
t=0:ts:T-ts;%时间矢量
fc=10;%载波频率
c=sqrt(2/T)*exp(j*2*pi*fc*t);%载波信号

c1=sqrt(2/T)*cos(2*pi*fc*t);
c2=-sqrt(2/T)*sin(2*pi*fc*t);
M=8;%8-PSK
graycode=[0 1 2 3 6 7 4 5];%格雷编码准则
EsN0=0:15;%信噪比,Es/N0
snr1=10.^(EsN0/10);%信噪比转化为线性值
msg=randi([0 7],1,nsymbol);%消息数据
msg1=graycode(msg+1);%格雷映射        
msgmod=pskmod(msg1,M).';%基带8-PSK调制

tx=real(msgmod*c);%载波调制(1)
tx1=reshape(tx.',1,length(msgmod)*length(c));
spow=norm(tx1).^2/nsymbol;%求每个符号的平均功率
for indx=1:length(EsN0)
    sigma=sqrt(spow/(2*snr1(indx)));%加入高斯白噪声
    rx=tx1+sigma*randn(1,length(tx1));
    rx1=reshape(rx,length(c),length(msgmod));
    r1=(c1*rx1)/length(c1);%相关运算
    r2=(c2*rx1)/length(c2);%相关运算
    r=r1+j*r2;
    y=pskdemod(r,M);
    decmsg=graycode(y+1);
    [err,ber(indx)]=biterr(msg,decmsg,log2(M));%误比特率
    [err,ser(indx)]=symerr(msg,decmsg);%误符号率
end
ser1=2*qfunc(sqrt(2*snr1)*sin(pi/M));
ber1=1/log2(M)*ser1;    
semilogy(EsN0,ber,'-ko',EsN0,ser,'-k*',EsN0,ser1,EsN0,ber1,'-k.');
title('8-PSK载波信号在AWGN信道下的性能');
xlabel('Es/N0');ylabel('误比特率和误符号率')
legend('误比特率','误符号率','理论误符号率','理论误比特率')

8-PSK与4-PAM的区别有以下几点

首先是采用的格雷码映射方式更多了;在调制时直接与复载波相乘,在解调时则需要同时与同向载波和正交载波求互相关,构造r=r1+j*r2后才能进行psk解调。

(1)注意这里,和载波相乘后还要取实部,这里和PAM是不同的,PAM在和载波相乘后是不需要取实部的,关键在于两种信号的定义式,由式7-13可知,在与载波相乘后前面还要用Re进行处理(即取实部),而根据式7-3,PAM在与载波相乘后是不需要取实部的。

 

clear all
M=4;
msg=[1 2 3 0 3 2 1 1];%(2)
ts=0.01;
T=1;
t=0:ts:T;
x=0:ts:length(msg);
fc=1;
c=sqrt(2)*exp(j*2*pi*fc*t);%(1)
msg_psk=pskmod(msg,M).';
msg_dpsk=dpskmod(msg,M).';
tx_psk=real(msg_psk*c);
tx_psk=reshape(tx_psk.',1,length(msg)*length(t));
tx_dpsk=real(msg_dpsk*c);
tx_dpsk=reshape(tx_dpsk.',1,length(msg)*length(t));
subplot(2,1,1)
plot(x,tx_psk(1:length(x)));%(3)
title('4PSK信号波形')
xlabel('时间t'),ylabel('载波振幅')
subplot(2,1,2)
plot(x,tx_dpsk(1:length(x)))
title('4DPSK波形')
xlabel('时间t'),ylabel('载波振幅')  

(1):这里需要乘上sqrt(2/T),又因为T=1,所以直接乘上根号2

(2):这里因为已经经过gray编码了,相较于上题省略了步骤

(3):这里需要画出信号的波形,画图横坐标为t,纵坐标为载波振幅

值得注意的是,其中x的长度为801,而tx_psk的长度为808;两者不相等

首先,一个符号传递的时间为T=1秒,所以一共有8个符号(PSKMOD处理后信号的长度不变,仍然是8个),所以整个信号传输共8秒,这里的抽样时间间隔为0.01,所以理论上一共有800个点,实际上t为101,就是因为算上了0这个点,在x的向量中也算上了0这个点,所以长为801,但是在进行载波调制的时候使用的是用t构造出来的c(长度也为101)和msg_psk(长度为8)相乘,结果出现了808的长度,

本质原因是x和t两个表示时间的向量相互之间长度并不是8倍的关系

个人建议可以修改为

clear all
M=4;
msg=[1 2 3 0 3 2 1 1];
ts=0.01;%抽样时间间隔
T=1;
t=0:ts:T-ts;
x=0:ts:length(msg)-ts;
fc=1;
c=sqrt(2)*exp(j*2*pi*fc*t);
msg_psk=pskmod(msg,M).';
msg_dpsk=dpskmod(msg,M).';
tx_psk=real(msg_psk*c);
tx_psk=reshape(tx_psk.',1,length(msg)*length(t));
tx_dpsk=real(msg_dpsk*c);
tx_dpsk=reshape(tx_dpsk.',1,length(msg)*length(t));
subplot(2,1,1)
plot(x,tx_psk(1:length(x)));
title('4PSK信号波形')
xlabel('时间t'),ylabel('载波振幅')
subplot(2,1,2)
plot(x,tx_dpsk(1:length(x)))
title('4DPSK波形')
xlabel('时间t'),ylabel('载波振幅') 

这样x和dpsk的长度均为800,也比较好解释图像的物理意义,x上的两个点之间的距离就代表一个抽样时间间隔0.01,8个符号中每个符号都取样了100次,所以表示8个符号一共使用了800个点。

从此例子来看,dpsk和psk调制方式近似,只不过是使用的函数不一致,一个是pskmod,另一个是dpskmod

clear all
nsymbol=100000;
M=8;
graycode=[0 1 2 3 6 7 4 5];
EsN0=5:20;
snr1=10.^(EsN0/10);
msg=randi([0,7],1,nsymbol);
msg1=graycode(msg++1);
msgmod=dpskmod(msg1,M);
spow=norm(msgmod).^2/nsymbol;
for indx=1:length(EsN0)
    sigma=sqrt(spow/(2*snr1(indx)));
    rx=msgmod+sigma*(randn(1,length(msgmod))+j*randn(1,length(msgmod)));%(1)
    y=dpskdemod(rx,M);
    decmsg=graycode(y+1);
    [err,ber(indx)]=biterr(msg(2:end),decmsg(2:end),log2(M));
    [err,ser(indx)]=symerr(msg(2:end),decmsg(2:end));
end
ser1=2*qfunc(sqrt(snr1)*sin(pi/M));
ber1=1/log2(M)*ser1;
semilogy(EsN0,ber,'-ko',EsN0,ser,'-k*',EsN0,ser1,EsN0,ber1,'-k.');
title('8-DPSK载波调制信号在AWGN信道下的性能')
xlabel('Es/N0');ylabel('误比特率和误符号率')
legend('误比特率','误符号率','理论误符号率','理论误比特率')

 这个例子中提到了基带等效的概念,本人认为就是直接在基带信号上加上了干扰,在之前7.3的例子中,我们经过格雷映射和psk调制之后还经过了载波调制,然后干扰加上已调载波上,之后对载波进行解调,但是在此例子中,我们直接在dpsk调制之后加上了干扰,没有用信号调制载波,也就是中间省略了一些调制解调的步骤。

(1)这里注意直接在基带信号上加干扰的过程,因为我们在例7.3中加上干扰信号时已经对信号取了实部,所以可以直接加上randn(式7-3),但是本例中没有取实部,所以我们需要在实部和虚部中都加上高斯白噪声的干扰(randn)


原文地址:https://blog.csdn.net/qq_55999494/article/details/140681076

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!