(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真 刘学勇编著第四章内容,有兴趣的读者请阅读原书)
1.加性高斯白噪声信道(AWGN )
clear all
t=0:0.001:10;
x=sin(2*pi*t);%原始信号
snr=20;%设定加性白噪声的功率
y1=awgn(x,snr);%在原始信号上叠加白噪声
subplot(2,1,1);plot(t,x);title('正弦信号x');
subplot(2,1,2);plot(t,y1);title('叠加了高斯白噪声后的正弦信号');
z=y1-x;
var(z);%计算方差figure
y2=awgn(x,snr,10);%在y1的基础上设定了输入信号的功率为10
subplot(2,1,1);plot(t,x);title('正弦信号x');
subplot(2,1,2);plot(t,y2);title('叠加了高斯白噪声后的正弦信号');figure
y3=awgn(x,snr,'measured');%将10改为measured,添加的噪声功率根据实际的信号功率计算得到
subplot(2,1,1);plot(t,x);title('正弦信号x');
subplot(2,1,2);plot(t,y3);title('叠加了高斯白噪声后的正弦信号');y4=awgn(x,snr,'measured',10)%添加随机数种子,当种子相同时,产生的加性白噪声的结果相同,所以y4和y6相同
y5=awgn(x,snr,'measured',9)
y6=awgn(x,snr,'measured',10)
clear all
nSamp=8;%矩形脉冲的取样点数,基带脉冲就是数字信号,每个数字信号都采用8个采样点
numSymb=200000; %每种信噪比下传输的符号数
M=4;%QPSK的符号类型数
SNR=-3:3;%信噪比的范围
grayencod=[0 1 3 2];%gray编码形式,00,01,11,10
for ii=1:length(SNR)%每个信噪比都循环一次msg=randsrc(1,numSymb,[0:3]);%产生发送符号,因为采用QPSK进行调制,每2个比特映射一个发送符号,因此共有4种类型%的发送符号,分别用0-3代表发送比特00、01、11、10msg_gr=grayencod(msg+1);%加1是因为matlab中的数组索引值不能是0,所以+1确保索引值是正整数msg_tx=pskmod(msg_gr,M);%4PSK就是QPSKmsg_tx=rectpulse(msg_tx,nSamp);%矩形脉冲成形函数,每个脉冲用8个采样点进行采样msg_rx=awgn(msg_tx,SNR(ii),'measured');%添加高斯白噪声msg_rx_down=intdump(msg_rx,nSamp);%匹配滤波相干解调%y = intdump(x,nsamp) 对信号 x 进行一个符号周期的积分,然后将平均后的一个值输出到 Y 中。对于二维信号,函数将每列视为一个通道%个人理解是将8个采样点中的平均值作为解调的结果,与rectpulse函数对应msg_gr_demod=pskdemod(msg_rx_down,M);%qpsk解调,与pskmod函数相对应[dummy graydecod]=sort(grayencod);%[B,I] = sort(___) 还会为上述任意语法返回一个索引向量的集合。I 的大小与 A 的大小相同,%它描述了 A 的元素沿已排序的维度在 B 中的排列情况。例如,如果 A 是一个向量,则 B = A(I)。I是索引数组graydecod=graydecod-1;%索引数组[1-4]->[0-3]msg_demod=graydecod(msg_gr_demod+1);%gray解码,用索引数组进行映射实现gray的反映射[errorBit BER(ii)]=biterr(msg,msg_demod,log2(M));[errorSym SER(ii)]=symerr(msg,msg_demod);%BER和SER的求解
end
scatterplot(msg_tx(1:100));
title('发射信号星座图');
xlabel('同相分量');
ylabel('正交分量');
scatterplot(msg_rx(1:100));
title('接收信号星座图');
2.加性高斯白噪声信道(randn )
clear all
t=0:0.001:10;
x=sin(2*pi*t);
px=norm(x).^2/length(x);%计算信号x的功率
snr=20;%信噪比,dB形式
pn=px./(10.^(snr./10));%db公式:10 lg(SNR)=DB,倒推得到噪声公式
n=sqrt(pn)*randn(1,length(x));%由噪声功率得到高斯白噪声序列,因为计算功率时需要幅度平方,所以在求幅度时需要功率开根号
y=x+n;
subplot(2,1,1);plot(t,x);title('正弦信号x');
subplot(2,1,2);plot(t,y);title('叠加了高斯白噪声的正弦信号');var(n);
3.simulink中的AWGN模块仿真
(见下一篇)
4.多径衰落信道
(这里的书上的定义较多,此处不进行摘录)
fuction [h]=rayleigh(fd,t)
%该程序利用改进的jakes模型来产生单径的平坦型瑞利衰落信道
%输入变量说明
%fd:信道的最大多普勒频移,单位HZ
%t:信号的抽样时间序列
%h:输出的瑞利信道函数,是一个时间函数复序列%假设的入射波数目N=40;wm=2*pi*fd;%每个象限的入射波数目即振荡器数目N0=N/4;%信道函数的实部Tc=zeros(1,length(t));%信道函数的虚部Ts=zeros(1,length(t));%归一化功率系数P_nor=sqrt(1/N0);%区别各条路径的均匀分布随机相位theta=2*pi*rand(1,1)-pi;for ii=1:N0%第i条入射波的入射角alfa(ii)=(2*pi*ii-pi+theta)/N%对每个子载波而言在(-pi,pi)之间均匀分布的随机相位fi_tc=2*pi*randn(1,1)-pi;fi_ts=2*pi*randn(1,1)-pi;%计算冲击响应函数Tc=Tc+cos(cos(alfa(ii))*wm*t+fi_tc);Ts=Ts+cos(cos(alfa(ii))*wm*t+fi_ts);end%乘归一化功率系数得到传输系数h=P_nor*(Tc+j*Ts);
这里的代码是书上直接给出的,本人还不能理解,这里直接将其作为产生瑞利衰落的已知函数进行使用(后面瑞利衰落信号的产生都需要用到这个代码)
clear all
fd=10;
ts=1/1000;
t=0:ts:1;
h1=rayleigh(fd,t);fd=20;
h2=rayleigh(fd,t);
subplot(2,1,1),plot(20*log10(abs(h1(1:1000))));
title('fd=10Hz时的信道功率曲线')
xlabel('时间');ylabel('功率')
subplot(2,1,2),plot(20*log10(abs(h2(1:1000))));%20lg()是信道公式
title('fd=20Hz时的信道功率曲线')
xlabel('时间');ylabel('功率')
clear all
nSamp=8;%矩形脉冲的取样点数,基带脉冲就是数字信号,每个数字信号都采用8个采样点
numSymb=10000; %每种信噪比下传输的符号数
M=4;%QPSK的符号类型数
SNR=-3:3;%信噪比的范围
ts=1/(numSymb*nSamp);
t=(0:numSymb*nSamp-1)*ts;
grayencod=[0 1 3 2];%gray编码形式,00,01,11,10
for ii=1:length(SNR)%每个信噪比都循环一次msg=randsrc(1,numSymb,[0:3]);%产生发送符号,因为采用QPSK进行调制,每2个比特映射一个发送符号,因此共有4种类型%的发送符号,分别用0-3代表发送比特00、01、11、10msg_gr=grayencod(msg+1);%加1是因为matlab中的数组索引值不能是0,所以+1确保索引值是正整数msg_tx=pskmod(msg_gr,M);%4PSK就是QPSKmsg_tx=rectpulse(msg_tx,nSamp);%矩形脉冲成形函数,每个脉冲用8个采样点进行采样h=rayleigh(10,t);msg_tx1=h.*msg_tx;msg_rx=awgn(msg_tx,SNR(ii));%添加高斯白噪声msg_rx1=awgn(msg_tx1,SNR(ii));%添加高斯白噪声msg_rx_down=intdump(msg_rx,nSamp);%匹配滤波相干解调msg_rx_down1=intdump(msg_rx1,nSamp);msg_gr_demod=pskdemod(msg_rx_down,M);msg_gr_demod1=pskdemod(msg_rx_down1,M);[dummy graydecod]=sort(grayencod);graydecod=graydecod-1;%索引数组[1-4]->[0-3]msg_demod=graydecod(msg_gr_demod+1);msg_demod1=graydecod(msg_gr_demod1+1);[errorBit BER(ii)]=biterr(msg,msg_demod,log2(M));[errorBit1 BER1(ii)]=biterr(msg,msg_demod1,log2(M));[errorSym SER(ii)]=symerr(msg,msg_demod);[errorSym SER1(ii)]=symerr(msg,msg_demod1);
end
figure
semilogy(SNR,BER,'-ro',SNR,SER,'-r*',SNR,BER1,'-r.', SNR,SER1,'-r^')
legend('AWGN信道BER','AWGN信道SER','瑞利衰落+AWGN信道BER','瑞利衰落+AWGN信道SER')
title('QPSK在AWGN和瑞利衰落信道下的性能')
xlabel('信噪比(dB)')
ylabel('误符号率和误比特率')
这里和4.6不同的地方在于,我们在采用瑞利噪声时需要设置时间变量,这里题目已经写明信号的抽样时间间隔为1/80000s,
因为我们每个脉冲设置8个抽样点,这里发送时间只有一秒,所以就是在1秒钟发送10000个符号,每个符号采样8次,所以每次差1/80000秒,也就是信号的抽样时间间隔(这里个人理解书上的题目可能是多写了一个0,那里的多普勒频移也是多写了一个0).
之后就是瑞利衰落的影响是乘性干扰,所以这里采用点乘的方式将瑞利干扰叠加在信号上。
个人理解为,
rayleigh函数施加影响需要点乘;
rayleighchan函数需要利用filter进行滤波,两者函数底层代码的实现方式不同,所以使用的方式也不同
5.simulink中的多径衰落信道模块仿真
(见下一篇文章)