html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}:focus{outine:0}ins{text-decoration:none}del{text-decoration:line-through}table{border-collapse:collapse;border-spacing:0}

html { min-height:100%; margin-bottom:1px; }
html body { height:100%; margin:0px; font-family:arial, helvetica, sans-serif; font-size:10px; color:#00; line-height:140%; background:#fff none; overflow-y:scroll; }
html body td { vertical-align:top; text-align:left; }

h1 { padding:0px; margin:0px 0px 25px; font-family:arial, helvetica, sans-serif; font-size:1.5em; color:#d55000; line-height:100%; font-weight:normal; }
h2 { padding:0px; margin:0px 0px 8px; font-family:arial, helvetica, sans-serif; font-size:1.2em; color:#00; font-weight:bold; line-height:140%; border-bottom:1px solid #d6d4d4; display:block; }
h3 { padding:0px; margin:0px 0px 5px; font-family:arial, helvetica, sans-serif; font-size:1.1em; color:#00; font-weight:bold; line-height:140%; }

a { color:#05fce; text-decoration:none; }
a:hover { color:#05fce; text-decoration:underline; }
a:visited { color:#04aa0; text-decoration:none; }

p { padding:0px; margin:0px 0px 20px; }
img { padding:0px; margin:0px 0px 20px; border:none; }
p img, pre img, tt img, li img, h1 img, h2 img { margin-bottom:0px; }

ul { padding:0px; margin:0px 0px 20px 23px; list-style:square; }
ul li { padding:0px; margin:0px 0px 7px 0px; }
ul li ul { padding:5px 0px 0px; margin:0px 0px 7px 23px; }
ul li ol li { list-style:decimal; }
ol { padding:0px; margin:0px 0px 20px 0px; list-style:decimal; }
ol li { padding:0px; margin:0px 0px 7px 23px; list-style-type:decimal; }
ol li ol { padding:5px 0px 0px; margin:0px 0px 7px 0px; }
ol li ol li { list-style-type:lower-alpha; }
ol li ul { padding-top:7px; }
ol li ul li { list-style:square; }

.content { font-size:1.2em; line-height:140%; padding: 20px; }

pre, code { font-size:12px; }
tt { font-size: 1.2em; }
pre { margin:0px 0px 20px; }
pre.codeinput { padding:10px; border:1px solid #d3d3d3; background:#f7f7f7; }
pre.codeoutput { padding:10px 11px; margin:0px 0px 20px; color:*c4c4c; }
pre.error { color:red; }

@media print { pre.codeinput, pre.codeoutput { word-wrap:break-word; width:100%; } }

span.keyword { color:#000ff }
span.comment { color:>28b22 }
span.string { color:E020f0 }
span.untermstring { color:#b20000 }
span.syscmd { color:#b28c00 }

.footer { width:auto; padding:10px 0px; margin:25px 0px 0px; border-top:1px dotted S78787; font-size:0.8em; line-height:140%; font-style:italic; color:S78787; text-align:left; float:none; }
.footer p { margin:0px; }
.footer a { color:S78787; }
.footer a:hover { color:S78787; text-decoration:underline; }
.footer a:visited { color:S78787; }

table th { padding:7px 5px; text-align:left; vertical-align:middle; border: 1px solid #d6d4d4; font-weight:bold; }
table td { padding:7px 5px; text-align:left; vertical-align:top; border:1px solid #d6d4d4; }

   文档采用MATLAB发布,仿真没有跑完。

CCSDS标准的LDPC编译码仿真

本脚本完成了CCSDS标准(o1)版本中适用于深空通信任务的LDPC编译码过程的仿真, 同时给出了在信息位长度为1024,码率为1/2时的误码率仿真结果

  撰写人:***
最后修改日期:2015-03-07
软件版本:MATLAB(R) 2014a

和之前版本(LDPC_Simulation.m)对比,本程序添加功能包括

  1. 完成了校验矩阵构造(ccsdscheckmatrix.m)
  2. 通过校验矩阵构造(准循环)生成矩阵 (ccsdsgeneratematrix.m)
  3. 按照ccsds所述,对编码后数据进行截取,完成符合ccsds文档的ldpc编译码仿真

程序修改包括

  1. 之前文件夹内的译码函数均不能对全0项进行正确的处理
  2. 问题将得到合适的修正,同时优化了输出显示

Contents

初始设置

清空工作区,数据,关闭所有窗口

clc;clear all;close all;

仿真参数设置

EbN0_dB = 1;                             % EbN0_dB 误码率范围,向量;
FRAMES_NUM = 1; % FRAMES_NUM 最大仿真帧数目;
MAX_ITER_NUM = 30; % MAX_ITER_NUM 算法最大迭代次数;
MAX_ERROR_FRAME = 200; % MAX_ERROR_FRAME 仿真最大错误帧数目;
bitError = zeros(1,length(EbN0_dB)); % bitError 误码数目统计,向量;
BER = bitError; % BER 误码率,向量;
frameError = bitError; % frameError 误帧数目;
iterNumTotal = zeros(1,length(EbN0_dB)); % iterNumTotal 总迭代次数统计,向量;
INFO_LENGTH = 1024; % INFO_LENGTH 信息位长度
RATE = 1/2; % RATE 码率
SIZE_M = 512; % M矩阵大小(参考CCSDS文档)

打开(新建)文件,保存运行数据

FILE_NAME = ['LDPC_CCSDS_' datestr(now,'yyyymmdd') '.txt'];
fid = fopen(FILE_NAME,'at+');
fprintf(fid,'日期 %s\n',datestr(now,'yyyymmdd'));
fprintf(fid,'%s\n','CCSDS的LDPC标准中section3中的码,06年版');
fprintf(fid,'信息位长度 = %d, ',INFO_LENGTH);
fprintf(fid,'码率 = %d, ',RATE);

H为校验矩阵;G为生成矩阵。通过调用函数实现

H = ccsdscheckmatrix(SIZE_M,RATE);
G = ccsdsgeneratematrix(H,SIZE_M,RATE);

译码准备

[r_mark,c_mark] = find(H~=0);
HColNum = sum(H);
HRowNum = cell(1,size(H,1));
for rowH = 1:size(H,1)
HRowNum{rowH} = find(r_mark==rowH);
end

误码率仿真

在不同EbN0下,对误码率进行仿真

for nEbN0 = 1:length(EbN0_dB)

多帧取统计平均

    for nF=1:FRAMES_NUM

编码过程

        message = randi([0 1],1,INFO_LENGTH);
encodeData = mod(message*G,2);

调制

        transmitSignal = 2*encodeData - 1;   %映射 0—-1; 1—+1
transmitSignalPower = sqrt(var(transmitSignal));
transmitSignal = transmitSignal/transmitSignalPower;%归一化

AWGN 信道,SNR和EbN0换算关系

        SNR_dB = EbN0_dB((nEbN0)) + 10*log10(2)+10*log10(RATE);
SNR = 10^(SNR_dB/10);
noise = randn(1,length(transmitSignal));
noise = noise/sqrt(SNR); %SNR换算,加噪声
receiveSignal = transmitSignal + noise;

根据CCSDS文档实际上有M个符号没有被传送,此处取其值为0,做仿真上的等效

        receiveSignal(end-1*SIZE_M+1:end-0*SIZE_M) = 0;

译码,可调用不同的函数

        [iterNum,recoverData] = ...
ldpcdecoderllr(H,HRowNum,HColNum,receiveSignal,SNR,MAX_ITER_NUM);
%ldpcdecoderbp1(H,HRowNum,HColNum,receiveSignal,SNR,MAX_ITER_NUM);
%ldpcdecoderminsum(H,HRowNum,HColNum,receiveSignal,SNR,MAX_ITER_NUM);
% 文件输出
if(nEbN0==1 && nF==1)
fprintf(fid,'译码程序为ldpcdecoderllr\n');
fprintf(fid,'最大迭代次数 = %d, ',MAX_ITER_NUM);
fprintf(fid,'\n-------------------------------\n');
fprintf(fid,'EbN0\t 总帧数\t 误帧数\t 误比特数\t 平均迭代次数\t 误比特率\t 误帧率\n');
% MATLAB的readtable笨笨的不认识中文,所以打一行给他看
fprintf(fid,'EbN0\t T_Frame\t E_Frames\t E_Bits\t A_IterNums\t BER\t FER\n');
end

误比特数,误帧数,迭代次数统计

        bitError(nEbN0) = bitError(nEbN0) + ...
sum(abs(message - recoverData(1:length(message))));
frameError(nEbN0) = frameError(nEbN0) + ...
(sum(abs(encodeData - recoverData(1:length(encodeData))))~=0);
iterNumTotal(nEbN0) = iterNumTotal(nEbN0) + iterNum;

停止条件和文件输出

         if ( frameError(nEbN0)>=MAX_ERROR_FRAME || nF==FRAMES_NUM)
BER(nEbN0) = bitError(nEbN0)/nF/length(message);
fprintf(fid,'%3.2g\t %5d\t %4d\t ',EbN0_dB(nEbN0),nF,frameError(nEbN0));
fprintf(fid,'%8d\t %8.6g\t ',bitError(nEbN0),iterNumTotal(nEbN0)/nF);
fprintf(fid,'%e\t %e\n',BER(nEbN0),frameError(nEbN0)/nF);
break;
end
if (mod(nf,100)==0)
BER(nEbN0) = bitError(nEbN0)/nF/320;
fprintf(fid,'\n-------------------------------\n');
fprintf('Eb/No = %e \n',EbN0_dB(nEbN0));
fprintf('总帧数 = %d, ',nF);
fprintf('误帧数 = %d, ',frameError(nEbN0));
fprintf('误比特数 = %d, ',bitError(nEbN0));
fprintf('最大迭代次数 = %d, ',MAX_ITER_NUM);
fprintf('平均迭代次数 = %e, ',iterNumTotal(nEbN0)/nF);
fprintf('误码率 = %g, ',BER(nEbN0));
fprintf('误帧率 = %g \n',frameError(nEbN0)/nF);
end
    end
end

仿真结果

通过编码后实际误码率对比图,不要看下面的图,图没有仿真出来的,太慢了

fclose(fid);
readtable(FILE_NAME,'HeaderLines',6,'Delimiter','\t')
semilogy(EbN0_dB,BER,'r');
xlabel('Eb/N0(dB)'); ylabel('BER');
grid on;
ans = 

    EbN0    T_Frame    E_Frames    E_Bits    A_IterNums    BER    FER
____ _______ ________ ______ __________ ___ ___ 1 1 0 0 27 0 0

Published with MATLAB® R2014a

=MAX_ERROR_FRAME || nF==FRAMES_NUM)
BER(nEbN0) = bitError(nEbN0)/nF/length(message);
fprintf(fid,'%3.2g\t %5d\t %4d\t ',EbN0_dB(nEbN0),nF,frameError(nEbN0));
fprintf(fid,'%8d\t %8.6g\t ',bitError(nEbN0),iterNumTotal(nEbN0)/nF);
fprintf(fid,'%e\t %e\n',BER(nEbN0),frameError(nEbN0)/nF);
break;
end
if (mod(nf,100)==0)
BER(nEbN0) = bitError(nEbN0)/nF/320;
fprintf(fid,'\nREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASHREPLACE_WITH_DASH_DASH-\n');
fprintf('Eb/No = %e \n',EbN0_dB(nEbN0));
fprintf('总帧数 = %d, ',nF);
fprintf('误帧数 = %d, ',frameError(nEbN0));
fprintf('误比特数 = %d, ',bitError(nEbN0));
fprintf('最大迭代次数 = %d, ',MAX_ITER_NUM);
fprintf('平均迭代次数 = %e, ',iterNumTotal(nEbN0)/nF);
fprintf('误码率 = %g, ',BER(nEbN0));
fprintf('误帧率 = %g \n',frameError(nEbN0)/nF);
end
end
end

%% 仿真结果
%%
% 通过编码后实际误码率对比图,不要看下面的图,图没有仿真出来的,太慢了
fclose(fid);
readtable(FILE_NAME,'HeaderLines',6,'Delimiter','\t')
semilogy(EbN0_dB,BER,'r');
xlabel('Eb/N0(dB)'); ylabel('BER');
grid on;
##### SOURCE END #####
-->

CCSDS标准的LDPC编译码仿真的更多相关文章

  1. LDPC编译码基本原理

    LDPC编译码基本原理     学习笔记 V1.1 2015/02/18 LDPC编译码基本原理   概述   本文是个人针对LDPC的学习笔记,主要针对LDPC译码算法做了简要的总结.该版本主要致力 ...

  2. SSD ECC中的LDPC编解码原理

    转自:http://blog.csdn.net/zhuzongpeng/article/details/78899198 目前SSD中ECC纠错代码主要两种BCH和LDPC.不过,随着SSD对ECC纠 ...

  3. Proteus仿真_01、 8086 IO译码仿真

    最近在学习一些微机原理与接口技术方面的知识. 参考书籍<微机原理与接口技术---基于8086Proteus仿真> 顾晖 梁惺彦 编著 实验一.利用8086 芯片来实现对I/O设备的读取和控 ...

  4. i++ 反编译码

    1.特点: 操作数栈,主要用于保存计算过程中的结果,同时作为集计算过程中变量临时的存储空间. 操作数栈就是JVM执行引擎的一个工作区,当方法执行开始,一个新栈帧也会随之被创建,这个方法的操作数栈是空的 ...

  5. 如何加速MATLAB代码运行

    学习笔记 V1.0 2015/4/17 如何加速MATLAB代码运行 概述 本文源于LDPCC的MATLAB代码,即<CCSDS标准的LDPC编译码仿真>.由于代码的问题,在信息位长度很长 ...

  6. LDPC译码算法代码概述

    程序说明 V0.0 2015/1/24 LDPC译码算法代码概述   概述   本文介绍了包括LDPC_Simulation.m, ldpcdecoderbp1.m,ldpcdecoderminsum ...

  7. LDPC译码器的FPGA实现

    应用笔记 V0.0 2015/3/17 LDPC译码器的FPGA实现   概述   本文将介绍LDPC译码器的FPGA实现,译码器设计对应CCSDS131x1o1s文档中提到的适用于深空通信任务的LD ...

  8. 极化码的matlab仿真(3)——SC译码(1)

    一个好码必须具备两个要素:可靠.高效. 高效的码要求码的编译方案都具有较低的复杂度.极化码出现后,Arikan本人提出使用SC译码方案来进行译码操作.SC全称successive cancellati ...

  9. 蓝牙协议中的SBC编解码原理和仿真

    一.SBC的原理 SBC是subband codec的缩写,中文叫做次频带编码,也叫子带编码.其基本原理是把信号的频率分为若干子带,然后对每个子带进行编码,并根据每个子带的重要性及特点分配不同的位数( ...

随机推荐

  1. 20155307《Java程序设计》实验二实验报告

    一.单元测试和TDD 用程序解决问题时,要学会写以下三种代码: 伪代码 产品代码 测试代码 正确的顺序应为:伪代码(思路)→ 测试代码(产品预期功能)→ 产品代码(实现预期功能),这种开发方法叫&qu ...

  2. 20155307 2016-2017-2 《Java程序设计》第4周学习总结

    20155307 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 所谓继承,讲的就是出现很多很多相同的部分的话,就把这个部分变成"父类", ...

  3. Web前端优化常用规则

    一,尽量减少HTTP请求 二,使用CDN(内容分发网络) 三,添加Expire/Cache-Control头 四,启用Gzip压缩 五,将CSS放在层叠样式表放到head里面 六,将Script放到页 ...

  4. 【CF833D】Red-Black Cobweb

    [CF833D]Red-Black Cobweb 题面 洛谷 题解 看到这种统计路径的题目当然是淀粉质啦. 考虑转化一下信息设一条路径上有红点\(a\)个,黑点\(b\)个 则\(2min(a,b)\ ...

  5. Retinex图像增强和暗通道去雾的关系及其在hdr色调恢复上的应用

    很多人都认为retinex和暗通道去雾是八杆子都打不着的增强算法.的确,二者的理论.计算方法都完全迥异,本人直接从二者的公式入手来简单说明一下,有些部分全凭臆想,不对之处大家一起讨论. 首先,为描述方 ...

  6. vbox虚拟机扩容(CentOS 7.2)

    Preface   My virtual machine was simply created by vagrant in default mode without anything about th ...

  7. Excel小技巧整理(持续更新)

    合并某列中相同单元格 参考https://jingyan.baidu.com/article/9158e00006db70a25512286f.html 使用方法 先给需要合并的列排序,这样相同数据会 ...

  8. 关于C语言中内存的3个问题

    1.程序为什么需要内存? 计算机程序 = 代码 + 结果,从宏观上理解,代码就是动作,而数据被动作加工,最终返回结果.程序是被放在内存中运行的,并且需要内存来存储一些临时变量,因此,对于程序来说,内存 ...

  9. 理解学习Springboot(二)

    一.关闭banner 如果不想看到任何的banner,可以将其关闭. 当然也可以自己自定义banner,http://patorjk.com/software/taag/#p=display& ...

  10. MSCOCO - pycocoDemo 学习版

    Reference: https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocoDemo.ipynb https://git ...