MATLAB在通信系统仿真中的注意

原文链接:(更多文章移步链接)

MATLAB在通信系统仿真中的注意 - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/46668425

1.调用函数fourier和ifourier之前,需用syms命令对所用到的变量进行说明,即将这些变量说明成符号变量。

clear all
syms t;
f=t*exp(-abs(t));
subplot(121);ezplot(f);
F=fourier(f);
subplot(122);ezplot(abs(F));

2.采用fourier和ifourier得到的返回函数,仍是符号表达式。若作图,应用ezplot而不是plot。若返回函数有如狄拉克函数 \delta(t) 等。则用ezplot也无法作图。

clear all
syms t w;
F=pi*exp(-abs(w));
subplot(121);ezplot(abs(F));
f=ifourier(F,t);%因为返回是关于x的函数,所以指定返回t的函数。
subplot(122);ezplot(f);

plot是绘制二维图形,并且是x,y的表达式是已知的或者是形如y=f(x)这样确切的表达式,而ezplot是画出形如f(x,y)=0这种隐函数图形。

3.严格的说,只有非周期信号才有Fourier变换。(不满足绝对可积)但若满足Dirichlet条件,可展开为Fourier级数。 X(k\Omega_{0})是k次谐波处的Fourier系数。 X(k\Omega_{0}) 是谐波幅度的概念, X(j\Omega) 是频谱密度的概念。

4.离散时间信号的Fourier变换,两个特点:

(1)变换是用于无限长的序列;

(2)变换的结果是自变量 \omega 的连续函数。

*两个序列的循环卷积序列:

clear all
h=[6 3 4 2 1 -2];%产生信号序列
x=[3 2 6 7 -1 -3];
h1=fliplr(h);
H=toeplitz(h,[h(1) h1(1:5)]);
y=H*x';

H=fft(h);
X=fft(x);
Y=H.*X;
y1=ifft(Y);

subplot(211);stem(y);title('直接计算')
subplot(212);stem(y1);title('DFT计算')

*DFT对应循环卷积而不对应线性卷积。若用DFT进行线性卷积,需对两长度分别为M,L的序列都扩展为长度为M+L-1的新序列。例子及程序如下:

clear all
n1=0:20;
n2=0:10;
%%直接法
h=sinc(0.2*n1);%两序列
x=exp(-0.2*n2);
y=conv(x,h);
%%DFT法
h1=[h zeros(1,length(x)-1)];
x1=[x zeros(1,length(h)-1)];
H1=fft(h1);
X1=fft(x1);
Y1=H1.*X1;
y1=ifft(Y1);

subplot(211);stem(y);title('直接计算')
subplot(212);stem(y1);title('DFT计算')

5.加性高斯白噪声(AWGN)表现为信号围绕平均值的一种随机波动过程。加性高斯白噪声的均值为0,方差为噪声功率的大小。一般情况下,噪声功率越大,信号的波动幅度越大,接收端接收到的信号的误比特率就越高。

awgn(x,snr)%把加性高斯白噪声叠加到输入信号中,snr以dB的形式指定噪声的功率

*awgn函数使用方法:

awgn将白色高斯噪声添加到信号中

语法

y = awgn(x,snr)

y = awgn(x,snr,sigpower)

y = awgn(x,snr,'measured')

y = awgn(x,snr,sigpower,state)

y = awgn(x,snr,'measured',state)

y = awgn(...,powertype)

描述

y = awgn(x,snr)将白高斯噪声添加到向量信号x中。标量snr指定了每一个采样点信号与噪声的比率,单位为dB。如果x是复数的,awgn将会添加复数噪声。这个语法假设x的能量是0dBW。

y = awgn(x,snr,sigpower)和上面的语法相同,除了sigpower是x的能量,单位为dBW。

y = awgn(x,snr,'measured')和y = awgn(x,snr)是相同的,除了agwn在添加噪声之前测量了x的能量。

y = awgn(x,snr,sigpower,state)和y = awgn(x,snr,sigpower)是相同的,除了awgn首先重置了正态随机数产生器randn的状态为整数状态。

y = awgn(x,snr,'measured',state)和y = awgn(x,snr,'measured')是相同的,除了awgn首先重置了正态随机数产生器randn的状态为整数状态。

