低密度奇偶校验码LDPC(七)——SPA和积译码算法的简化

news2025/1/13 7:46:26

 往期博文

低密度奇偶校验码LDPC(一)——概述_什么是gallager构造-CSDN博客

低密度奇偶校验码LDPC(二)——LDPC编码方法-CSDN博客

低密度奇偶校验码LDPC(三)——QC-LDPC码概述-CSDN博客

低密度奇偶校验码LDPC(四)——双对角线结构的QC-LDPC编码-CSDN博客

低密度奇偶校验码LDPC(五)——译码算法概述-CSDN博客

低密度奇偶校验码LDPC(六)——SPA和积译码算法-CSDN博客

QC-LDPC的FPGA实现

基于QC-LDPC编码的循环移位网络的FPGA实现_5g ldpc编码 桶形移位寄存器-CSDN博客

一、SPA译码算法的实际应用

查找表与拟合

 盒加SPA译码器

二、SPA译码算法的简化算法

最小和算法(MSA)

 归一化最小和算法(Normalized MSA, NMSA)

偏移最小和算法(Offset MSA, OMSA) 

 常见软判决译码算法对比

若对译码算法感兴趣,请参见文献[4] .

三、NMSA算法的Matlab实现

function [x_hat, iter_this_time] = Layered_NMSA_BP_decoder(llr, H_row_one_absolute_index, H_comlumn_one_relative_index, N, M, vn_degree, cn_degree, max_iter,alfa)
VN_array = zeros(max(vn_degree), N);
CN_tanh_tmp = zeros(max(cn_degree), 1);%CN temporary memory.
iter_this_time = max_iter;
for t = 1 : max_iter
    for c = 1 : M
        product = 1;
        for c_neighbor = 1 : cn_degree(c)%read data from VNs, and then store in CNs memory.
            Lji = sum(VN_array(:, H_row_one_absolute_index(c, c_neighbor))) + llr(H_row_one_absolute_index(c, c_neighbor)) - VN_array(H_comlumn_one_relative_index(c, c_neighbor), H_row_one_absolute_index(c, c_neighbor));%VN update. However, this simple MATLAB sentence consumes a lot of time.
            %CN_tanh_tmp(c_neighbor) = 1 - 2/(1 + exp(Lji));%Exact decoding. Equivalent to tanh(x/2), usually faster.
            if Lji==0
                Lji=1e-15;
            end
            CN_tanh_tmp(c_neighbor) =Lji;
            product = product * sign(Lji);%Avoid repeated calculations.
        end
        for c_neighbor = 1 : cn_degree(c)
            Lij = product/sign(CN_tanh_tmp(c_neighbor));%Extract Extrinsic information, i.e., divide itself.
            minsort=sort(abs(CN_tanh_tmp(1:cn_degree(c))));
            if abs(CN_tanh_tmp(c_neighbor))==minsort(1)
                VN_array(H_comlumn_one_relative_index(c, c_neighbor), H_row_one_absolute_index(c, c_neighbor)) = alfa*Lij*max(minsort(2),1e-15);
            else
                VN_array(H_comlumn_one_relative_index(c, c_neighbor), H_row_one_absolute_index(c, c_neighbor)) = alfa*Lij*max(minsort(1),1e-15);
            end
        end
    end
    
    x_hat = (sum(VN_array)' + llr) < 0;%Belief propagation Decision.
    parity_check = zeros(M, 1);
    for m = 1 : M
        for k = 1 : 1 : cn_degree(m)
            parity_check(m) = parity_check(m) + x_hat(H_row_one_absolute_index(m, k));
        end
    end
    if ~sum(mod(parity_check, 2))%early stop, to see whether Hx = 0.
        iter_this_time = t;
        break;
    end
end

 注:以上代码并不是最优的,最优算法参见上一篇博文。

四、写在最后

        写者学习QC-LDPC硬件实现的总结笔记。主要参考了白老师的书籍,自己在其中做了一些理解和总结,如有错误,请多指教。如果有相关问题,欢迎与我交流。

参考文献

[1] 白宝明 孙韶辉 王加庆. 5G 移动通信中的信道编码[M]. 北京: 电子工业出版社, 2018.

[2] William E. Ryan, Shu Lin. Channel Codes - Classical and Modern[M]. Cambridge University Press, 2009.

[3] Gallager R. Low-density parity-check codes[J]. IRE Transactions on information theory, 1962, 8(1): 21-28.

[4] Roberts M K, Anguraj P. A Comparative Review of Recent Advances in Decoding Algorithms for Low‑Density Parity‑Check (LDPC) Codes and Their Applications. 2021

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1491131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CNAN知识图谱辅助推荐系统

CNAN知识图谱辅助推荐系统 文章介绍了一个基于KG的推荐系统模型&#xff0c;代码也已开源&#xff0c;可以看出主要follow了KGNN-LS 。算法流程大致如下&#xff1a; 1. 算法介绍 算法除去attention机制外&#xff0c;主要的思想在于&#xff1a;user由交互过的item来表示、i…

前端小案例——登录界面(正则验证, 附源码)

一、前言 实现功能&#xff1a; 提供用户名和密码输入框。当用户提交表单时&#xff0c;阻止默认提交行为。使用正则表达式验证用户输入的内容&#xff0c;判断输入的是有效的邮箱地址还是身份证号码。根据验证结果&#xff0c;在输入框下方显示相应的提示信息。 实现逻辑&a…

【C++庖丁解牛】初始化列表 | Static对象 | 友元函数

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1. 再谈构造函数1.1 …

mininet虚拟网络中的主机与宿主Ubuntu及因特网互通实现

环境: Win10(物理机),Vmware workstation ,Ubuntu(vm中的虚拟机),mininet 构建的虚拟网络环境说明: 在一win10的物理机中安装了vm平台,在vm中加载了一ubuntun系统,在改ubuntu系统中安装了mininet。 目标: 通过mininet 构建虚拟网络环境(使用python代码构建一个交换…

【开源】SpringBoot框架开发用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

mysql 同一条排序语句查询出来的结果某几条没按照排序查询

1501这个机床order 1 2 3 1 2 3 1 2 3 1502这个机床order 2 3 1 2 3 1 2 3 1 原因是order存在一致的 第一个123 第二个也有123 所以存在随机情况 正常应该是123456 但是需求是123 123 所以再按照id重新排序一下 原sql :select bindType.id, bindType.process_num as…

大模型学习笔记五:RAG

文章目录 一、RAG介绍1)局限性2)通过检索增强生成二、RAG系统的基本搭建流程1)搭建流程简介2)文档的加载和切割3)检索引擎4)LLM接口封装5)prompt模板6)RAG Pipeline初探7)关键字检索局限性三、向量检索1)文本向量2)向量相似度计算3)向量数据库4)基于向量检索的RAG…

