全网最全系列一、高阶M-QAM(基带)调制LLR软判决解调。

一、序言

(本篇文章整合了所有可以用的代码,做的任意M-QAM进制调制,提前讲代码均收费的,请大家尊重科研成果白嫖者绕路。) 需要代码与作者联系qq:286820790

该文章可以实现卷积码任意M进制的QAM硬软判决,例如4QAM(4PSK), 16QAM,32QAM,64QAM,256QAM等等。

写这个文章有两个原因,

  1. 无论是某cs 还是pu 网站dn上,QAM调制软判决的代码层出不穷,但是能用的都很少(本人切身体会过,花了11购买csdn的代码结果全是运行错误,MD你们这些无良商家,真的想骂街)
  2. matlab可以实现的高阶QAM调制,用的又是通信工具箱tool,里面的函数都是隐匿的,对我们科研需欸没有任何帮助,LLR的计算方法也根本无从下手,比如
图1、 maltab的工具箱函数

二、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主的文章。

一、16QAMLLR计算

这篇文章的大牛给出了16qam的星座图已经LLR计算方法和近似LLR算法,需要一定的数学基础才能看懂。也是我看过讲解最为全面的

二、8PSK高斯信道下LLR计算

第二篇文章特别推荐大家去学习,是我学习的最简单通俗易懂的文章。文章讲述了不同调制方式对LLR的计算结果,此外 他还有两篇文章和视频是计算BPSK 以及QPSK的LLR方法,受益匪浅。

总之,LLR的计算就是根据最大似然比这个公式:

LL R\left(b_i\right)=\ln \frac{\operatorname{Pr}\left(b_i=0 \mid r\right)}{\operatorname{Pr}\left(b_i=1\mid r\right)}=\ln \frac{\sum_{s \in S_i^{(0)}} e^{-\frac{|r-s|^2}{2 b^2}}}{\sum_{s \in S_i^{(1)}} e^{-\frac{|\gamma-s|^2}{2 b^2}}}

其中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调节牺牲了部分可靠性提高了传输速率,仿真也验证了这个现象 

  • 30
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科研Beatles

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值