这里我们将简单的在Matlab中进行2ASK与2PSK的仿真,比较实际误码率与理论误码率,最终做出相应的曲线。
2ASK的仿真:
我们首先来2ASK的看一下程序框图:
产生(0,1)随机数序列这里我们使用的是Matlab中randi([imin,imax],行数,列数)函数,通过设置随机产生的范围即可得到相应的随机数序列;
添加高斯白噪声,这里我们选用的是awgn(x,snr,’measured’),这里x为需要添加噪声的序列,snr为需要的信噪比,’measured’代表的是计算输入序列的平均功率之后,按照信噪比进行添加;
抽样判决,这里抽样判决的最佳门限为b*=a/2 这里a代表的是输入的幅值大小,所以这里a设置为1,最佳噪声门限为0.5,当添加噪声的序列>0.5时我们判决为1,小于等于0.5时,我们判决为0;
进行误码率的计算,这里我们选用的是Matlab中的biterr函数,[number,ratio] = biterr(x,y),进行比较的两个数组分别为x,y,经过比较后,numbers输出的是错误个数,ratio输出的是错误率,这样我们就得到了相应信噪比下的误码率,然后我们再进行多次循环,这样就能得到相应的误码率与信噪比的关系。
循环,我们需要改变噪声与信号的信噪比,以便做出相应的曲线,这里我们选择的是以1dB每信噪比进行步进。
2ASK的公式为:
式中r代表的是解调器输入端的信噪比。
那么我们最终的到的曲线如下:
实现代码如下:
%2ASK调制
%初始化定义
clc;
clear all;
n = 100000;%需要计算的数值
jungle = zeros(n,1);
ration = zeros(16,1);
%产生二进制信号源
source = randi([0,1],n,1);
EbN0_dB = 0:1:15;
EbN0 = 10.^(EbN0_dB/10);
for i=1:16
%添加高斯白噪声
Bit_Noise = awgn(source,EbN0_dB(i),'measured');
%判决
for j=1:n
if(Bit_Noise(j)<0.5)
jungle(j) = 0;
else
jungle(j) = 1;
end
end
%计算误码率
[number,ration(i)]=biterr(source,jungle);
end
%画出2ASK相干解调的理论值与实际值曲线
BER = 1/2.*erfc(sqrt(EbN0/4));
semilogy(EbN0_dB,BER,'-or',EbN0_dB,ration,'-*b')
grid on
ylabel('Pe')
xlabel('r/dB')
title('2ASK相干解调理论值曲线与实际值曲线')
legend('2ASK理论误码率曲线','2ASK实际误码率曲线')
2PSK的仿真:
同样的首先我们先来看一下2PSK的程序流程图:
其与2ASK不同的地方在于,多了一个2PSK调制,那么我们相应的程序流程图解读如下:
产生(0,1)随机数序列这里我们使用的是Matlab中randi([imin,imax],行数,列数)函数,通过设置随机产生的范围即可得到相应的随机数序列;
进行2PSK的调制,这里我们需要将产生的随机序列进行简单的调制,当产生的随机序列为1时,我们将其调制为-1,当其产生的随机序列为0时,我们将其调制为1,这样就实现了相位调制。
添加高斯白噪声,这里我们是通过计算整个序列的平均功率,然后在平均功率的基础上进行噪声的添加。
抽样判决,这里抽样判决的最佳门限为b*=0当添加噪声的序列>0时我们判决为0,小于等于0时,我们判决为1;
进行误码率的计算,这里我们选用的是Matlab中的biterr函数,[number,ratio] = biterr(x,y),进行比较的两个数组分别为x,y,经过比较后,numbers输出的是错误个数,ratio输出的是错误率,这样我们就得到了相应信噪比下的误码率,然后我们再进行多次循环,这样就能得到相应的误码率与信噪比的关系。
循环,我们需要改变噪声与信号的信噪比,以便做出相应的曲线,这里我们选择的是以1dB每信噪比进行步进。
2PSK的公式为:
式中r代表的是解调器输入端的信噪比。
那么最终我们得到的曲线图如下:
实现代码如下:
%2PSK调制
%初始化定义
clc;
clear all;
n = 1000000;%需要计算的数值
source = zeros(n,1);
jungle = zeros(n,1);
ration = zeros(10,1);
%产生二进制信号源
a = randi([0,1],n,1);
%调制
for k=1:n
if(a(k) == 1)
source(k) = -1;
elseif (a(k) == 0)
source(k) = 1;
end
end
EbN0_dB = 0:1:9;
EbN0 = 10.^(EbN0_dB/10);
for i=1:10
Average_Power = sum(abs(source).^2)/n;
Sigma = sqrt(Average_Power*10^(-(i-1)/10));
Noise =(randn(n,1)+1i*randn(n,1))/sqrt(2);
Bit_Noise = source+Noise*Sigma;
%判决
for j=1:n
if (Bit_Noise(j)<0)
jungle(j) = 1;
else
jungle(j) = 0;
end
end
%计算误码率
[number,ration(i)]=biterr(a,jungle);
end
%画出理论2PSK相干解调的理论值与实际值曲线曲线
BER = 0.5.*erfc(sqrt(EbN0));
semilogy(EbN0_dB,BER,'-or',EbN0_dB,ration,'-*b')
grid on
ylabel('Pe')
xlabel('r/dB')
title('2PSK相干解调理论值曲线与实际值曲线')
legend('2PSK理论值曲线','2PSK实际值曲线')
完。