文章目录
前言
本文首先介绍了卷积码原理与卷积码的维特比软判决译码与硬判决译码,然后给出卷积码的维特比软判决译码与硬判决译码的MATLAB仿真代码。最后给出了仿真结果。
一、卷积码
卷积码是一类重要的线性分组码,它在数字通信系统中被广泛用于前向纠错(Forward Error Correction, FEC)。卷积码通过对输入数据进行连续的卷积操作来生成编码数据,与块编码(如汉明码)不同,块编码对固定长度的数据块进行编码,而卷积码则处理无限长度的数据流。
1.卷积码编码
- 编码器结构:
o 卷积码编码器由多个移位寄存器、多个模2加法器(异或门)组成。
o 编码器通常用(n, k, m)表示,其中n是编码器输出比特数,k是输入比特数,m是编码器的记忆长度(即移位寄存器的级数)。 - 编码过程:
o 在每个时钟周期,k个输入比特被送入编码器,同时移位寄存器的内容向右移动。
o 输出是由输入比特和移位寄存器状态决定的n个比特。
2.卷积码解码
最常用的卷积码解码算法是维特比解码,它是一种最大似然解码算法,通过构建一个网格图来找到最有可能的编码路径。
卷积码的维特比译码算法可以通过两种基本方式实现:软判决译码和硬判决译码。这两种方法在处理接收到的信号时有所不同,从而影响了解码的性能和复杂度。
二、硬判决译码
硬判决译码是最简单的方法,它直接基于接收到的信号比特值进行译码。
- 判决过程:
o 对于每个接收到的比特,硬判决译码器会将其判决为0或1,这通常是通过比较接收到的信号幅度与一个预定的阈值来完成的。
o 判决结果是一个确定的比特值,没有考虑到信号的不确定性。 - 分支度量计算:
o 在维特比算法中,硬判决译码的分支度量通常是0或1,这取决于接收到的比特与网格图中对应分支的码字是否匹配。
o 如果匹配,分支度量是0;如果不匹配,分支度量是1。 - 性能:
o 硬判决译码相对简单,计算复杂度较低。
o 然而,由于它不考虑接收信号的不确定性,因此在噪声较大的环境中,其性能可能会较差。
三、软判决译码
软判决译码则考虑了接收信号的不确定性,通常能够提供更好的译码性能。
- 判决过程:
o 在软判决译码中,接收到的信号不会被简单地判决为0或1,而是使用连续值(通常是接收信号的归一化对数似然比LLR)来表示每个比特是0或1的概率。
o LLR值越大,表示该比特为0的概率越高;LLR值越小,表示该比特为1的概率越高。 - 分支度量计算:
o 软判决译码的分支度量是基于LLR值计算的,通常是对LLR值进行累加或取最小值来得到。
o 分支度量的计算更加复杂,因为它需要考虑所有可能的比特组合及其概率。 - 性能:
o 软判决译码在噪声较大的环境中性能更好,因为它更准确地反映了接收信号的不确定性。
o 由于使用了更多的信息,软判决译码通常能够提供比硬判决译码更低的误码率。 - 复杂度:
o 软判决译码的计算复杂度高于硬判决译码,因为它需要处理连续的LLR值而不是简单的0/1比特。
o 需要更多的存储空间和计算资源来处理分支度量和路径度量。
四、MATLAB仿真
1. 仿真代码
clear;
close all
% rng default; % 设置随机数生成器的状态,产生可重复的随机数序列
M = 16; % 调制阶数
k = log2(M); % 每符号包含的比特数
EbNoVec = 0:10; % Eb/No,单位:dB
numSymPerFrame = 1000; % 每帧包含的QAM符号数
numMaxErrs = 100; % 仿真停止条件1:最大错误比特数
numTotalBits = 1e6; % 仿真停止条件2:总比特数
% 初始化误码率向量
berEstSoft = zeros(size(EbNoVec));
berEstHard = zeros(size(EbNoVec));
% 设置卷积码参数与网格结构
rate = 1/2; % 卷积码码率
ConstraintLength = 7; % 约束长度
CodeGenerator = [171 133]; % 生成多项式(八进制)
trellis = poly2trellis(ConstraintLength,CodeGenerator); % 生成卷积码的网格结构
tbl = 32; % 译码回溯深度
for n = 1:length(EbNoVec)
% Eb/No转换为SNR
snrdB = EbNoVec(n) + 10*log10(k*rate);
% 噪声功率(方差)计算,使用归一化平均信号功率
noiseVar = 10.^(-snrdB/10);
% 初始化错误比特计数器和比特计数器
numErrsSoft = 0;
numErrsHard = 0;
numBits = 0;
while numErrsSoft < numMaxErrs && numBits < numTotalBits
% 生成二进制数据并转换为符号
dataIn = randi([0 1],numSymPerFrame*k,1);
% 对数据进行卷积编码
dataEnc = convenc(dataIn,trellis);
% QAM调制
txSig = qammod(dataEnc,M,'InputType','bit','UnitAveragePower',true);
% AWGN信道传输
rxSig = awgn(txSig,snrdB,'measured');
% 使用硬判决(比特)和软判决(似然LLR)方法对噪声信号进行解调。
rxDataHard = qamdemod(rxSig,M,'OutputType','bit','UnitAveragePower',true);
rxDataSoft = qamdemod(rxSig,M,'OutputType','approxllr', ...
'UnitAveragePower',true,'NoiseVariance',noiseVar);
% 对解调后的数据进行维特比解码
dataHard = vitdec(rxDataHard,trellis,tbl,'cont','hard');
dataSoft = vitdec(rxDataSoft,trellis,tbl,'cont','unquant');
% 计算帧中的比特错误数量。调整解码延迟,该延迟等于回溯深度。
numErrsInFrameHard = biterr(dataIn(1:end-tbl),dataHard(tbl+1:end));
numErrsInFrameSoft = biterr(dataIn(1:end-tbl),dataSoft(tbl+1:end));
% 更新错误比特计数器和比特计数器
numErrsHard = numErrsHard + numErrsInFrameHard;
numErrsSoft = numErrsSoft + numErrsInFrameSoft;
numBits = numBits + numSymPerFrame*k;
end
% 计算BER
berEstSoft(n) = numErrsSoft/numBits;
berEstHard(n) = numErrsHard/numBits;
end
% 未编码16-QAM的理论BER
berTheoretical_qam = berawgn(EbNoVec,'qam',M);
% 绘制16-QAM的仿真与理论性能
semilogy(EbNoVec,berEstSoft,'-*','LineWidth',1)
hold on
semilogy(EbNoVec,berEstHard,'-o','LineWidth',1)
semilogy(EbNoVec,berTheoretical_qam,'-d','LineWidth',1)
legend('软判决解码','硬判决解码','未编码','location','NorthEast')
grid on
title([num2str(M),'QAM硬判决和软判决维特比解码BER'])
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')
2. 代码说明
主处理循环执行以下步骤:
(1)生成二进制数据。
(2)对数据进行卷积编码。
(3)对数据符号应用QAM调制。为传输信号指定单位平均功率。
(4)将调制信号通过AWGN信道。
(5)使用硬判决和似然LLR方法对接收信号进行解调。为接收信号指定单位平均功率。
(6)使用硬判决和似然方法对信号进行维特比解码。
(7)计算比特错误数。 当达到100个错误或者传输了1e6比特时,退出当前信噪比的while循环,继续处理下一信噪比的数据。
3. 仿真结果
总结
(1)硬判决译码简单、计算量小,但在高噪声环境下性能较差。
(2)软判决译码更复杂、计算量大,但在高噪声环境下能提供更好的性能。
在实际应用中,选择硬判决还是软判决译码取决于系统对性能和复杂度的要求。在噪声较低且对计算资源有限制的场合,硬判决译码可能是更好的选择。而在噪声较高且对性能要求严格的场合,软判决译码则是更合适的选择。
标签:仿真,比特,解码,译码,卷积码,判决 From: https://blog.csdn.net/weixin_45333185/article/details/143783594