基于球形译码的汉明软译码算法matlab误码率仿真

本文介绍了汉明码的基本原理,包括其编码、传输、译码和解码过程。接着,详细阐述了球形译码的概念,以及如何将其应用于汉明码的译码问题中。进一步讨论了基于球形译码的汉明软译码方法,该方法考虑了二进制位出错的概率,提高了纠错的精度。最后,提供了一个MATLAB核心程序示例,用于演示在不同信噪比下的软决策汉明解码性能仿真。
摘要由CSDN通过智能技术生成

目录

一、理论基础

1.1汉明码的基本原理

1.2球形译码的基本原理

1.3基于球形译码的汉明软译码的基本原理

二、核心程序

三、仿真结论


一、理论基础

      汉明软译码是一种常用的纠错码译码技术,能够有效地识别和纠正数据传输过程中的错误。球形译码是一种基于球形几何的译码技术,能够将汉明码的译码问题转化为球面上的译码问题。本文将详细介绍基于球形译码的汉明软译码的基本原理。基于球形译码的汉明软译码的原理是利用球形编码器将编码后的数据映射到一个高维球面上,从而实现对错误的检测和纠正。这种方法在解码过程中考虑了数据在编码空间中的分布情况,从而实现更精确的纠错。

1.1汉明码的基本原理

汉明码是一种基于二进制的线性纠错码,由理查德·汉明于1950年提出。在汉明码中,将原始数据按照一定的规则编码,然后加上一些冗余信息,构成汉明码。汉明码能够检测出多位错误,并且能够纠正少量的错误。汉明码的基本原理如下:

  1. 编码:将原始数据按照一定的规则编码,然后加上冗余信息得到汉明码。

  2. 传输:将汉明码传输给接收端。

  3. 译码:接收端接收到汉明码后,进行译码操作,检测出是否有错误,并尝试纠正错误。

  4. 解码:将译码后得到的信息解码,得到原始数据。

假设我们有一个数据位的序列 D,需要添加冗余校验位来构成汉明码。汉明码的生成步骤如下:

  1. 确定校验位的位置: 计算冗余位的位置,使每个冗余位都控制特定的位的奇偶性。汉明码通常以2的幂为基数。例如,3个冗余位(P1、P2、P3)可以覆盖1、2、4、8、...这些位置。

  2. 插入冗余位: 在数据位中插入冗余位。例如,假设要发送一个4位的数据位(D1、D2、D3、D4),那么插入3个冗余位(P1、P2、P3),得到一个汉明码序列(D1、D2、P1、D3、P2、P3、D4)。

  3. 计算冗余位的值: 对于每个冗余位,计算其值使得对应的数据位的奇偶性满足特定规则。通常,根据校验位的位置,奇偶性规则可以是偶校验或奇校验。

       需要注意的是,实际汉明码可能会有更多的数据位和冗余位,具体的规则和计算方式会根据具体的汉明码类型而有所不同。

1.2球形译码的基本原理

       球形译码的基本思想是在以一个矢量x 为中心的半径为d的多维球内搜索格点,通过限制或者减少搜索半径从而减少搜索的点数,进而使得计算时间减少。球形译码算法带来的优点在于它不需要象传统的最大似然译码算法那样需要在整个格内对所有的格点进行搜索,而只需要在一个事先设定的有限球形区域进行搜索,如果该区域所包含的点数相对于整个格内的总点数是相当小的,搜索时间就会大大减少。

       影响球形译码的关键问题有:(1) 怎样选择搜索半径d。如果d太大,则球内会包含太多的点,复杂度就会接近或者达到最大似然译码的指数级复杂度。如果d 太小,则球内可能一个格点都不包含,那么球形译码算法将得不到合理的解。(2) 怎样才能判断一个点是否在球内。如果这种判断需要借助每一个格点和矢量之间的距离来判断的话,那么这种方法就不太理想,因为我们需要考察所有的点,所产生的计算量也是指数级的。

        球形译码解决了第2个问题,此处均考虑信号为实数,因为复数可以通过增加一倍的维数,将实部和虚部分开,要判断一个点是否在半径为d的m维球内比较困难。若将m变为1,则从球退化为一个间距,这个点就相当于某根天线发送信号的实部或虚部,这样操作就简单很多,可以知道这个点是否在这个距离内。多根发送天线上的信号的实部和虚部分成很多维,每一维上有可能取值。球形译码算法相当于构建了一棵树,树的第k层节点对应的是落在半径为d,维数为k的球内的格点。

       球形译码是一种基于球形几何的译码技术,能够将汉明码的译码问题转化为球面上的译码问题。球形译码的基本原理如下:

  1. 构造球面:将汉明码中的每个二进制位看作是一个在球面上的点,可以得到一个球面上的点集。

  2. 构造球体:将球面上的点集构成一个球体,球体的中心点为原点,半径为$\sqrt{N}$,其中$N$为汉明码的长度。

  3. 构造球面区域:将球体分成若干个球面区域,每个球面区域的大小为$2^k$,其中$k$为汉明码中错误位的个数。

  4. 定位球面区域:接收到汉明码后,将错误位看作是球面上的点,然后在球面上找到距离这些点最近的球面区域。

  5. 确定二进制位:在找到的球面区域内,确定哪些二进制位是错误的,并进行纠错操作。

  6. 解码:将纠错后的信息解码,得到原始数据。

1.3基于球形译码的汉明软译码的基本原理

        基于球形译码的汉明软译码是一种将球形译码技术应用到汉明码的软译码问题中的技术。在软译码中,假设汉明码中的每个二进制位都有一定的概率出错,因此需要对每个二进制位进行概率估计,并计算出最有可能的原始数据。

