✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
个人主页:Matlab科研工作室
个人信条:格物致知。
更多Matlab仿真内容点击
智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统
信号处理 图像处理 路径规划 元胞自动机 无人机
调制方式:QPSK和16QAM是两种常见的调制方式,您需要确定您要使用的调制方式。
信道模型:通信信道的选择对误码率有很大影响,常见的信道模型有AWGN信道和Rayleigh衰落信道等。
编码方案:误码率仿真通常需要使用纠错编码方案来提高系统的可靠性,您可以选择使用卷积码、LDPC码等。
一般的误码率仿真流程如下:
生成调制信号:根据所选的调制方式,生成需要传输的数据比特序列,并进行对应的调制操作。
加入噪声:根据选择的信道模型,为调制信号添加合适的噪声,通常使用高斯白噪声(AWGN)。
解调与译码:将接收到的信号进行解调操作,并对解调后的数据进行译码操作,以还原原始数据比特序列。
计算误码率:将解码后的数据比特序列与发送的原始数据比特序列进行比对,计算误码率。
重复以上步骤多次:为了提高仿真的准确性,通常需要多次重复以上步骤,并取平均值作为最终的误码率结果。
% 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
[1] 马启成.QPSK调制下基于均值判决的误码率仿真[J].中国新通信, 2020, 22(19):2.
[2] 赵忠华,杨晓梅.GMSK调制解调的MATLAB仿真与误码率分析[J].新疆师范大学学报:自然科学版, 2015, 34(2):6.DOI:10.3969/j.issn.1008-9659.2015.02.013.
[3] 张起晶,孙桂芝.基于QPSK调制的扩频系统MATLAB仿真[J].现代科学仪器, 2014(1):3.DOI:CNKI:SUN:XDYQ.0.2014-01-017.
[4] 谭清元,潘学文.QPSK和16QAM调制下MIMO-OFDM系统Matlab仿真实现[J].电脑知识与技术:学术版, 2019, 15(12):2.