一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读书籍【送书活动】

目录 前言一、内容简介二、作者简介三、专家推荐四、读者对象五、目录福利总结 前言 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c;在多项专业和学术基准测试中表现出的智力水平&#xff0c;不仅接近甚至有时超越了人类的平均水平…

40个Python字符串实例

Python 字符串是 Python 编程语言中最常用的数据类型之一&#xff0c;它可以表示文本或一组字符。Python 中的字符串是不可变的序列&#xff0c;意味着一旦创建&#xff0c;其值就不能被修改。下面是一些关于 Python 字符串的介绍。 概述 创建字符串&#xff1a;可以使用单引…

HI3516DV300 HI3516DRBCV300 海思安防监控芯片

Hi3516D V300是专为行业专用智能高清网络摄像机设计的新一代SoC。引入新一代ISP、最新H.265视频压缩编码器、高性能NNIE引擎&#xff0c;使Hi3516D V300在低码率、高图像质量、智能处理分析、低功耗等方面领先业界。能量消耗。Hi3516D V300集成了POR、RTC、音频编解码器和待机唤…

AI大模型的预训练、迁移和中间件编程

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

测试用例术语5.0

一、软件测试中术语 1.动态测试&#xff08;dynamic testing&#xff09;&#xff1a;通过运行软件的组件或 系统来测试软件 例如&#xff1a;一辆汽车发动并行使测试 2.静态测试&#xff08;static testing&#xff09;&#xff1a;对组件的规格说明书进行 评审&#xff0c…