y = awgn(...,powertype)和前面的语法相同,除了字符串powertype指定了snr和sigpower的单位。powertype的选择有'db' and 'linear',如果powertype是'db',那么snr是按照dB为单位测量的,sigpower是按照dBW为单位测量的。如果powertype是线性的,snr是按照一个比率测量的,sigpower是以瓦特为单位测量的。Relationship Among SNR, Es/N0, and Eb/N0

对于SNR和其他的噪声相对能量测量的关系,查看Describing the Noise Level of an AWGN Channel。

clear all
t=0:0.001:10;
x=sin(2*pi*t);
snr=20;%噪声功率为20dBW
y0=awgn(x,snr);%将高斯白噪声叠加到信号上
y1=awgn(x,snr,10);%y1=awgn(x,snr,sigpower)假设了输入信号功率为sigpower单位dBW
y2=awgn(x,snr,'measured');%首先计算输入信号的功率,然后按照snr添加相应的高斯白噪声
subplot(411);plot(t,x);title('正弦信号x');
subplot(412);plot(t,y0);title('叠加了高斯白噪声后的正弦信号0');%若未说明输入信号功率,则假设为0dBW
subplot(413);plot(t,y1);title('叠加了高斯白噪声后的正弦信号1');%因为输入信号实际功率(输入函数是0.5)小于10dBW,图是根据给出的输入信号功率画的
subplot(414);plot(t,y2);title('叠加了高斯白噪声后的正弦信号2');%(添加的噪声功率根据实际给出输入信号的信号功率计算得出)

z0=y0-x;
var(z0);%均方差

6.上面的例子太简单,下面看这样一个例子:

*仿真正交相移键控(QPSK)调制的基带数字通信系统通过AWGN信道的误符号率(SER)和误比特率(BER),假设发射端信息比特采用Gray编码影射,基带脉冲采用矩形脉冲,仿真时每个脉冲的采样点数为8,接收端采用匹配滤波器进行相干解调。

代码如下:

%% 
%                    .::::.
%                  .::::::::.
%                 :::::::::::  
%             ..:::::::::::'
%           '::::::::::::'
%             .::::::::::
%        '::::::::::::::..
%             ..::::::::::::.
%           ``::::::::::::::::
%            ::::``:::::::::'        .:::.
%           ::::'   ':::::'       .::::::::.
%         .::::'      ::::     .:::::::'::::.
%        .:::'       :::::  .:::::::::' ':::::.
%       .::'        :::::.:::::::::'      ':::::.
%      .::'         ::::::::::::::'         ``::::.
%  ...:::           ::::::::::::'              ``::.
% ```` ':.          ':::::::::'                  ::::..
%                    '.:::::'                    ':'````..
%
clear all
nSamp=8;%矩形脉冲的采样点数
numSymb=200000;%每种SNR下传输的符号数
M=4;%QPSK的符号类型数
SNR=-3:3;%SNR的范围
grayencod=[0 1 3 2 ];%Gray编码格式
for ii=1:length(SNR)
    msg=randsrc(1,numSymb,[0:3]);%产生发送符号,1行numSymb列0-3的数。
    msg_gr=grayencod(msg+1);%进行Gray编码影射(格雷码)
    msg_tx=pskmod(msg_gr,M);%QPSK调制
    msg_tx=rectpulse(msg_tx,nSamp);%矩形脉冲成型
    msg_rx=awgn(msg_tx,SNR(ii),'measured');%通过AWGN信道
    msg_rx_down=intdump(msg_rx,nSamp);%匹配滤波相干解调
    msg_gr_demod=pskdemod(msg_rx_down,M);%QPSK解调
    [dummy graydecod]=sort(grayencod);graydecod=graydecod-1;
    msg_demod=graydecod(msg_gr_demod+1);%Gray编码逆映射
    [errorBit BER(ii)]=biterr(msg,msg_demod,log2(M));%计算BER
    [errorSym SER(ii)]=symerr(msg,msg_demod);%计算SER
end
scatterplot(msg_tx(1:100))%画出发射信号星座图
title('发射信号星座图')
xlabel('同相分量')
ylabel('正交分量')
scatterplot(msg_rx(1:100))%画出接收信号星座图
title('接收信号星座图')
xlabel('同相分量')
ylabel('正交分量')
figure
semilogy(SNR,BER,'-r*',SNR,SER,'-r*')%画出BER和SER随SNR变化的曲线
legend('BER','SER')
title('QPSK在AWGN信道下的性能')
xlabel('信噪比(dB)')
ylabel('误符号率和误比特率')

