简述:利用matlab进行对三种调制方式进行理论值与实际值的对比仿真。
clc
clear
%参数设定
SNR_dB=-10:1:10;
SNR=10.^(SNR_dB/10);
N=100000;
t=0:0.02:4; %fefine the interval of the s0 and s1
w1=2*pi;
w2=4*pi;
A=2;
%2PSK调制
s0_2PSK=A*sin(w1*t);s1_2PSK=-A*sin(w1*t); %设定s0和s1
%2FSK调制
s0_2FSK=A*sin(w1*t);s1_2FSK=A*sin(w2*t);
%2ASK调制
s0_2ASK=zeros(1,length(t));s1_2ASK=A*sin(w1*t); %
%每个码元的能量
E_2PSK=sum(s0_2PSK.^2);
E_2FSK=(sum(s0_2FSK.^2)+sum(s1_2FSK.^2))/2;
E_2ASK=sum(s1_2ASK.^2);
%错误个数的数组初始化
error_2PSK=zeros(1,length(SNR));
error_2FSK=zeros(1,length(SNR));
error_2ASK=zeros(1,length(SNR));
%误码率数组初始化
Pe_2PSK_actual=zeros(1,length(SNR));
Pe_2FSK_actual=zeros(1,length(SNR));
Pe_2ASK_actual=zeros(1,length(SNR));
for i=1:length(SNR) %在每个snr对应下的Pe
source=randi([0,1],1,N); %randi 生成伪随机整数0或着1
%噪声的能量
n0_2PSK=E_2PSK/SNR(i); %已知信噪比和码元能量,计算对应的噪声能量 SNR=E/N0
n0_2FSK=E_2FSK/SNR(i);
n0_2ASK=E_2ASK/SNR(i); %标准差
for j=1:N; %白噪声方差等于功率 红色为方差,均值为0,因为没加m
%生成噪声 %randn产生正态分布的随机数或矩阵的函数
noise_2PSK=sqrt(n0_2PSK/2)*randn(1,length(t));
noise_2FSK=sqrt(n0_2FSK/2)*randn(1,length(t));
noise_2ASK=sqrt(n0_2ASK/2)*randn(1,length(t));
%如果发送的为0,收到码元后判决为1,则出错。
if source(j)==0
%2PSK的判决 积分,但是因为是离散序列只能逐点求和
I_2PSK=sum((s0_2PSK+noise_2PSK).*(s1_2PSK-s0_2PSK));
beta_2PSK=0;%判决门限
if I_2PSK>beta_2PSK
error_2PSK(i)=error_2PSK(i)+1;
end
%2FSK的判决
I_2FSK=sum((s0_2FSK+noise_2FSK).*(s1_2FSK-s0_2FSK));
beta_2FSK=0.5*(sum(s1_2FSK.^2)-sum(s0_2FSK.^2));%判决门限
if I_2FSK>beta_2FSK
error_2FSK(i)=error_2FSK(i)+1;
end
%2ASK的判决
I_2ASK=sum((s0_2ASK+noise_2ASK).*(s1_2ASK-s0_2ASK));
beta_2ASK=0.5*sum(s1_2ASK.^2);%判决门限
if I_2ASK>beta_2ASK
error_2ASK(i)=error_2ASK(i)+1;
end
else %如果发送的为1,收到码元后判决为0,则出错。
%2PSK的判决
I_2PSK=sum((s1_2PSK+noise_2PSK).*(s1_2PSK-s0_2PSK));
beta_2PSK=0;%判决门限
if I_2PSK<beta_2PSK
error_2PSK(i)=error_2PSK(i)+1;
end
%2FSK的判决
I_2FSK=sum((s1_2FSK+noise_2FSK).*(s1_2FSK-s0_2FSK));
beta_2FSK=0.5*(sum(s1_2FSK.^2)-sum(s0_2FSK.^2));%判决门限
if I_2FSK<beta_2FSK
error_2FSK(i)=error_2FSK(i)+1;
end
%2ASK的判决
I_2ASK=sum((s1_2ASK+noise_2ASK).*(s1_2ASK-s0_2ASK));
beta_2ASK=0.5*sum(s1_2ASK.^2);%判决门限
if I_2ASK<beta_2ASK
error_2ASK(i)=error_2ASK(i)+1;
end
end
end
%误码率的计算
Pe_2PSK_actual(i)=error_2PSK(i)/N;
Pe_2FSK_actual(i)=error_2FSK(i)/N;
Pe_2ASK_actual(i)=error_2ASK(i)/N;
end
%绘制仿真的Pe的曲线
semilogy(SNR_dB,Pe_2PSK_actual,'+');hold on;
semilogy(SNR_dB,Pe_2FSK_actual,'o');hold on;
semilogy(SNR_dB,Pe_2ASK_actual,'*');hold on;
%理论的Pe
Pe_2PSK_theory=0.5*erfc(sqrt(SNR));
Pe_2FSK_theory=0.5*erfc(sqrt(0.5*SNR));
Pe_2ASK_theory=0.5*erfc(sqrt(0.25*SNR));
%绘制理论的Pe的曲线
semilogy(SNR_dB,Pe_2PSK_theory,'r-');hold on;
semilogy(SNR_dB,Pe_2FSK_theory,'g-');hold on;
semilogy(SNR_dB,Pe_2ASK_theory,'b-');hold on;
legend('2PSK-actual','2FSK-actual','2ASK-actual','2PSK-theory','2FSK-theory','2ASK-theory');
grid on;
xlabel('E/n0(dB)');ylabel('误码率Pe');
title('2PSK,2FSK,2ASK误码性能比较');