本博客環境爲Matlab2018 ,軟件版本不同可能會有些出入,需要稍作修改。
16QAM調製與解調
仿真要求
用基帶等效的方式仿真16-QAM在AWGN信道下的誤碼率和誤比特率性能,並與理論值相比較。
代碼如下:
clear all;clc;
nsymbol= 100000;%一共有十萬個符號
M=16;%階數,表示16QAM
graycode=[0 1 3 2 4 5 7 6 12 13 15 14 8 9 11 10];%格雷映射,十進制表示
EsN0=5:20;%符號比,單位db
snr1=10.^(EsN0/10);%將db轉爲非線性的方式
msg=randi([0,15],1,nsymbol);%隨機產生0-15的符號,乘nsymbol得到原始數據
msg1=graycode(msg+1);%格雷映射
msgmod=qammod(msg1,M);%調用qammod函數,得到調製後的符號
scatterplot(msgmod);%畫出星座點圖
spow=norm(msgmod).^2/nsymbol;%a+bj取模的平方,即功率;功率除以整個符號得到平均功率
for i= 1:length(EsN0)
sigma=sqrt(spow/(2*snr1(i)));
rx=msgmod+sigma*(randn(1,length(msgmod))+1i*randn(1,length(msgmod))); %星座點圖乘以隨機長度高斯白噪聲
y=qamdemod(rx,M);%轉爲對應的點
decmsg=graycode(y+1);%格雷逆映射
[err1 ,ber(i)]=biterr(msg,decmsg,log2(M));
[err2,ser(i)]=symerr(msg,decmsg);%比較符號誤差
end
p4=2*(1-1/sqrt(M))*qfunc(sqrt(3*snr1/(M-1)));%誤碼率
ser1=1-(1-p4).^2;
ber1=1/log2(M)*ser1;%誤比特率
figure()
%ber仿真值,ser比特仿真值,ber1理論誤比特率,ser1理論誤碼率
semilogy(EsN0,ber,'o' ,EsN0,ser,'*',EsN0,ser1,'-',EsN0,ber1,'-.');
title('16QAM-AWGN')
xlabel('Es/N0');ylabel('SER AND BER');
legend('ber simulation','ser simulation','ser theory' ,'ber theory');
仿真結果如下所示:
星座點圖如下圖所示:
仿真與理論的誤碼率和誤比特率性能曲線比較: