【编码译码】基于matlab实现LDPC编码和解码

article/2025/10/14 1:10:28

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机 

⛄ 内容介绍

1. LDPC码背景及概要

LDPC是Low Density Parity Check Code英文缩写,意为低密度奇偶校验码,最早在20世纪60年代由Gallager在他的博士论文中提出,但限于当时的技术条件,缺乏可行的译码算法,此后的35年间基本上被人们忽略。直到1993年Berrou等人发现了Turbo码,在此基础上,1995年前后MacKay和Neal等人对LDPC码重新进行了研究,提出了可行的译码算法,从而进一步发现了LDPC码所具有的良好性能,迅速引起强烈反响和极大关注。经过十几年来的研究和发展,研究人员在各方面都取得了突破性的进展,LDPC码的相关技术也日趋成熟,逐渐有了商业化的应用成果,如今LDPC码已经作为众多新一代通信标准中的信道编码方案:DVB-S2 (Digital Video Broadcasting)、IEEE 802.3an (Ethernet)、IEEE 802.16e (WiMax)、IEEE 802.11n (WiFi)、3GPP 5G标准。

LDPC码是一种稀疏校验矩阵线性分组码,在LDPC编码中,会用到一个叫做H矩阵的校验矩阵(Parity Check Matrix),该校验矩阵为稀疏矩阵。

LDPC编码分为正则编码和非正则编码。正则编码中,校验矩阵的每行和每列中1的个数是固定的。非正则编码中,校验矩阵的每行和每列中1的个数不固定。

LDPC解码过程中,主要包括了两方面内容:硬解码(Hard Decode)和软解码(Soft Decode). LDPC解码的方法就是收到码字之后,与校验矩阵H相乘,如果是0矩阵,则说明收到的是正确码字。反之,则不正确码字,再根据相乘结果进行进一步纠错解码

2. 仿真要求及内容

本次仿真要求通过MATLAB软件对LDPC码进行编译码仿真,通过计算模拟求解归一化最小和算法α参数的最佳值和偏置最小和算法β参数的最佳值,并仿真出四种不同的译码算法下的误码率和误帧率曲线。实验的要求如下:

  1. 采用系统码设计,信息序列长1008比特,码长2016比特,码率1/2,即

  2. 给定的编码矩阵 H_block 是一个18x36的矩阵(Matrix(2016,1008)Block56.mat文件中也是只有18x36个数据),矩阵中每个元素 H(i,j) 是大小为 z*z 的循环移位矩阵(给定z=56),行重为1,它的值表示该矩阵的循环位移偏移量,也是第一行中元素1所处的列的位置,若H(i,j)值为0,表示是全0矩阵。

  3. 给定 $H_block{18×36}$ 矩阵,根据给定规则求解校验矩阵 $H{1008, 2016}$ 。

  4. 根据校验矩阵直接进行编码:利用输入信息比特序列$s$和校验矩阵$H$求得校验比特序列 $p$ , $x = \lbrack p\ s\rbrack$ 即为编码序列。

  5. 编码序列采用BPSK调制并通过AWGN信道添加噪声。

  6. 完成以下四种译码算法的MATLAB代码实现

    1. 和积算法(Sum-Product, SP)

    2. 最小和算法(Min-Sum, MS)

    3. 归一化最小和算法(Normalized Min-Sum, NMS)

    4. 偏置最小和算法(Offset Min-Sum, OMS)

  7. 对于归一化最小和算法和偏置最小和算法,选定一个Eb/N0(1dB附近),仿真BER得出α和β最佳值。α和β取值范围均为0到1,步进为0.1,α和β的BER曲线各画一张图。

  8. 仿真得出Eb/N0在-1dB到2dB(步进0.5dB)时四种译码算法的BER和FER,两个修正最小和算法的α和β都取最佳值。应画BER一张图,FER一张图,每一张图都包含四种算法。

2.1. LDPC编码算法

LDPC码通常由校验矩阵H进行定义。尽管线性分组码可以使用传统的生成矩阵进行编码,但是要通过H求解G在实现上较为困难,因此根据校验矩阵直接进行编码。本次作业采用系统码,且校验矩阵H可分为两部分$$H=\left[ H_p|H_s \right] $$,其中$$H_p$$对应校验比特部分,对$$H_s$$应信息比特部分;编码序列x可分为$$x=\left[ p\ s \right] $$,其中$p$为校验比特序列,$s$为信息比特序列。本作业的编码部分有两种编码算法用以实现LDPC编码。

2.1.1. LDPC编码算法1

由于校验矩阵H的性质:

因此可采用基于H矩阵的通用LDPC编码方法:

由上式可知,本算法需要$H{p}$可逆,且上式p为1x(N-K)向量、s为1xK向量、$H{s}^{T}$为Kx(N-K)矩阵、$H_{p}^{T}$为Kx(N-K)矩阵,因此该算法需要$K(N - K) + (N - K)(N - K)$次比特乘法运算和$(K - 1)(N - K) + (N - K - 1)(N - K)$次比特加法运算。

2.1.2. LDPC编码算法2

将基于H矩阵的通用LDPC编码方法进行分解,具体步骤如下:

1)  首先利用信息序列s计算中间结果

2)  利用编码序列x计算校验比特

故可得:

此算法易错处为:上式中运算过程是应由右侧值决定左侧值,即只有当右侧表达式中各变量的值被赋过一次值时才能对左侧值赋值。例如:

  • 当i=1时,w1已知,p1=w1

  • 当i=2时,w2已知,但p(mb-1)*z并没有值,因此此时还不能立刻求p2,而是应该求p(z+1)=w(z+1) 模二求和 p(1)。即:-当i=(z+1)时,w(z+1)已知,p(1)已知,p(z+1)=w(z+1) 模二求和 p(1)

  • ...

3)  组合p与s

将校验比特序列p和信息比特序列s组合即得到编码序列x。

4)  检验由于编码过程利用的是

因此,得到编码序列x后需要对x进行检验,保证其满足上式即表明完成了正确编码工作。

2.1.3. 两种算法比较

两种算法在时间复杂度上的区别如图所示($\left( H_{p}^{T} \right)^{- 1}$可以离线求解,所以不占用复杂度), 两种编码算法的时间复杂度对比

算法1适用于$H_{p}^{T}$可逆的通用H矩阵,而算法2适用于本次仿真作业特定的H矩阵。由时间复杂度的比较,本次仿真作业采用时间复杂度低的算法2。

2.2. 调制过信道

本次仿真作业采用实数BPSK调制并AWGN信道下进行误码率和误帧率的性能仿真。

2.2.1. BPSK

实数BPSK调制即将比特0映射为符号1,比特1映射为符号-1,变换式为:

其中d为BPSK调制后的符号(序列),x为编码比特(序列)。

在实数BPSK中,信噪比SNR和Eb/N0的转换关系为:

2.2.2. AWGN

BPSK调制后的信号通过AWGN信道将会对信号添加噪声,matlab中给信号添加AWGN噪声方式为:

其中,d为BPSK调制后的符号(序列),n为噪声信号(序列),y为通过AWGN信道后的信号值(序列)。噪声n在matlab中表示为:

其中$\sigma^{2}$为噪声功率,计算方法为:

2.2.3. 初始置信度

信息序列经过编码、BPSK调制,在AWGN信道下接收信号y的对数似然比(LLR,或初始置信度)为:

其中,

2.3. LDPC解码算法

本次仿真实验要求采用四种译码算法,分别为:

  1. 和积算法(Sum-Product, SP)

  2. 最小和算法(Min-Sum, MS)

  3. 归一化最小和算法(Normalized Min-Sum, NMS)

  4. 偏置最小和算法(Offset Min-Sum, OMS)

⛄ 部分代码

clear all

close all

clc

%% 预定义变量

N = 2016;

K = 1008;

R = K/N;

%% 添加工作路径

addpath('Encoder')

addpath('Decoder')

%% H矩阵生成

[ H, Hp, Hs ] = HxMatrixGen();

%% 仿真

Eb_N0_dB = 1.5;

alpha = 0:0.1:1;

BER = zeros(1, length(alpha));

for alpha_i = 1:1:length(alpha)

    disp(['alpha = ' num2str(alpha(alpha_i)) ' is simulating...']);

    

    % 设定停止条件

    if Eb_N0_dB <= 1

        maxErrorBlocks = 50;

    else

        maxErrorBlocks = 3;

    end

    

    % 设定译码算法最大迭代次数

    iterMax = 30;

    

    %设定每个信噪比下最大仿真帧个数

    maxBlocks = 10^6;

    

    % 四种算法的总误码数ErrorBits 和 总误帧数ErrorBlocks 和 所有帧的总循环数blocks 在每个Eb/N0仿真前清零

    ErrorBits_NMS = 0; 

    ErrorBlocks_NMS = 0;

    blocks_NMS = 0;

    

    for i = 1:1:maxBlocks

        % 算法2编码(s --> x)

        s = randi([0, 1], 1, 1008);

        x = Encoder2(Hs, Hp, s);

        if sum(mod(H*(x'), 2)) > 0

            sprintf('> the '+ num2str(i) + ' th encoding is not right');

        end

        % BPSK调制

        d = 1 - 2.*x;

        % AWGN

        SNR_dB = Eb_N0_dB + 10*log10(R) - 10*log10(1/2);

        SNR_linear = 10^(SNR_dB/10);

        sigma = sqrt(1/SNR_linear);

        y = d + sigma*randn(size(d)); % 加噪声

        % 译码端接收

        LLR_y = 2*y/(sigma^2);

        

        % NMS译码

        v_NMS = LDPCDecoder_NMS( H, LLR_y, alpha(alpha_i), iterMax );

        %误比特数、误帧数统计

        errorbits_NMS = sum(s ~= v_NMS);

        ErrorBits_NMS = ErrorBits_NMS + errorbits_NMS;

        blocks_NMS = blocks_NMS + 1;

        

        if errorbits_NMS ~= 0

            ErrorBlocks_NMS = ErrorBlocks_NMS + 1;

        end

        if ErrorBlocks_NMS > maxErrorBlocks

            break;

        end

    end

    BER(1, alpha_i) = ErrorBits_NMS/(K * blocks_NMS);

end

% 绘制BER

xlswrite('./BERforFindBestAlpha.xlsx', BER);

semilogy(alpha, BER, 'K-^', 'LineWidth', 1.0, 'MarkerSize', 5); % 三角marker 黑线

xlabel('\alpha'); ylabel('BER')

⛄ 运行结果

⛄ 参考文献

[1] 魏瑶. 准循环LDPC码的编译码技术研究与MATLAB仿真[D]. 河北大学, 2014.

[2] 陈洪雨. 跳频通信系统中LDPC编译码算法及FPGA的实现[D]. 哈尔滨工程大学, 2016.

[3] 张小华, 彭首峰. 基于Matlab的LDPC码研究及实现[J]. 科技传播, 2012(15):2.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

 


http://chatgpt.dhexx.cn/article/tUsYTD4I.shtml

相关文章

【LDPC编码】CDR系统中LDPC编码,LDPC编码的码长为9216

1.软件版本 matlab2013b 2.系统描述 在广播通信系统中&#xff0c;消息发送的速度和性能是一对矛盾&#xff0c;当发送速度快&#xff0c;则必然会降低消息的可靠性&#xff0c;当要求系统的性能&#xff0c;则必然会降低发送码率。为了提高系统的性能&#xff0c;并尽可能的…

5G LDPC编码流程

参照3GPP的标准文档&#xff0c;摘录其中下行共享信道与寻呼信道的LDPC编码流程&#xff0c;以便于进行对应的软件仿真 传输块加CRC校验   记待传输的数据块序列为 a 0 , a 1 , ⋯ , a A − 1 a_0,a_1,\cdots,a_{A-1} a0​,a1​,⋯,aA−1​&#xff0c;其中 A A A为传输块的负…

linux杀进程

linux学习心得 查看所有进行中的后台进程 命令 &#xff1a;ps aux ps命令查看应用进程。 后面的参数 -a &#xff1a; 显示现行终端机下的所有进程&#xff0c;包括其他用户的进程&#xff1b; -u &#xff1a;以用户为主的进程状态 &#xff1b; x &#xff1a;通常与 a …

Linux找到进程并杀死

第一种情况&#xff1a; 写脚本的时候没没把程序杀死&#xff0c;再次启动发现端口被占用了&#xff0c;于是找到原来的端口然后kill掉重启 用下面2个命令可以&#xff1a; netstat -tunlp|grep 8080t&#xff1a;表示查看tcp u&#xff1a;表示查看udp n&#xff1a;表示端口…

在 Linux 中杀死一个进程

在 Linux 中&#xff0c;假如一个进程的 PID 为 3810&#xff0c;那么结束一个进程可以使用如下命令&#xff1a; $ kill -9 3810 以 Postman 为例&#xff0c;首先我们需要找到它的进程号&#xff0c;然后才能杀死。 查找进程号使用 ps 命令&#xff0c;不过有一个强大的参…

Linux命令行下杀死一个进程

在做项目的时候经常会出现程序死机、锁死、无响应等情况&#xff0c;这时候就需要找到程序相应的进程将其杀掉即可。步骤如下&#xff1a; 1.定位进程 top命令&#xff1a;可以实时动态地查看系统的整体运行情况&#xff0c;是一个综合了多方信息监测系统性能和运行信息的实用…

linux中进程杀不死解决办法

如图&#xff0c;多次在kill -9 此进程后依然存在 先说解决办法&#xff0c;输入过滤命令ps -ef|grep xxx&#xff08;此处写要过滤的进程名字&#xff09;&#xff0c;例如 之后kill掉对应的进程号&#xff0c;如图 问题解决。 如果有多个子进程可以先过滤再一起杀死&#xf…

Linux中kill命令杀不掉进程的解决办法

1、进程杀不掉的原因有两种&#xff1a; &#xff08;1&#xff09;这个进程是僵尸进程 &#xff1b; &#xff08;2&#xff09;此进程是"核心态"进程。 2、解决办法&#xff1a; &#xff08;1&#xff09;进入到“/proc/进程号”目录下&#xff0c;执行“cat stat…

Linux 批量杀进程

1.查需要杀死的进程 ps -ef | grep yum 2.去除掉里面的grep ps -ef | grep yum | grep -v grep 3.打印kill命令 ps -ef | grep yum | grep -v grep | awk {print "kill "$2} 4.执行kill命令 ps -ef | grep yum | grep -v grep | awk {print "kill "$2} …

linux 找出谁杀了进程

目录 Linux Signal 到底是什么信号 OOM 谁发的信号 systemtap audit 案例与总结 服务端的程序&#xff0c;一般都希望比较长时间的运行&#xff0c;比如7*24小时。不过&#xff0c;程序也需要更新&#xff0c;比如修Bug&#xff0c;比如增加新功能&#xff0c;比如修复增…

Linux操作系统之批量杀死进程

前言 在Linux操作系统中&#xff0c;一般常用的杀死进程的命令是 kill 、 pkill 、 killall &#xff0c;根据杀死单个进程拓展至批量杀死进程。 1、查看指定名称的进程&#xff0c;如下查看运行wps程序的进程&#xff1a; ps -ef | grep wps | grep -v grep 结果如下&…

在 VUE中,动态加载JS文件

需求 在vue组件中需要调用的函数方法名是相同的&#xff08;接口相同&#xff09;&#xff0c;但是按照页面不同需要导入不同JS文件 。如下&#xff1a; 然而上面这种写法肯定是行不通的&#xff0c;但表达的需求很明确。根据menuId的不同从JS文件中获取方法 解决方案 promi…

原生js实现动态加载js文件?

一、写在前面 今天拼多多笔试题&#xff0c;题目如下&#xff1a; 实现一个动态加载函数function loadScript(src, attrs)返回Promise, 其中 src是脚本地址&#xff0c;attrs是脚本属性。二、具体实现 <script>function loadScript(src, attrs) {return new Promise((r…

JavaScript网页实例:在网页里动态加载JavaScript

把一些逻辑独立的JavaScript脚本文件单独加载&#xff0c;是一种常见的JavaScript动态加载技术。这样做的好处有很多&#xff0c;比如可以减少不必要的JavaScript脚本文件的加载&#xff0c;以提高网页浏览速度。 补充代码&#xff0c;要求用户在网页中点击【动态加载】按钮后…

html动态加载js方法,动态引入js四种方法总结

这次给大家带来动态引入js四种方法总结,动态引入js四种方法的注意事项有哪些,下面就是实战案例,一起来看一下。 index.html test.jsalert("hello! I am test.js"); var str="1"; dynamic.js//第一种方式:直接document.write 但这样会把当前的页面全覆写…

动态加载js文件

1、使用场景 例如本人当前需求——给当前的管理系统的bootstarpTable的提示语修改各个国家的语言&#xff08;语言提示根据当前管理系统的语言环境&#xff09;。 也就是根据如图所示的语言&#xff0c;来变换bootstarptable的提示语&#xff0c; 类似这种提示语。 看看是怎么做…

js中动态加载js

下面介绍一种JS代码优化的一个小技巧&#xff0c;通过动态加载引入js外部文件来提高网页加载速度 【基本优化】 将所有需要的<script>标签都放在</body>之前&#xff0c;确保脚本执行之前完成页面渲染而不会造成页面堵塞问题&#xff0c;这个大家都懂的。 【合…

统计学 假设检验 P值

统计学 假设检验 P值 什么是P值 案例分析 来自总体方差检测的题目 p值的计算 P值

统计假设检验中的P值及置信区间理解

置信区间&#xff0c;就是一种区间估计。 例如&#xff0c;使用95%假设区间估计&#xff0c; 正式的期望无法获取&#xff0c;可用期望的均值替代 显著性P-value 假设&#xff1a;说你的硬币是公平的 检验假设&#xff1a;扔十次&#xff0c;看实验的结果是不是和假设相符 …

统计|假设检验中的P值(pvalue)如何看/怎样理解

本博文源于《商务统计》&#xff0c;之前在做matlab编程和spss统计分析中&#xff0c;对p值的理解就是懵懵懂懂&#xff0c;无法确定出真正含义。今天就以新生儿的例子来观看p值是如何看的&#xff0c;并且了解假设检验的5个步骤。 例子&#xff1a;新生儿 假设检验的一般步骤…