一、序言
(本篇文章整合了所有可以用的代码,做的任意M-QAM进制调制,提前讲代码均收费的,请大家尊重科研成果白嫖者绕路。) 需要代码与作者联系qq:286820790
该文章可以实现卷积码任意M进制的QAM硬软判决,例如4QAM(4PSK), 16QAM,32QAM,64QAM,256QAM等等。
写这个文章有两个原因,
- 无论是某cs 还是pu 网站dn上,QAM调制软判决的代码层出不穷,但是能用的都很少(本人切身体会过,花了11购买csdn的代码结果全是运行错误,MD你们这些无良商家,真的想骂街)
- matlab可以实现的高阶QAM调制,用的又是通信工具箱tool,里面的函数都是隐匿的,对我们科研需欸没有任何帮助,LLR的计算方法也根本无从下手,比如
![](https://i-blog.csdnimg.cn/blog_migrate/8d14f3afa8246d287fb50e49e61bab06.jpeg)
二、M-QAM仿真流程和代码
1.维特比译码硬判决
随机序列 → (2,1,7)卷积码→M-QAM调制 → awgn信道 → M-QAM解调 → 维特比译码器硬判决
2.维特比译码软判决(性能更加优越)
随机序列 → (2,1,7)卷积码→M-QAM调制 → awgn信道 → 计算高阶LLR(软符号) → 维特比译码器硬判决
Tip:所有代码只是QAM基带调制解调,只有高斯白噪声,无添加信道衰落,不涉及频带码元采样率等等。
三、LLR计算原理
本文采用(2,1,7)卷积码进行编码,硬判决软判决的底层原理如下
硬判决:只是单纯采用汉明距离,因此算法简单,效果不如软判决
软盘决:采用欧氏距离,需要计算LLR,因为LLR计算量大,算法复杂度高效果。
如果大家想要了解LLR是如何计算的,这边我不做多余阐述解释,给大家推荐两篇我觉得特别良心的up主的文章。
这篇文章的大牛给出了16qam的星座图已经LLR计算方法和近似LLR算法,需要一定的数学基础才能看懂。也是我看过讲解最为全面的
第二篇文章特别推荐大家去学习,是我学习的最简单通俗易懂的文章。文章讲述了不同调制方式对LLR的计算结果,此外 他还有两篇文章和视频是计算BPSK 以及QPSK的LLR方法,受益匪浅。
总之,LLR的计算就是根据最大似然比这个公式:
其中bi指的是不同QAM调制传输一个符号的比特位数,例如例如4QAM有两个比特b1b0,16QAM有四个比特b3b2b1b0。如果你们看不懂这个公式多看看第一篇文章
四、代码部分
暂不提供matlab部分代码,软判决需要LLR文件,是收费的再次提醒下白嫖请绕路,尊重原创。毕竟代码的重点是在软判决上。
clc;clear all;close all
M=4;
k=log2(M); % bitsPerSym = log2(m)
nsymbol=10000; %传输比特
msg = randi([0,1], nsymbol*k,1); %生成随机二进制数比特流,序列长度为k倍数
%% 卷积码
rate=1/2;
L=7; %卷积码约束长度
tblen=6*L; %Viterbi译码器回溯深度
trellis = poly2trellis(7,[133 171]); %(2,1,7)卷积编码
msg_conv=convenc(msg,trellis); %16qam 卷积码
msgmod = qammod(msg_conv,M,'bin','InputType','bit'); %QAM调制
%4QAM调制归一化
msgmod=msgmod/sqrt(2);
%%%%% 实际与理论码错误率计算
SNR_in_dB=0:2:24; % AWGN信道噪声比
for j=1: length(SNR_in_dB)
snrdB = SNR_in_dB(j) + 10*log10(k*rate);
% Noise variance calculation for unity average signal power.
noiseVar = 10.^(-snrdB/10);
sigma=sqrt(noiseVar/2);
msg_add_noise = awgn(msgmod, SNR_in_dB(j),'measured'); % 加入不同强度的高斯白噪声
% Gnoise=sigma*(randn(length(msgmod),1)+i*randn(length(msgmod),1))/sqrt(2);
% msg_add_noise = msgmod+ Gnoise ; % 加入不同强度的高斯白噪声
%噪声功率
N0=sum(abs(msg_add_noise-msgmod).^2)/length(msgmod);
%Viterbi
msgdemod= qamdemod(msg_add_noise,M,'bin','OutputType','bit'); % 对已调信号进行解调
msg_hard= vitdec(msgdemod,trellis,tblen,'cont','hard');
[err,ber1(j)]=biterr(msg_hard(tblen+1:end),msg(1:end-tblen));
sym_soft=llr_M(msg_add_noise,M,N0,map_label);%软判决符号
llr = reshape( sym_soft',1,[]);
msg_soft= vitdec(llr,trellis,tblen,'cont','unquant');
[err,ber2(j)]=biterr(msg_soft(tblen+1:end)',msg(1:end-tblen));
end
%%% 合并画误码率曲线图
figure();
semilogy(SNR_in_dB,ber1,'blue*-',SNR_in_dB,ber2,'black*-');
hold on;
title('误码率比较');
legend('4QAM硬判决','4QAM软判决');
hold on;
grid on;
xlim([0,15]);
xlabel('SNR/dB');
ylabel('BER')
五、仿真结果
结论可以看得出来,随着QAM调制数量增加 整体性能逐渐降低的,高阶QAM调节牺牲了部分可靠性提高了传输速率,仿真也验证了这个现象