% BER-(Eb/N0)性能曲线:
% 参数处理
EbNo_BER_DB = 0:0.1:60;
gamma_BER_DB = EbNo_BER_DB+10*log10(2);
EbNo_BER = 10.^(EbNo_BER_DB/10);
gamma_BER = 10.^(gamma_BER_DB/10);
% QPSK理论误比特率:
PB_QPSK = IA(1,gamma_BER); % QPSK理论误比特率------BER-(Eb/N0)曲线
semilogy(EbNo_BER_DB,PB_QPSK);
axis([0,60,1e-6,1])
grid on
xlabel('Eb/No');
ylabel('BER');
hold on
% QPSK实际误比特率:
BitSeq_QPSK_BER=randi([0,1],[5120000,2]); % 生成比特序列
SymbolSeq_QPSK_BER=bi2de(BitSeq_QPSK_BER,'left-msb'); %比特序列转化为符号序列
ModulatedSeq_QPSK_BER=qammod(SymbolSeq_QPSK_BER,4); %调制后的信号序列
H_QPSK_BER = 1/sqrt(2)*(randn(length(SymbolSeq_QPSK_BER),1) + 1i*randn(length(SymbolSeq_QPSK_BER),1)); % Rayleigh channel
chanOut_QPSK_BER = H_QPSK_BER.*ModulatedSeq_QPSK_BER;
BER_QPSK = zeros([1,11]);
for ebno_qpsk=0:5:50
AWGNChannel = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Eb/No)','EbNo',ebno_qpsk,'BitsPerSymbol',2,'SignalPower',mean(abs(chanOut_QPSK_BER).^2));
outsignal_QPSK_BER=AWGNChannel(chanOut_QPSK_BER);
yHat_QPSK_BER = outsignal_QPSK_BER./H_QPSK_BER;
DemodSeq_QPSK_BER = qamdemod(yHat_QPSK_BER,4);
Rec_QPSK_BER=de2bi(DemodSeq_QPSK_BER,'left-msb');
[~,BER_QPSK(ebno_qpsk/5+1)]=biterr(Rec_QPSK_BER,BitSeq_QPSK_BER);
end
scatter(0:5:50,BER_QPSK);
hold on
% 16QAM理论误比特率:
PB_16QAM = Theory_er(EbNo_BER);% 16QAM理论误比特率------BER-(Eb/N0)曲线
semilogy(EbNo_BER_DB,PB_16QAM);
hold on
% 16QAM实际误比特率:
BitSeq_16QAM_BER=randi([0,1],[5120000,4]); % 生成比特序列
SymbolSeq_16QAM_BER=bi2de(BitSeq_16QAM_BER,'left-msb'); %比特序列转化为符号序列
ModulatedSeq_16QAM_BER=qammod(SymbolSeq_16QAM_BER,16); %调制后的信号序列
H_16QAM_BER = 1/sqrt(2)*(randn(length(SymbolSeq_16QAM_BER),1) + 1i*randn(length(SymbolSeq_16QAM_BER),1)); % Rayleigh channel
chanOut_16QAM_BER = H_16QAM_BER.*ModulatedSeq_16QAM_BER;
BER_16QAM = zeros([1,12]);
for ebno_16qam = 0:5:55
AWGNChannel = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Eb/No)','EbNo',ebno_16qam,'BitsPerSymbol',4,'SignalPower',mean(abs(chanOut_16QAM_BER).^2));
outsignal_16QAM_BER=AWGNChannel(chanOut_16QAM_BER);
yHat_16QAM_BER = outsignal_16QAM_BER./H_16QAM_BER;
DemodSeq_16QAM_BER = qamdemod(yHat_16QAM_BER,16);
Rec_16QAM_BER=de2bi(DemodSeq_16QAM_BER,'left-msb');
[~,BER_16QAM(ebno_16qam/5+1)]=biterr(Rec_16QAM_BER,BitSeq_16QAM_BER);
end
scatter(0:5:55,BER_16QAM);
legend('QPSK theoretical','QPSK simulated','16QAM theoretical','16QAM simulated');
title('Rayleigh')
figure
%%
% SER-(Es/N0) 性能曲线:
% 参数处理
gamma_SER_DB = 0:0.1:70;
gamma_SER = 10.^(gamma_SER_DB/10);
% QPSK理论误符号率:
PS_QPSK = 2*IA(1,gamma_SER)-I_A(1,gamma_SER); % QPSK理论误符号率------SER-(Es/N0)曲线
semilogy(gamma_SER_DB,PS_QPSK);
axis([0,70,1e-6,1])
grid on
xlabel('Es/No');
ylabel('SER');
hold on
% QPSK实际误符号率:
BitSeq_QPSK_SER=randi([0,1],[5120000,2]); % 生成比特序列
SymbolSeq_QPSK_SER=bi2de(BitSeq_QPSK_SER,'left-msb'); %比特序列转化为符号序列
ModulatedSeq_QPSK_SER=qammod(SymbolSeq_QPSK_SER,4); %调制后的信号序列
H_QPSK_SER = 1/sqrt(2)*(randn(length(SymbolSeq_QPSK_SER),1) + 1i*randn(length(SymbolSeq_QPSK_SER),1)); % Rayleigh channel
chanOut_QPSK_SER = H_QPSK_SER.*ModulatedSeq_QPSK_SER;
SER_QPSK = zeros([1,12]);
for esno_qpsk=0:5:55
AWGNChannel = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Es/No)','EsNo',esno_qpsk,'SignalPower',mean(abs(chanOut_QPSK_SER).^2));
outsignal_QPSK_SER=AWGNChannel(chanOut_QPSK_SER);
yHat_QPSK_SER = outsignal_QPSK_SER./H_QPSK_SER;
DemodSeq_QPSK_SER = qamdemod(yHat_QPSK_SER,4);
[~,SER_QPSK(esno_qpsk/5+1)]=symerr(DemodSeq_QPSK_SER,SymbolSeq_QPSK_SER);
end
scatter(0:5:55,SER_QPSK);
hold on
% 16QAM理论误符号率:
PS_16QAM = 3*IA(sqrt(1/5),gamma_SER)-9/4*I_A(sqrt(1/5),gamma_SER);
semilogy(gamma_SER_DB,PS_16QAM);
hold on
% 16QAM实际误符号率:
BitSeq_16QAM_SER=randi([0,1],[5120000,4]); % 生成比特序列
SymbolSeq_16QAM_SER=bi2de(BitSeq_16QAM_SER,'left-msb'); %比特序列转化为符号序列
ModulatedSeq_16QAM_SER=qammod(SymbolSeq_16QAM_SER,16); %调制后的信号序列
H_16QAM_SER = 1/sqrt(2)*(randn(length(SymbolSeq_16QAM_SER),1) + 1i*randn(length(SymbolSeq_16QAM_SER),1)); % Rayleigh channel
chanOut_16QAM_SER = H_16QAM_SER.*ModulatedSeq_16QAM_SER;
SER_16QAM = zeros([1,14]);
for esno_16qam=0:5:65
AWGNChannel = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (Es/No)','EsNo',esno_16qam,'SignalPower',mean(abs(chanOut_16QAM_SER).^2));
outsignal_16QAM_SER=AWGNChannel(chanOut_16QAM_SER);
yHat_16QAM_SER = outsignal_16QAM_SER./H_16QAM_SER;
DemodSeq_16QAM_SER = qamdemod(yHat_16QAM_SER,16);
[~,SER_16QAM(esno_16qam/5+1)]=symerr(DemodSeq_16QAM_SER,SymbolSeq_16QAM_SER);
end
scatter(0:5:65,SER_16QAM);
hold on
legend('QPSK theoretical','QPSK simulated','16QAM theoretical','16QAM simulated');
title('Rayleigh')
function [res] = Theory_er(EBNO)
% 计算16QAM理论误码率函数
% 输入:EBNO
% 输出:16QAM理论误码率
% 调用辅助函数 pbk(k,EBNO)
% pbk进行了改动,其中调用了IA函数
res=0;
for k=1:1:2
res=res+pbk(k,EBNO);
end
res=res/2;
end
function [res] = pbk(K,EBNO)
% 辅助函数
res = 0;
for i=0:1:((1-2^(-K))*4-1)
a=(-1)^floor((2^(K-1)*i/16));
b=2^(K-1)-floor(2^(K-1)*i/4+0.5);
c=IA((2*i+1)*sqrt(1/5),4*EBNO);
res = res+a*b*c;
end
res = res/2;
end
function [res] = IA(a,gamma)
% 函数说明:进行Q函数和I(a)函数的转换
% 输入参数:a:Q函数中sqrt(gamma)的系数;gamma:Es/No
% 输出:I(a)
res = 0.5-0.5*sqrt(a*a*gamma./(2+a*a*gamma));
end
function [res] = I_A(a,gamma)
% 函数说明:进行Q^2函数和I'(a)函数的转换
% 输入参数:a:Q函数中sqrt(gamma)的系数;gamma:Es/No
% 输出:I'(a)
a = (2+a*a*gamma)./(a*a*gamma);
temp = sqrt(a);
res = 0.25*(1-4/pi*atan(temp)./temp);
end