%仿真QAM调制信号在AWGN信道和瑞丽衰落信道下的误比特率和误符号率
%通过调整瑞利信道的最大多普勒频移和基带信号的采样时间,仿真其对衰落信道的影响
clear all;
close all;
clc;
M = 8;
N = 100000;%设置仿真中发送的符号数
% 下面创建瑞利衰落信道
bitRate = 500000; % 数据速率为 50kb/s.
FD=50;%最大多普勒频移
chan = rayleighchan(1/bitRate,FD);%设置输入信号的采样的时间和最大多普勒频移
chan.StorePathGains = 1;
% 接下来创建QAM调制和解调器
hMod = modem.qammod('M',M,'SymbolOrder','Gray'); % 创建QAM调制器
hDemod = modem.qamdemod(hMod); % 创建QAM解调器
tx = randint(N,1,M); % 产生一个随机数据序列作为发送的数据
qamSig = modulate(hMod,tx); % QAM 调制输入的数据信号为调制信号
fadedSig = filter(chan,qamSig); % 受信道影响后的衰落信号
% 计算不同SNR值下的错误率
SNRdB = 0:1:25; %SNR的范围,单位dB
SNR = 10.^(SNRdB/10);%单位变换
EbNodB= 10*log10(SNR/log2(M));
K = length(SNRdB);
NSER = zeros(1,K);%初始化瑞利衰落信道误符号率矢量
NBER = zeros(1,K);%初始化瑞利衰落信道误比特率矢量
aSER = zeros(1,K);%初始化awgn信道误符号率矢量
aBER = zeros(1,K);%初始化awgn信道误比特率矢量
%下面定义awgn信道和瑞利衰落信道的误码率和误比特率数的向量
Nsymerr = zeros(1,K);
Nbiterr = zeros(1,K);
asymerr = zeros(1,K);
abiterr = zeros(1,K);
for k = 1:K
rxSig = awgn(fadedSig,SNRdB(k), 10); % 在瑞利信道上加入加性高斯噪声,因为在上述瑞利信道模型中未加入噪声信号,若是不加入噪声,则误码率在理论上会是0.
NrxSig = awgn(qamSig,SNRdB(k), 10); %调制信号通过awgn信道
zfSig = rxSig./chan.PathGains; % 使用Zero-Forceing 均衡器优化接收信号
Nrx = demodulate(hDemod, zfSig); % 解调通过瑞利衰落信道后,并优化后的接收号
arx=demodulate(hDemod, NrxSig); % 解调通过awgn信道的信号
% 下面计算误符号率和误比特率
[Nsymerr(k),NSER(k)]= symerr(tx,Nrx);%调用系统函数计算无符号率
[Nbiterr(k),NBER(k)]= biterr(tx,Nrx);%调用系统函数计算无比特率
[asymerr(k),aSER(k)]= symerr(tx,arx);%调用系统函数计算无符号率
[abiterr(k),aBER(k)]= biterr(tx,arx);%调用系统函数计算无比特率
end
% 计算通过瑞利衰落信道和加性高斯噪声信道下的理论误比特率,并与仿真结果进行比较
[BERfadth,SERfadth] = berfading(EbNodB,'QAM',M,1);
[BERAWGN,SERAWGN] = berawgn(EbNodB,'QAM',M);
%下面将仿真结果进行图形绘制
figure(1);
semilogy(SNRdB,BERAWGN,'g-',SNRdB,BERfadth,'b+',SNRdB,NBER,'r*',SNRdB,aBER,'ks');
legend('AWGN信道下的理论误比特率','瑞利衰落信道下的理论误比特率','瑞利衰落信道的仿真误比特率','AWGN信道下的仿真误比特率');
xlabel('SNR (dB)'); ylabel('BER');
title('QAM调制信号在不同信道下的误比特率');
figure(2);
semilogy(SNRdB,SERAWGN,'g-',SNRdB,SERfadth,'b+',SNRdB,NSER,'r*',SNRdB,aSER,'ks');
legend('AWGN信道下的理论误符号率','瑞利衰落信道下的理论误符号率','瑞利衰落信道的仿真误符号率','AWGN信道下的仿真误符号率');
xlabel('SNR (dB)'); ylabel('SER');
title('QAM调制信号在不同信道下的误符号率');