*仿真8-PSK载波调制信号在AWGN信道下的误码率和误比特率性能,并与理论值比较。假设符号周期为1s,载波频率为10Hz,每个符号周期内采样100个点。程序如下:

clear all
nsymbol=10000;	%每种信噪比下的发送符号数
T=1;	%符号周期
fs=100;	%每个符号的采样点数
ts=1/fs;	%采样时间间隔
t=0:ts:T-ts;	%时间向量
fc=10;	%载波频率
c=sqrt(2/T)*exp(j*2*pi*fc*t);	%载波信号
figure(1),plot(t,c);
c1=sqrt(2/T)*cos(2*pi*fc*t);	%同相载波
figure(2),plot(t,c1);
c2=-sqrt(2/T)*sin(2*pi*fc*t);	%正交载波	
figure(3),plot(t,c2);				
M=8;	%8-PSK		
graycode=[0 1 2 3 6 7 4 5];		%Gray编码规则
EsN0=0:15;	%信噪比, Es/N0
snr1=10.^(EsN0/10);		%信噪比转换为线性值,倍数
msg=randint(1,nsymbol,M);			%消息数据
msg1=graycode(msg+1);			%Gray映射,将序列msg+1编成格雷码取出
figure(4),plot(msg,msg1);				
msgmod=pskmod(msg1,M).';		%基带 8-PSK调制
figure(5),scatterplot(msgmod);			
tx=real(msgmod*c);		%载波调制
tx1=reshape(tx.',1,length(msgmod)*length(c));	% B = reshape(A,m,n)  将矩阵A的元素返回到一个m×n的矩阵B。
figure(6),plot(tx1);				
spow=norm(tx1).^2/nsymbol;		%求每个符号的平均功率,n=norm(A)返回A的最大奇异值,即max(svd(A))
for indx=1:length(EsN0)				
sigma=sqrt(spow/(2*snr1(indx)));		%根据符号功率求噪声功率				
rx=tx1+sigma*randn(1,length(tx1));	%加入高斯白噪声,randn 生成标准正态分布的伪随机数(均值为0,方差为1)
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);	%PSK解调
decmsg=graycode(y+1);
[err,ber(indx)]=biterr(msg,decmsg,log2(M));	%误比特率,biterr(x,y)是比特的误码率,symerr(x,y)是符号的,在二进制时,它两一样
[err,ser(indx)]=symerr(msg,decmsg);	%误符号率
end
ser1=2*qfunc(sqrt(2*snr1)*sin(pi/M));	%理论误符号率,误差函数
ber1=1/log2(M)*ser1;	%理论误比特率
figure(7),semilogy(EsN0,ber,'-ko',EsN0,ser,'-k*',EsN0,ser1,EsN0,ber1,'-k.');%semilogx函数,semilogy函数,即后标为x的是在x轴取对数,为y的是y轴坐标取对数。
title('8-PSK载波调制信号在AWGN信道下的性能')
xlabel('Es/N0');ylabel('误比特率和误符号率')
legend('误比特率','误符号率','理论误符号率','理论误比特率')

7.matlab中各种线型-颜色-标记点

各种颜色属性选项

'r' 红色 'm' 粉红

'g' 绿色 'c' 青色

'y' 黄色 'k' 黑色

各种线型属性选项

'-' 实线 '--' 虚线

':' 点线 '-.' 点划线

各种标记点属性选项

'.' 用点号绘制各数据点 '^' 用上三角绘制各数据点

'+' 用'+'号绘制各数据点 'v' 用下三角绘制各数据点

'*' 用'*'号绘制各数据点 '>' 用右三角绘制各数据点

' .' 用'.'号绘制各数据点 '<' 用左三角绘制各数据点

's'或squar 用正方形绘制各数据点'p' 用五角星绘制各数据点

'd'或diamond用菱 形绘制各数据点 'h' 用六角星绘制各数据点

这些选项可以连在一起用,如:'-.g'表示绘制绿色的点划线,'g+'表示用绿

色的 '+'号绘制曲线.

注意:

1)表示属性的符号必须放在同一个字符串中;

2)可同时指定2~3个属性;

3) 与先后顺序无关;

4)指定的属性中,同一种属性不能有两个以上.

猜你喜欢

转载自blog.csdn.net/qq_41687938/article/details/89515059