基于球形译码的汉明软译码的基本原理如下:

  1. 构造球面:将汉明码中的每个二进制位看作是一个在球面上的点,可以得到一个球面上的点集。

  2. 构造球体:将球面上的点集构成一个球体,球体的中心点为原点,半径为$\sqrt{N}$,其中$N$为汉明码的长度。

  3. 构造球面区域:将球体分成若干个球面区域,每个球面区域的大小为$2^k$,其中$k$为汉明码中错误位的个数。

  4. 定位球面区域:接收到汉明码后,将每个二进制位看作是一个球面上的点,并估计每个点的概率分布。然后在球面上找到距离这些点最近的球面区域。

  5. 确定二进制位:在找到的球面区域内,根据概率估计确定哪些二进制位是错误的,并进行纠错操作。

  6. 解码:将纠错后的信息解码,得到原始数据。

        基于球形译码的汉明软译码是一种将球形译码技术应用到汉明码的软译码问题中的技术。该技术能够有效地识别和纠正数据传输过程中的错误,应用广泛。

二、核心程序


clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
Kc=5;           %Number of Parity bits
Nframes=3;      %Number of Frames
M=3;            %maximium bit error number M (Size of Sphere)
%M=1 means hard decision
%M=2 means soft decision with up to 2 bit errors
%M=3 means soft decision with up to 3 bit errors
% Demonstration of Soft-Hamming-Decoding based on Sphere-Decoding
ExtHammCode=1;  % 1 for extended Hamming-Code

%K_loop for more runs at higher SNR
SNRdB=0:1:7; 
K_loop=round((SNRdB-min(SNRdB)+3).^4.8);

%G: Generator Matrix, H: Paritycheck Matrix
G=bem_hammgen(Kc);

% Change Generator Matrix to extended Hamming Code
if ExtHammCode==1
    G=extHammG(G);
end

kc=size(G,1);               % Number of information bits
nc=size(G,2); Kc=nc-kc;     % Code word length

Rc=(kc)/(nc);               % Code rate Rc
EbN0=SNRdB-10*log10(Rc);    % Eb/N0

H = gen2par(G);             % generate H from G
HT=H.';                     % Transpose

%Permutation of 1,2 and 3 bit errors
[e1, e2, e3]=permute_e(nc,M);
e=[e1;e2;e3];

%syndrom calculation
syn=NaN(size(e,1),Kc);
for k=1:size(e,1)
    syn(k,:)=mod(e(k,:)*HT,2);
end

%sort rows of syndroms associated error pattern e
[s_sort,s_idx] = sortrows(syn);     % sort syn to s_sort
e_sort=e(s_idx,:);                  % sort e to e_sort in the same way as syn

e_sort=e_sort(sum(s_sort,2)>0,:);   % delete zero rows
s_sort=s_sort(sum(s_sort,2)>0,:);   % delete zero rows
 
s_de=bem_bi2de(s_sort);             % calculate decimal values from s_sort

s_pdf=hist(s_de,1:2^Kc-1);          % calculate which value occurs how often
 

%Loops for BER calculation
tic
sigma = sqrt(10.^(-SNRdB./10));         % standard diviation of noise
BER_dec_mean=zeros(1,length(SNRdB));    % mean of BER for coded system
BER_mean=zeros(1,length(SNRdB));        % mean of BER for uncoded system
for zzz=1:length(SNRdB)
    %disp(num2str(zzz))
    for kkk=1:K_loop(zzz)
        %% random bits
        x_msg=round(rand(Nframes,kc));
        
        %% channel coding
        x_code=mod(x_msg*G,2);
        
        %% Modulation and Noise
        x_mod = -(x_code-0.5)*2+1i*1E-99;
        noi=1/sqrt(2)*(randn(Nframes,nc)+1i*randn(Nframes,nc))*sigma(zzz);
        x_r=x_mod+noi;
        
        %% Demodulation
        x_llr = real(x_r)*4/sigma(zzz).^2;  % Calculate Log-Likelihood Ratios
        x_code_r=(sign(-x_llr)+1)/2;        % Received bit stream
        
        %% BER uncoded
        bit_err=abs(x_code-x_code_r);
        BER=sum(bit_err(:))/(Nframes*nc);
        BER_mean(zzz)=BER_mean(zzz)+BER;
        
        %% Decoding
        [x_decode,x_llr_new] = hamm_soft_out(HT,e_sort,s_pdf,x_llr);
        %[x_decode] = hamm_soft_really_fast(HT,e_sort,s_sort,x_llr,Kc);
        
        %% BER coded
        dec_err=abs(x_code-x_decode);
        BER_dec=sum(dec_err(:))/(Nframes*nc);
        BER_dec_mean(zzz)=BER_dec_mean(zzz)+BER_dec;
    end
    BER_mean(zzz)=BER_mean(zzz)/K_loop(zzz);
    BER_dec_mean(zzz)=BER_dec_mean(zzz)/K_loop(zzz);
    zzz
end
toc

DN='displayname';
Co='Color';
Ma='Marker';
if length(SNRdB)>1
    figure(99);hold off
    semilogy(SNRdB,BER_mean,Co,[1 0 0],Ma,'o',DN,'uncoded');
    hold on; grid on;
    semilogy(EbN0,BER_dec_mean,Co,[0 0 1],Ma,'.',...
        DN,[num2str(nc) ',' num2str(kc) '-Hamming code, ' 'M=' num2str(M)]);
    xlabel('E_b/N_0 in dB')
    ylabel('BER')
    legend show
end
UP178

三、仿真结论

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fpga和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值