Linux——自写一个简易的shell

目录 前言 一、打印提示信息 二、分割字符串 三、替换程序 前言 之前学习了很多进程相关的知识&#xff0c;包括环境变量、进程的创建与退出、进程等待、进程替换。现在可以用所学的作一个小总结&#xff0c;手撕一个shell解释器&#xff0c;大致的思路是先通过环境变量获…

【轮式平衡机器人】——TMS320F28069片内外设之Timer_IT(补:CCS程序烧录方法)

引入 Timer_IT 指的是 TMS320F28069 的定时器中断功能。在微控制器或数字信号控制器中&#xff0c;定时器是一个非常重要的外设&#xff0c;它可以用来产生固定时间间隔的中断&#xff0c;或者用来精确计算时间。 Timer_IT 的主要特点如下&#xff1a; 定时功能&#xff1a;…

数组常见算法

一、数组排序 冒泡排序 本篇我们介绍最基本的排序方法&#xff1a;冒泡排序。 实现步骤 1、比较两个相邻元素&#xff0c;如果第一个比第二个大&#xff0c;就交换位置 2、对每一对相邻元素进行同样的操作&#xff0c;除了最后一个元素 特点 每一轮循环后都会把最大的一个…

Java基础概念 1-6注释关键字字面量变量-基本用法变量-使用方式和注意事项变量练习-计算公交车的人数

Java基础概念 1-注释 单行注释 // 多行注释 /* */ 文档注释 /** */ --暂时不用 例: public class HelloWorld{ //main方法,表示程序的主入口.public static void main (String[] args){/*输出语句(打印语句)会把小括号内的内容进行输出打印.*/System.out.…

网盘拉新平台,如何授权对接“星子助推”?

找到“星子助推”&#xff1a;首先&#xff0c;找到“星子助推”这个授权渠道。他们是网盘服务提供商的合作伙伴&#xff0c;为你提供机会。注册并申请授权&#xff1a;在“星子助推”的平台上注册&#xff0c;并同时申请授权。填写邀请码8x25k&#xff0c;提交申请。获得授权并…

怎么写苹果群控核心功能的源代码!

随着移动设备的普及和技术的不断发展&#xff0c;苹果设备群控技术成为了许多开发者关注的焦点&#xff0c;苹果群控技术允许开发者通过编写源代码&#xff0c;实现对多台苹果设备的集中管理和控制。 一、了解苹果群控技术的基本原理 在编写苹果群控核心功能的源代码之前&…

如何使用生成式人工智能探索视频博客的魅力?

视频博客&#xff0c;尤其是关于旅游的视频博客&#xff0c;为观众提供了一种全新的探索世界的方式。通过图像和声音的结合&#xff0c;观众可以身临其境地体验到旅行的乐趣和发现的喜悦。而对于内容创作者来说&#xff0c;旅游视频博客不仅能分享他们的旅行故事&#xff0c;还…

Qt绘制动态罗盘

介绍&#xff1a;罗盘指针以30角旋转巡逻&#xff0c;扫描航海范围内的点位&#xff0c;并绘制点云。字段信息在表格中显示&#xff0c;该数据都存储在数据库中。选择不同的范围&#xff0c;显示该范围内的点位。 #include "mainwindow.h" #include "ui_mainwi…