精华内容
下载资源
问答
  • 考点梳理 例题剖析 第三部分 算法VB程序设计 专题13 算法的表示流程图 考试内容 考试要求 算法算法的表示 算法的基本概念 算法的常用表示方法 顺序选择循环三种控制结构 b理解 本专题包含算法的表示其知识点主要...
  • 如点要节 第三部分算法VB程序设计 专题13算法的表小流程图 考点梳理例题剖析 如点要节 考试内容 考试要求 算法算法的表示: 算法的基本概念 b理解 算法的常用表示方法 顺序选择循环三种控制结构 考点梳理例题剖析...
  • VB算法;1;算法概念及特征;流程图基本符号;基本数据类型;类对象属性;事件方法;变量命名规则;单个变量VS一维数组;赋值语句;运算符;常用函数;常用函数几个要点;三种基本结构;行If;块If;For循环;Do While 循环;For和Do的...
  • VB常用算法的介绍.pdf

    2020-08-02 11:59:14
    . . . . 常用算法介绍 VB 算法 Algorithm 计算机解题的...这些语句等通常使用自然语言结构化流程图伪代码等来描述算法 一计数求和求阶乘等简单算法 此类问题都要使用循环 要注意根据问题确定循环变量的初值 终值或结束
  • Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个...
  • 图像的几何变换包括:图像的空间平移、比例缩放、旋转、仿射变换和图像插值。 图像几何变换的实质:改变像素的空间位置,估算新空间位置上的像素值。  图像几何变换的一般表达式:[,][(,),(,)]uvXxyYxy ,其中,...
  • VB程序实现算法三种基本结构课件 课前准备 算法解决问题的方法和步骤 三种基本结构 ...思考 该题是什么结构 分支结构 run 流程图 参照学案的表格完成练习12 程序的窗体已经创建只需要补充代码 注意控制时间 3.课内探
  • 幼儿园民间体育游戏特指那些在幼儿生活中广泛流行,已经成为代代传承的文化的传统游戏。幼儿园开展民间体育游戏是对民间体育娱乐文化的认识、利用、开发和继承的学习过程。幼儿会在体育活动中表现出人与人的互动、人...

    7ff4e7818f36a9c3479233137fe83c82.png

    幼儿园民间体育游戏特指那些在幼儿生活中广泛流行,已经成为代代传承的文化的传统游戏。幼儿园开展民间体育游戏是对民间体育娱乐文化的认识、利用、开发和继承的学习过程。幼儿会在体育活动中表现出人与人的互动、人与环境的互动和人与文化互动的学习过程。

    本栏目是在弘扬中华优秀传统文化的时代背景下,推出的民间体育游戏走进幼儿园的拓展与呈现。

    1

    石头剪刀布

    石头剪刀布
    ---“我们来玩石头、剪刀、布吧。”
    ---“好啊,你出什么?”
    ---“我出最厉害的。”
    ---“不行,必须出石头、剪刀、布中的一个。”
    ---“那我出……布!”
    ---“我出剪刀,剪你的布。”

    “石头、剪刀、布”是一种广泛流传于我国民间的古老游戏,也是我们耳濡目染、颇受孩子喜爱的游戏。不仅能锻炼幼儿肢体动作的协调性,还能发展幼儿反应的灵敏性,同时体验与同伴一起游戏的乐趣。

    bfe2d5fc1e18b43ab81c1ac10134a5d1.png

    其规则是:用三种不同的手势分别表示石头(握紧的拳头)、剪刀(中指和食指伸直,其余手指握紧)、布(五指伸直,张开手)。两个玩家先各自握紧拳头,然后两人一起念出口令,在说最后一个音节的同时,两个玩家出示自己心中想好的手势(“石头”、“剪子”或“布”)。剪刀剪不动石头(石头胜利);布被剪刀剪开(剪刀胜利);石头被布包裹(布胜利)。如果双方出示的手势相同时,就是平局。通常这种简短的比赛可能会被重复多次,以三局两胜或五局三胜来决定胜负。

    e08dedc6449b77ceec67a43381ca2189.png

    00e48e379666b8717bfc694c2d7176a5.png

    5f50b7a955ad51ee9c0c57addb41ae60.png

    不同的玩法

    通常我们习惯用手玩石头剪刀布,今天让我们跟随小朋友们看看如何用脚来玩石头、剪刀、布吧!双脚并拢在原地跳三下。在第三跳落地时根据双脚的位置来表示所使用的“武器”。两脚并拢为石头,两脚前后开立为剪刀,两脚左右开立为布。

    46c9f55d404b42db47d7846c4f1a8cdd.png

    两人玩

    两人面对面。一边跳一边喊:“石头、剪刀、布”。喊到最后一个字时就各自做动作,如果两人动作一样就重来。

    91ee19d5c851125b7ab2b6b60b0e53fa.png

    三人玩

    成三角形位置站立。一边跳一边喊:“石头、剪刀、布”。喊到最后一个字时就各自做动作,最终只有 “一位玩家”获胜。如果三人动作一样或者三人分别出现石头、 剪刀 、布就重来。

    60396e2bf28958a00b10e78463526b64.png

    小组玩

    将幼儿分成人数相等的两组,一边原地跳一边说“石头、剪刀、布”,当说到“布”时,双方用脚做出想做的动作,进行面对面的PK。一位幼儿获胜该组得一分。总分高的一组获胜。如出现动作或者总分相同,则再次进行游戏。

    59058d0f07f9fd500216f439d8f5f55a.png

    572f7e6ceabde3a15e88ab3279b39426.png

    沐浴着明媚的阳光,让我们一起和同伴玩一玩“石头、剪子、布”吧!

    作者简介

    a3a839c273de53383681cc336398322f.png

    李佳琼,毕业于西安外国语大学英语专业,本科。英语专业八级。

    曾获深圳实验幼儿园“金话筒奖”

    深圳市福田区教育先进个人奖,深圳实验幼儿园雷惠洁“体育游戏工作室”成员。

    爱之语:为孩子插上飞翔的翅膀,在爱的世界自由翱翔。

    fffb88559940dc51c82a7d7dae97bd8b.gifEND fffb88559940dc51c82a7d7dae97bd8b.gif

    作者:李佳琼

    审核:  雷惠洁

    责编:钮钮

    往期回顾

    民间游戏 | 唤醒童年的记忆—跳房子

    民间体育游戏 | 80、90后的童年记忆跳长绳,现在的10后们照样玩的很溜

    超好玩的滚铁环 | 民间体育游戏

    民间体育游戏 | 唤醒童年的记忆—丢沙包

    民间传统体育游戏 | 老鹰捉小鸡

    6081dddaa3bd5ecd58a09d57ec6835b0.png

    展开全文
  • LDPC各类译码方法的MATLAB实现主要内容新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片...,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入...

    主要内容

      LDPC[1]码是一种接近香农极限的“好”码,自二十世纪九十年代被重发现以来,已获得越来越广泛的应用,成为诸多通信领域推荐使用的信道编码。近来,3GPP将其作为5G新空口eMMB应用上的数据传输编码方案。本文将主要介绍LDPC的一些主要译码方法并通过MATLAB实现,这里主要使用的译码方法为SPA([2] Sum-Product Algorithm和积译码算法)、LBP([3] Layered-Belief Propagation分层置信传播译码算法)以及性能更高的IDS(Information Dynamic Schdule)类译码算法如RBP([4] Residual Belief Propagation)、NW-RBP([5] Node Wise-RBP)、SVNF-RBP([6] Silent-Variable-Node-Free RBP)。

    符号说明

    在这里插入图片描述
    Check to Variable: C2V
    Variable to Check: V2C

    算法说明与代码实现

    和积译码算法(SPA)

    基本原理

      LDPC码的概率域BP算法的变量节点和校验节点操作有大量乘法,这样计算量和复杂度都很高,如果将上述0和1的概率信息用对数似然比表示,就可以把乘法运算转换为加法运算,大大降低了运算量,此算法称为和积译码算法。步骤如下:

    1. 初始化
               L v j → c i = C v j L_{v_{j} \rightarrow c_{i}}=C_{v_{j}} Lvjci=Cvj (1)

    2. 校验节点更新
             m c i → v j = 2 × atanh ⁡ ( ∏ v b ∈ N ( c i ) \ v j tanh ⁡ ( L v b → c i 2 ) ) m_{c_{i} \rightarrow v_{j}}=2 \times \operatorname{atanh}\left(\prod_{v_{b} \in N\left(c_{i}\right) \backslash v_{j}} \tanh \left(\frac{L_{v_{b} \rightarrow c_{i}}}{2}\right)\right) mcivj=2×atanh(vbN(ci)\vjtanh(2Lvbci)) (2)

    3. 变量节点更新
         L v j → c i = ∑ c a ∈ N ( v j ) \ c i m c a → v j + C v j L_{v_{j} \rightarrow c_{i}}=\sum_{c_{a} \in N\left(v_{j}\right)\backslash c_{i}} m_{c_{a} \rightarrow v_{j}}+C_{v_{j}} Lvjci=caN(vj)\cimcavj+Cvj (3)

    4. 后验概率信息更新
           L j = ∑ c a ∈ N ( v j ) m c a → v j + C v j L_{j}=\sum_{c_{a} \in N\left(v_{j}\right)} m_{c_{a} \rightarrow v_{j}}+C_{v_{j}} Lj=caN(vj)mcavj+Cvj (4)

    MATLAB代码实现SPA

    function Dec_out = LdpcDecode_SPA(in,H,MaxIter)
    %%% in为解调后的的对数似然比信息,为N维行向量
    %%% H为校验矩阵,MaxIter为最大迭代次数
    [M,N] = size(H);
    %% 初始化
    V_n = in;                       %似然概率
    V_mn = repmat(V_n,M,1);         %m代表校验节点索引,n代表变量节点索引
    V_mn(H == 0) = 0;
    U_mn = zeros(M,N);
    %% 译码
    for i = 1:MaxIter
        % 校验节点更新
        for m = 1:M
            Nm = find(H(m,:)==1);    %校验节点m相邻的变量节点
            for n = 1:length(Nm)
                aa = Nm;
                aa(n) = [];
                % MSA: U_mn(m,Nm(n)) = prod(sign(V_mn(m,aa)))*min(abs(V_mn(m,aa)));
                U_mn(m,Nm(n)) = 2*atanh(prod(tanh(V_mn(m,aa)/2)));
            end
        end
        
        %变量节点更新
        for n = 1:N
            Mn = find(H(:,n)==1);       %变量节点n相邻的校验节点
            for m = 1:length(Mn)
                bb = Mn;
                bb(m) = [];
                V_mn(Mn(m),n) = in(n) + sum(U_mn(bb,n));
            end
            V_n(n) = in(n) + sum(U_mn(Mn,n));%似然概率更新
        end
        
    end
    %% 硬判决
    decBits = zeros(1,N);
    decBits(V_n <= 0) = 1;          %信息位+校验位的译码输出
    Dec_out = decBits(1:N-M);       %仅含信息位的译码输出
    

      注意最小和算法(MSA)与SPA的区别仅在于校验节点更新,MSA算法利用tanh、atanh的单调性,将其非线性运算转化为最招序列中最小值而减少计算量,将MSA的校验节点更新公式为:
           m c i , v j = min ⁡ v s ∈ N ( c i ) v j ( L v b → c i ∣ ) × ∏ v b ∈ N ( c i ) v j sgn ⁡ ( L v b − c i ) m_{c_{i}, v_{j}}=\min _{v_{s} \in N\left(c_{i}\right) v_{j}}\left(L_{v_{b} \rightarrow c_{i}} |\right) \times \prod_{v_{b} \in N\left(c_{i}\right) v_{j}} \operatorname{sgn}\left(L_{v_{b}-c_{i}}\right) mci,vj=minvsN(ci)vj(Lvbci)×vbN(ci)vjsgn(Lvbci) (5)
      已在代码中作出注释,需要时进行替换即可。

    分层译码算法(LBP)

    基本原理

      在SPA中本次的更新值仅可以在下次迭代中使用,LBP采用分层译码的方法,即将H按照水平方向分为数个子层,每层可单独进行SPA译码,上层译码更新后的信息在下层译码时即可使用,其收敛速度是SPA算法的两倍。这里我们将每个校验节点设为一个单独的层。在每一层中:
      变量节点更新: L v j → c i = c v j − m c i → v j L_{v_{j} \rightarrow c_{i}}=c_{v_{j}}-m_{c_{i} \rightarrow v_{j}} Lvjci=cvjmcivj
      校验节点更新: m c i → v j = ∏ v b ∈ N ( c i ) \ v j sign ⁡ ( L v b → c i ) × [ ∑ v b ∈ N ( c i ) \ v j − ln ⁡ tanh ⁡ ( ∣ L v b → c i ∣ 2 ) ] m_{c_{i} \rightarrow v_{j}}=\prod_{v_{b} \in {N}\left(c_{i}\right) \backslash v_{j}} \operatorname{sign}\left(L_{v_{b} \rightarrow c_{i}}\right) \times\left[\sum_{v_{b} \in N\left(c_{i}\right) \backslash v_{j}}-\ln \tanh \left(\frac{\left|L_{v_{b} \rightarrow c_{i}}\right|}{2}\right)\right] mcivj=vbN(ci)\vjsign(Lvbci)×[vbN(ci)\vjlntanh(2Lvbci)]
      后验概率更新则变为: L j = L v j → c i + m c i → v j L_{j}=L_{v_{j} \rightarrow c_{i}}+m_{c_{i} \rightarrow v_{j}} Lj=Lvjci+mcivj
      硬判决方法不变

    MATLAB代码实现LBP

    https://github.com/vodafone-chair/5g-nr-ldpc/blob/master/ldpcDecode.m 注意这里的代码经过了少许修改

    function Dec_out = LdpcDecode_LBP(in,H,MaxIter)
        [M,N] = size(H);
        minVal = realmin('double');
        numEntries = nnz(H);
        Rcv = spalloc(M, N, numEntries);
        Qv = in;
        % Decode
        for ldpcCurIter = 1:MaxIter
            % Loop over all check nodes
            for checkIdx = 1:M
                % Find all neighbouring variable nodes of current check node
                nbVarNodes = find(H(checkIdx,:)==1);
                % Tmp update llr
                tmpLlr = Qv(nbVarNodes) - full(Rcv(checkIdx,nbVarNodes));
                % Compute S = (Smag, Ssign)
                Smag = sum(-log(minVal+tanh(abs(tmpLlr)/2)));
                % Count number of negative elements 
                if mod(sum(tmpLlr<0),2) == 0
                    Ssign = +1;
                else
                    Ssign = -1;
                end
                % Loop all neighbouring variable nodes
                for varIter = 1:length(nbVarNodes)
                    varIdx = nbVarNodes(varIter);
                    Qtmp = Qv(varIdx) - Rcv(checkIdx, varIdx);
                    QtmpMag = -log(minVal+tanh(abs(Qtmp)/2));
                    % Note: +minVal in order to deal with llr=0;
                    % implementation can be improved
                    QtmpSign = sign(Qtmp+minVal);
                    % Update message passing matrix
                    % From reference: Rcv = phi^-1(S-phi(Qtmp))
                    Rcv(checkIdx, varIdx) = Ssign*QtmpSign * (-log(minVal+tanh(abs(Smag-QtmpMag)/2)));
                    % Update Qv. From reference: Qv = Qtmp + Rcv
                    Qv(varIdx)  = Qtmp + Rcv(checkIdx, varIdx);
                end
            end
            Dec_out = zeros(1,N-M);
            Dec_out(Qv(1:N-M)<0) = 1;
        end
    

      代码中的译码顺序是从H矩阵的第一行顺序译码,事实上可以根据码的结构调整译码顺序,合理的安排译码顺序会提高误码性能。

    IDS类算法

      在SPA或者LBP的迭代过程中,一些节点产生的信息可能在少量迭代时即已趋于稳定,而另一部分信息可能徐国更多次的迭代才能稳定下来,而SPA或LBP并不对节点进行区分。IDS类方法考虑节点(变量节点或校验节点)信息的变化,有选择的挑选Tanner图中的边进行信息的更新,实验证明,这类方法在收敛速度与误码性能上较前两种方法更高。
      后面介绍的几种IDS类方法均是基于贪婪的准则选择相应的边进行更新,考虑的均为校验节点处的信息变化。

    单次迭代的终止条件及判决方法

      假设Tanner图中边的总数为E,即校验矩阵H中非零元素数量。通过分析可以发现SPA、LBP的C2V更新次数均为E,下面介绍的IDS类方法考虑的均为校验节点信息的变化,因此当校验节点的更新次数(注意不包括计算残差时的校验节点更新)达到E时本次迭代结束。
      其后验概率更新、硬判决方式与SPA相同,不再赘述。

    残差置信传播(RBP)

    算法内容

      RBP是每次选择校验节点中信息变化最大的边进行更新,考察信息量变化的准则是相邻两次校验节点更新的值得变化量,称为残差,即:
           r c i → v j = ∣ m c i → v j p r e − m c i → v j ∣ r_{c_{i} \rightarrow v_{j}}=\left|m_{c_{i} \rightarrow v_{j}}^{p r e}-m_{c_{i} \rightarrow v_{j}}\right| rcivj=mcivjpremcivj (6)
      可以看到计算残差即是做校验节点更新,然后取与上一次校验节点更新的变化量。但获得残差仅仅是为了进行比较得到具有最大残差的边,而并不进行传播,如上所述,采用SPA更新校验节点的计算量比较大,因此我们使用(5)式即MSA采用的校验节点更新方法计算残差,进行传播时再采用(2)式计算精确的校验节点更新值。实验证明,这种方式对实验结果影响很小,却大幅度较少了计算量。下面介绍的另外几种IDS方法也采取同样的残差计算策略。
      在每次迭代中首先选取具有最有最大残差值的边,假设该边是 c i → v j c_{i} \rightarrow v_{j} civj,使用(2)式计算 m c i → v j m_{c_{i} \rightarrow v_{j}} mcivj并置 r c i → v j = 0 r_{c_{i} \rightarrow v_{j}}=0 rcivj=0;之后使用(3)式计算变量节点更新 v j → c a v_{j} \rightarrow c_{a} vjca其中 c a ∈ N ( v j ) \ c i c_{a} \in N\left(v_{j}\right) \backslash c_{i} caN(vj)\ci;最后使用式(6)更新残差值 r c a → v b r_{c_{a}} \rightarrow v_{b} rcavb,其中 v b ∈ N ( c a ) \ v j v_{b} \in N\left(c_{a}\right) \backslash v_{j} vbN(ca)\vj。判断终止条件是否达到,否则继续执行上述过程。该过程可整理如下:
    在这里插入图片描述
    下面举例说明更新过程(本文中用红色线条表示执行校验节点更新的边,蓝色线条表示变量节点更新的边,黄色线条表示残差更新的边),一码字的Tanner图如下图所示:

    1. 假设经计算选择了边 C 4 → V 3 \mathcal{C}_{4} \rightarrow \mathcal{V}_{3} C4V3
      在这里插入图片描述更新 m c 4 → v 3 m_{c_{4} \rightarrow v_{3}} mc4v3并置 r c 4 → v 3 = 0 r_{c_{4} \rightarrow v_{3}}=0 rc4v3=0
    2. 根据(3)式更新 v 3 → c 2 \mathcal{v}_{3} \rightarrow \mathcal{c}_{2} v3c2 v 3 → c 3 \mathcal{v}_{3} \rightarrow \mathcal{c}_{3} v3c3
      在这里插入图片描述
    3. 根据(5)(6)式更新 r c 2 → v 2 r_{c_{2} \rightarrow v_{2}} rc2v2 r c 3 → v 4 r_{c_{3} \rightarrow v_{4}} rc3v4 r c 3 → v 5 r_{c_{3} \rightarrow v_{5}} rc3v5

    在这里插入图片描述

    RBP的贪婪性

      RBP的策略即是优先更新低可靠性的信息用以“纠正”变量节点,这在直观上是可行的,但由于其选择边的贪婪特性,当图中存在“贪婪组”时,最大残差边的选取很可能在一个该贪婪组中重复选择,这样虽然校验节点或变量节点的信息在不断更新,但却没有新的信息加入,这样当迭代次数增大时并不能提升译码性能。仍采用上面的例子来进一步解释贪婪组:
    在这里插入图片描述
    在这里插入图片描述  该图a中用粗实线表示表示贪婪组中的边共7条,贪婪组中边的总数仅占总边数的一小部分。最大残差边的选取在该贪婪组中以一种固定的顺序被选取,该顺序如图b所示。在该贪婪组中,最大残差值虽然在不断变化,但该贪婪组中却并没有新的信息加入,信息的不完整性注定其不能达到最优的性能,而RBP却在其中浪费了大量的计算资源。实验结果表明,由于对产生信息的节点进行的选择,RBP有着更快的收敛速度,但由于贪婪性,其十分容易陷入贪婪组中,因而相比于SPA、LBP有着更高的误码平层(error floor)。由于SPA、LBP对节点不进行选取,不具贪婪性,因此这些方法不会产生贪婪组。
      下面介绍的NW-RBP与SVNF-RBP是针对于RBP算法的改进版,尽量避免信息的更新陷入贪婪组。

    NW-RBP (Node wise RBP)

      为避免陷入贪婪组中,可以选择多条边进行信息更新。在每次迭代中首先选取具有最有最大残差值的边,假设该边是 c i → v j c_{i} \rightarrow v_{j} civj,使用(2)式计算 m c i → v k m_{c_{i} \rightarrow v_{k}} mcivk,其中 v k ∈ N ( c i ) v_{k} \in N\left(c_{i}\right) vkN(ci) 并置 r c i → v k = 0 r_{c_{i} \rightarrow v_{k}}=0 rcivk=0(注意这里与RBP的区别,RBP是选择 c i → v j c_{i} \rightarrow v_{j} civj一条边,而NW-RBP是选择校验节点 c i c_{i} ci连接的所有边);之后做变量节点更新 L v k → c a L_{v_{k} \rightarrow c_{a}} Lvkca,其中 c a ∈ N ( v k ) \ c i c_{a} \in N\left(v_{k}\right) \backslash c_{i} caN(vk)\ci;最后更新 r c a → v b r_{c_{a} \rightarrow v_{b}} rcavb,其中 v b ∈ N ( c a ) \ v k v_{b} \in N\left(c_{a}\right) \backslash v_{k} vbN(ca)\vk。判断终止条件是否达到,否则继续执行上述过程。该过程可整理如下:
    在这里插入图片描述
    下面举例说明边的选取过程:

    1. 假设经计算选择了边 C 4 → V 3 \mathcal{C}_{4} \rightarrow \mathcal{V}_{3} C4V3,则用(2)式计算 m c i → v k m_{c_{i} \rightarrow v_{k}} mcivk,其中 v k ∈ N ( c i ) v_{k} \in N\left(c_{i}\right) vkN(ci)
      在这里插入图片描述
    2. 使用(3)式计算 L v k → c a L_{v_{k} \rightarrow c_{a}} Lvkca,其中 c a ∈ N ( v k ) \ c i c_{a} \in N\left(v_{k}\right) \backslash c_{i} caN(vk)\ci
      在这里插入图片描述
    3. 使用(5)(6)计算 r c a → v b r_{c_{a} \rightarrow v_{b}} rcavb,其中 v b ∈ N ( c a ) \ v k v_{b} \in N\left(c_{a}\right) \backslash v_{k} vbN(ca)\vk
      在这里插入图片描述  这样通过选取更多的边就可以降低进入贪婪组的概率。

    SVNF-RBP (Silent-Variable-Node-Free RBP)

      RBP通过更新更多的边来来避免陷入贪婪组,但这些边携带的信息可能对译码提升的性能贡献可能很小。另外在迭代过程中我们发现,一些变量节点可能永远没有机会得到更新,这样的变量节点称为Silent Variable Nodes,这些节点的存在会影响译码性能。不同于NW-RBP选取最大残差边对应的校验节点连接的所有边进行校验节点更新,SVNF-RBP让每一个变量节点都有同样的机会去选取其连接的具有最大残差的边,这样就保证了所有被选取的边所携带的信息尽可能的大,同时消除了Silent Variable Nodes。且由于其选取的校验节点更新的边更多,故会进一步降低陷入贪婪组中的危险。
      其执行过程如图所示:
    在这里插入图片描述  这里不再画图示范,选取具有最大残差边后的更新过程与RBP算法完全相同。与RBP的区别仅在于,RBP选取的最大残差边拥有全局最大的残值,而SVNF-RBP选取的边仅是该边对应的变量节点所连接的边中,其残差最大。
      注意到4~13行执行次数达到 d c ‾ \overline{d_{c}} dc(该LDPC码的平均重量)次时,校验节点更新次数为E次,此时一次迭代完成。

    MATLAB代码实现

    function Dec_out = LdpcDecode_IDS(in,H,MaxIter,Method)
    % The input "in" is a 1*N vector which contains the log-likehood ratio that
    % calculated by demodulator. H is the parity check matrix of the LDPC
    % codes. MaxIter defines the maximun iteration of the decoder. The decode
    % algorith controlled by parameter "Method", the choices are 'RBP','NW-RBP',
    % 'SVNF-RBP'
    % Reference: "Informed Dynamic Scheduling for Belief-Propagation Decoding
    % of LDPC Codes" By Andres.  'RBP','NW_RBP'
    % "Two Informed Dynamic Scheduling Strategies for Iterative LDPC Decoders"
    % By Huang-Chang Lee.  'SVNF_RBP'
    
    % Author: Wang Bingbing
    % Last Update: 2019/10/17
        %% Initialization
        [M,N] = size(H);
        V_mn = repmat(in,M,1);         
        V_mn(H == 0) = 0;
        U_mn = zeros(M,N);
        ResC2V = zeros(M,N);
        % Initialize the residual martix.
        for m = 1:M
            Nm = find(H(m,:)==1);    % We use "Nm" to represent a check node's neighbour variable nodes.
            for n = 1:length(Nm)
                aa = Nm;
                aa(n) =[];
                ResC2V(m,Nm(n)) = prod(sign(V_mn(m,aa)))*min(abs(V_mn(m,aa)));
            end
        end
        %% Decode
        % Note that one iteration will be finished after the number of C2V
        % message updates equal to the number of edges in LDPC graph
        switch Method
            case 'RBP'  
                cntCVmax = nnz(H);
                for j = 1:MaxIter
                    cntCV = 0;
                    while cntCV ~= cntCVmax
                        % Choose Ci to Vj
                        [~,IndMax] = max(abs(ResC2V(:)));
                        [ci,vj] = ind2sub(size(ResC2V),IndMax);     
                        % Generate and propagate Ci to Vj and then 
                        % set r(ci,vj)=0
                        Nm_ci = find(H(ci,:)==1);
                        Nm_ci(Nm_ci == vj) = [];
                        U_mn(ci,vj) = 2*atanh(prod(tanh(V_mn(ci,Nm_ci)/2)));
                        ResC2V(ci,vj) = 0;
                        cntCV = cntCV+1;
                        % Update information Vj to its neighbour check 
                        % nodes except Ci
                        Mn_vj = find(H(:,vj)==1);
                        for c = 1:length(Mn_vj)
                            ca = Mn_vj(c);
                            if ca == ci
                                continue
                            end
                            bb = Mn_vj;
                            bb(c) = [];
                            V_mn(ca,vj) = in(vj) + sum(U_mn(bb,vj));
                            % Update residual from ca to its neighbour
                            % variable nodes ecxept vj
                            Nm_ca = find(H(ca,:)==1);
                            for v = 1:length(Nm_ca)
                                vb = Nm_ca(v);
                                if vb == vj
                                    continue
                                end
                                cc = Nm_ca;
                                cc(v) =[];
                                ResC2V(ca,vb) = prod(sign(V_mn(ca,cc)))*min(abs(V_mn(ca,cc)))-ResC2V(ca,vb);
                            end
                        end
                    end
                end
            case 'SVNF-RBP'
                averDv = sum(sum(H))/N;     % Average of variable nodes' degree
                for j = 1:MaxIter
                    for loopInd = 1:averDv
                        for vj = 1:N
                            % find (Cmax,Vmax)
                            Mn = find(H(:,vj) == 1);
                            ResC2V_tmp = ResC2V(Mn,:);
                            ResC2V_tmp(:,vj) = 0;
                            [~,IndMax] = max(abs(ResC2V_tmp(:)));
                            [mt, Vmax] = ind2sub(size(ResC2V_tmp),IndMax);
                            Cmax = Mn(mt);
                            % Generate information Cmax to Vmax and propagate,
                            % then set r(Cmax,Vmax)=0
                            Nm_Cmax = find(H(Cmax,:) == 1);
                            Nm_Cmax(Nm_Cmax == Vmax) = [];      
                            U_mn(Cmax,Vmax) = 2*atanh(prod(tanh(V_mn(Cmax,Nm_Cmax)/2)));
                            ResC2V(Cmax,Vmax) = 0;
                            % Update information Vmax to its neighbour check
                            % nodes except Cmax
                            Mn_Vmax = find(H(:,Vmax) == 1);
                            for c1 = 1:length(Mn_Vmax)
                                Ca = Mn_Vmax(c1);
                                if Ca == Cmax
                                    continue
                                end
                                bb = Mn_Vmax;
                                bb(c1) = [];
                                V_mn(Ca,Vmax) = in(Vmax) + sum(U_mn(bb,Vmax));
                                % Update residual from Ca to its neighbour
                                % variable nodes ecxept Vmax
                                Nm_Ca = find(H(Ca,:) == 1);
                                for v1 = 1:length(Nm_Ca)
                                    Vb = Nm_Ca(v1);
                                    if Vb == Vmax
                                        continue
                                    end
                                    cc = Nm_Ca;
                                    cc(v1) =[];
                                    % For reducing complexity, using MS to
                                    % calculate redidual and using SPA to
                                    % propagate.
                                    ResC2V(Ca,Vb) = prod(sign(V_mn(Ca,cc)))*min(abs(V_mn(Ca,cc)))-ResC2V(Ca,Vb);
                                end
                            end
                        end
                    end
                end
            case 'NW-RBP'
                for j = 1:MaxIter
                    for i = 1:M
                        % Choose Ci to Vj
                        [~,IndMax] = max(abs(ResC2V(:)));
                        [ci,~] = ind2sub(size(ResC2V),IndMax);
                        % Generate and propagate ci to its neighbour check nodes
                        Nm_ci = find(H(ci,:) == 1);
                        for v1 = 1:length(Nm_ci)
                            vk = Nm_ci(v1);
                            aa = Nm_ci(Nm_ci ~= vk);
                            U_mn(ci,vk) = 2*atanh(prod(tanh(V_mn(ci,aa)/2)));
                            ResC2V(ci,vk) = 0;
                            % Generate and propagate vk to its neighbour check 
                            % nodes except ci
                            Mn_vk = find(H(:,vk) == 1);
                            for c1 = 1:length(Mn_vk)
                                ca = Mn_vk(c1);
                                if ca == ci
                                    continue
                                end
                                bb = Mn_vk(Mn_vk ~= ca);
                                V_mn(ca,vk) = in(vk) + sum(U_mn(bb,vk));
                                % Compute residual ca to its neighbour variable
                                % nodes except vk
                                Nm_ca = find(H(ca,:) == 1);
                                for v2 = 1:length(Nm_ca)
                                    vb = Nm_ca(v2);
                                    if vb == vk
                                        continue
                                    end
                                    cc = Nm_ca(Nm_ca ~= vb);
                                    ResC2V(ca,vb) = prod(sign(V_mn(ca,cc)))*min(abs(V_mn(ca,cc)))-ResC2V(ca,vb);
                                end
                            end
                        end
                    end
                end
        end
        V_n = in + sum(U_mn);
        decBits = zeros(1,N);
        decBits(V_n <= 0) = 1;              % Comnination of information bits and check bits
        Dec_out = decBits(1:N-M);           % Only information bits   
    end
    

    代码使用说明

      本文代码的输入参数主要为三个,即in(解调器解调后得到的对数似然信息比),H(LDPC的校验矩阵)与MaxIter(译码器的最大迭代次数),使用时直接调用即可。必须注意的是参量H是完整的校验矩阵H,而非稀疏矩阵,直接采用稀疏性的参数可以大大降低内存使用量,很容易将代码转换为稀疏性的索引,读者可以自行尝试。
      以上程序经验证可以正常运行,虽经过仔细检查核对,但仍不免有所疏漏,请读者在使用时务必留心验证,如发现疏漏之处请立即留言,共同探讨学习。
    此外,十分重要的一点是以上代码仅供理解算法学习使用,运行效率其实很低(我在跑仿真时用的其实是C语言,但其要针对不同码字进行特定的调参,并不适合初学者,需要学习的可以去Github上搜索下载,资源很多),大家在掌握算法思想后可以自行探索如何让优化。

    参考文献

    [1] R. G. Gallager, Low-Density Parity-Check Codes. Cambridge, MA: M.I.T. Press, 1963.
    [2] D. J. C. MacKay, “Good error-correcting codes based on very sparse matrices,” IEEE Trans. Inform. Theory, vol. 45, pp. 399–431, Mar. 1999.
    [3] D. E. Hocevar. “A reduced complexity decoder architecture via layered decoding of LDPC code” in Proc. IEEE Workshop Signal processing and Systems (SIPS. 04), Austin, TX, Oct. 2004, pp. 107-112.
    [4] Casado A I V, Griot M, Wesel R D. Informed Dynamic Scheduling for Belief-Propagation Decoding of LDPC Codes[J]. 2007.
    [5] Lee H C , Ueng Y L , Yeh S M , et al. Two Informed Dynamic Scheduling Strategies for Iterative LDPC Decoders[J]. IEEE Transactions on Communications, 2013, 61(3):886-896.

    展开全文
  • 在Windows等操作系统下,使用的VC、VB、java或C等编程语言,利用相应的WIN32 API函数,编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法
  • 高中信息技术算法与程序设计 VB选修 知识要点 相关...序 2算法的描述方法 1 算法的描述 可分多种表达方法一般用自然语言流程图和伪代码进行描述 2 自然语言描述法 指用人们日常生活中使用的语言本国语言 用自然语言描
  • 学习图形裁剪的基本算法,以及在.net环境下裁剪图形的基本方法。 三、实验内容: 在.net环境中利用裁剪图形的基本方法对任意图形进行裁剪。 四、实验过程及步骤: 1 程序界面设计 2控件属性说明 添加一个...

    一、实验目的:

    熟练掌握在.net环境下对图形的裁剪

    二、实验准备:

    学习图形裁剪的基本算法,以及在.net环境下裁剪图形的基本方法

    三、实验内容:

    .net环境中利用裁剪图形的基本方法对任意图形进行裁剪

    展开全文
  • 例4[浙江高考]下列VB程序段是选择法排序程序的主要部分其中虚线框内代码用于寻找数组元素d(i)到d(n)的最小值 For i 1 To n 1 If i > k Then kt d(i: d(i) d(k: d(k) kt End If Next I 框内代码运行结束时保存最小值...
  • Private Sub btnHare_Click(sender As Object, e As EventArgs) ... '此算法实际是斐波拉契数列算法 Dim intMonth, intNum(), intI As Integer Try If IsNumeric(txtHare.Text) Then intMonth = CInt(txtHare.T...

    题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
    程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21….
    由规律可知:
    f(x) = f(x-1)+f(x-2)

        Private Sub btnHare_Click(sender As Object, e As EventArgs) Handles btnHare.Click
            '此算法实际是斐波拉契数列算法
            Dim intMonth, intNum(), intI As Integer
    
            Try
                If IsNumeric(txtHare.Text) Then
                    intMonth = CInt(txtHare.Text)
                    If intMonth > 0 Then
                        lstHare.Items.Clear()
                        ReDim intNum(intMonth)
                        intNum(0) = 1
                        intNum(1) = 1
                        '计算繁殖数量
                        For intI = 2 To intMonth
                            intNum(intI) = intNum(intI - 2) + intNum(intI - 1)
                        Next
                        '列出结果
                        For intI = 0 To intMonth
                            lstHare.Items.Add(intI & "个月后兔子总数量是:" & intNum(intI))
                        Next
                    Else
                        MsgBox("不能小于0啊!要变回受精卵,还是要返古?")
                    End If
                Else
                    MsgBox("错误,不是数字")
                End If
            Catch ex As Exception
                MsgBox("错误,数字超出范围")
            End Try
        End Sub
    

    本代码在VS2017+win10编译通过

    程序下载
    链接:https://pan.baidu.com/s/11a7v6K55XNDqaVAHNQ4AYg
    提取码:mjc2

    展开全文
  • VB程序实现算法三种基本结构专题复习课前准备算法解决问题的方法和步骤三种基本结构 顺序结构 分支结构 循环结构 选择重复1基本知识点学案130520.doc基本知识点表格思考该题是什么结构2程序设计讲与练例1先后输入...
  • 课前准备 算法解决问题的方法和步骤 三种基本结构 顺序结构 ...该题是什么结构 分支结构 run 流程图 参照学案的表格完成练习12 程序的窗体已经创建只需要补充代码 注意控制时间 3.课内探究 要求 练习1-讲解1 书写格式
  • 算法 + 数据结构程序 运用计算机程序解决实际问题时合理的步骤是 B分析问题设计算法编写程序调试程 序 2 算法的描述方法 1 算法的描述 可分多种表达方法一般用自然语言流程图和伪代码进行描述 2 自然语言描述法 指用...
  • 算法VB初步实现2.pdf

    2020-07-10 10:10:45
    算法VB初步实现2 L/O/G/O 复习算法的特征 有穷性 步骤有限能终止 确定性 确切含义不能模棱两可 可行性 实际能做的而且能在有限时间内完 成 有0个或多个输入 有一个或多个输出 没有输出的算法是无意义的 复习流程图...
  • VB程序设计的常用算法,算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括...通常使用自然语言、结构化流程图、伪代码等来描述算法
  • 一、的生成树和最小生成树 生成树(SpanningTree):如果一个的子图是一个包含所有节点的树,那这个子图就称为生成树。的生成树不惟一。从不同的顶点出发进行遍历,可以得到不同的生成树。专业的说法:在一个...
  • C语言

    万次阅读 多人点赞 2019-12-18 23:01:50
    3.N-S流程图是复杂算法的描述手段。 4.长方形为处理框。椭圆形为连接点。 5.一个c语言只能有一个主函数。 6.函数的定义不可以嵌套,函数的调用可以嵌套。 7.C语言总是以main函数开始执行。 8.常量的类型:整型常量...
  • 专题五 算法VB语言基础 探考...算法的表示流程图 b 2015浙江10月选考,5,2分; 2016浙江4月选考,5,2分; 2016浙江10月选考,5,2分; 2017浙江4月选考,6,2分; 2017浙江11月选考,5,2分; 2018浙江4月选考,7,2分; 2018浙江6月
  • 相似度算法是计算个体之间相似程度的算法,此类算法多如牛毛,这里我们只讨论用于处理文字之间相似度的算法。文本之间的相似度计算应用广泛,比如论文抄袭的判断,就可以用相似度算法先预筛查一遍;再比如网站的文章...
  • 算法 +数据结构程序 运用计算机程序解决实际问题时合理的步骤是 B 分析问题设计算法编写程序调试程 序 2 算法的描述方法 1 算法的描述 可分多种表达方法一般用自然语言流程图和伪代码进行描述 2 自然语言描述法 指用...
  • 冒泡排序VB

    2015-03-28 21:43:21
    冒泡排序VB.NET版,重温简洁版。有需要的可以下载。谢谢评价
  • 将所有顶点分成两个集合, 一个是已选顶点集合,一个是未选顶点集合。并通过不断更新三个列表结点信息,实现这两个集合间的不断转化。第一个列表(Nodes Visited)存储结点是否已被访问的信息,已被访问为True未被访问...
  • 能够帮助你创建工作流程图、对象层次和关系图、网络拓扑图、实体关系图、IVR、工业自动化、genealogy trees 、算法流程图、组织结构图、XML文档、类图等,该控件可轻松的整合到您的应用程序中,且不需要太多的程序...
  • 本文继续讲解另一种可以做磨皮算法的保边滤波器:BEEPS滤波BEEPS滤波即Bi-Exponential Edge-Preserving Smoother,是一种保边滤波器。...论文算法流程如下:BEEPS的效果如下所示:从效果中可以看到,人像皮肤的...
  • 5.的遍历动态演示程序(C#) 6.网上选课系统 7.职工信息管理系统 8.题库专家系统 9.视频点播系统 10.校园新闻发布管理系统 11.客户管理系统 12.车间管理系统 13.停车管理系统 14.毕业设计管理系统 15.教师评定管理...
  • VC6.0 MFC 使用AddFlow画流程图

    千次阅读 2014-04-02 17:42:23
    由于需要我不能让用户编辑流程图的内容,操作如下: 控件右键->属性->Flags->根据需要选择属性,我不能让用户编辑,所以就把以can开头的那些属性都去掉了 更简便的方法就是勾上Readonly复选框

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,738
精华内容 2,295
关键字:

vb算法流程图