1.1 文件夹介绍
随机包含了一篇论文的仿真结果的源代码,该论文的标题是 "
源代码CRC-aided_SPARCs_for_URA-main,一共包括三个文件夹:
"CRC-BMST codes for stitching",
"CRC-aided SPARCs for URA" ,
"parameter configurations"。
关于 "CRC-BMST codes for stitching" 文件夹,它包括:
1.CRC-BMST codes文件夹,其中包含了我们提出的 CRC-BMST 码的 MATLAB 源代码的实现;
2.Alex_Fengler_tree_codes文件夹,其中包含了实现原始树码的 MATLAB 源代码(由
关于 "CRC-aided SPARCs for URA" 文件夹,它包括用于通过我们提出的级联编码方案模拟整个无源随机访问信道模型的 MATLAB 源代码。
关于 "parameter configurations" 文件夹,它包含了三个存储论文仿真结果中使用的具体参数的 '.mat' 文件。
1.2 m文件介绍
CRC-BMST codes for stitching文件夹中的
m
文件:CRC-BMST codes子文件夹:
1.CRC_check.m
2.CRC_encoding.m
3.outer_CRC_checks_BMST_efficient.m
4.outer_encoding_BMST.m
5.UMAC_lossless_stitching_CRC_BMST.m
Alex_Fengler_tree_codes子文件夹:
1.outerDecoder.m
2.outerEncoder.m
3.UMAC_lossless_stitching_tree_codes.m
CRC-aided SPARCs for URA文件夹中的
m
文件:1.CRC_check.m
2.CRC_encoding.m
3.outer_CRC_checks_BMST_efficient.m
4.outer_encoding_BMST.m
5.Outer_UMAC_stitching_CRC_BMST.m
6.AMP_SPARCs_UMAC.m
7.MAP_AMP_Hybrid_SPARCs_UMAC.m
8.MAP_AMP_hybrid_UMAC_CRC_BMST.m
9.MAP_AMP_hybrid_UMAC_CRC_BMST_extra_iteration.m
10.FWHT_user_subsampling.m
另外,该文件夹还包含一个
.c
文件和一个mexw64
文件其中
.mexw64
文件是 MATLAB 编译的二进制 MEX 文件的一种类型。MEX 文件是用 C、C++ 或 Fortran 编写的 MATLAB 可执行函数,通过编译生成的二进制文件。.mexw64
文件是在 Windows 平台上生成的 MEX 文件,并且是 64 位 Windows 系统的版本。11.fwht_user.c
12.fwht_user.mexw64
1.3 mat文件介绍
parameter configurations文件夹中的
mat
文件:1.configurations_UMAC_J_15_L_11_B_75 (Fig_3).mat
2.configurations_UMAC_J_14_L_7_B_50 (Fig_4).mat
3.configurations_UMAC_J_15_L_11_B_75 (Fig_5).mat
二、CRC-BMST codes for stitching
2.1 CRC-BMST codes
实现框图:
2.1.1 CRC_check.m
function check = CRC_check(r_c, g)% 该函数的目的是通过 CRC 校验来确定接收到的多项式是否包含错误
check = 0;
[~, r] = gfdeconv(fliplr(r_c), fliplr(g));% r_c 是接收到的多项式,g 是生成多项式。gfdeconv 函数返回商和余数,但在此处只取了余数,即 r
if (sum(r)==0)
check = 1;
end % 检查余数 r 的各项之和是否为零。如果为零,说明整个除法过程没有余数,即接收到的多项式是没有错误的。此时,将 check 设置为 1,表示通过了 CRC 校验
end
注:1、gfdeconv
函数:用于对两个有限域(GF)多项式进行除法运算
[q, r] = gfdeconv(a, b, m)
其中,a和b是GF多项式的系数向量,m是GF的阶数(GF(2^m))。
函数返回商多项式
q
和余数多项式r
,使得a = conv(b, q) + r,其中conv表示多项式的卷积运算。m默认为1,GF(2).
2、fliplr
函数:将数组从左向右翻转,因为 gfdeconv
函数要求输入的多项式系数是从高次到低次排列的
3、关于CRC码:是采用二进制除法(没有进位,用XOR来代替减法)相除得到的余数,在做除法之前,要在信息数据之后先加上r
个0.
2.1.2 outer_CRC_checks_BMST_efficient.m
function [current_blocks, check] = outer_CRC_checks_BMST_efficient(previous_blocks, previous_superimposed_sum, current_path, current_block, num_protect_section, m, memory, r, CRC_poly)
% 用于进行 CRC(Cyclic Redundancy Check)检查的程序,其中使用了 BMST(Block Markov Superposition Transmission)编码的结果
% store previous original_block_bits so that the same info doesn't need to compute twice.
% start from the second layer.
% current_blocks:存储当前阶段(或轮次)的恢复信息比特。
% check:指示当前比特是否满足 CRC 条件的指示器。
% previous_blocks:所有先前恢复的信息块比特。
% previous_superimposed_sum:先前计算的比特级别的累积和,与current_path结合可获取当前阶段的累积和。
% current_path:包含所有节点的当前路径。
% current_block:当前阶段或轮次。
% num_protect_section:受保护部分的数量。
% m:每个块的比特数,即 log2(M)。
% memory:在 BMST 编码中使用的编码记忆参数。
% r:指示每轮的冗余比特数量的向量。
% CRC_poly:选择的 CRC 生成多项式。
% 这些参数主要用于BMST,可不详细研究
check = 0;
original_block_bits = zeros(current_block, m);% 初始化矩阵,其中包含了先前阶段所有块的信息比特
original_block_bits(1:current_block-1, :) = previous_blocks;% 将先前已经恢复的块的信息比特复制到 original_block_bits 中。
current_block_bits = de2bi(current_path(current_block)-1, m);%将当前阶段的信息块下标转换为二进制,并存储在 current_block_bits 中。
original_block_bits(current_block, :) = mod(current_block_bits-previous_superimposed_sum, 2); % 计算并存储当前阶段的信息比特。这里,对 current_block_bits 减去 previous_superimposed_sum,然后取模 2 (实际上是异或运算(XOR))
current_path_info_bits = [];% 用于存储当前路径的信息比特
start_cc = 0;% 用于追踪当前路径信息比特的起始位置
for cc = current_block - num_protect_section+1 : current_block-1 % 循环遍历当前路径中受保护的部分
end_cc = start_cc + m - r(cc);% 计算当前路径信息比特的结束位置,r(cc)表示本轮的冗余。
current_path_info_bits(start_cc+1: end_cc) = original_block_bits(cc, 1:m-r(cc));% 将先前阶段中不包含冗余比特的信息比特复制到 current_path_info_bits 中,形成当前路径的信息比特。
start_cc = end_cc;% 更新 start_cc 为当前路径信息比特的结束位置,以便下一次循环计算。
end
current_blocks = original_block_bits;
check_bits = [current_path_info_bits, original_block_bits(current_block, :)];% 将当前路径中的信息位current_path_info_bits和当前块的信息位original_block_bits(current_block, :)合并成一个检查位序列check_bits
check = CRC_check(check_bits, CRC_poly);
% 调用CRC_check函数进行CRC检查,将check_bits和CRC生成多项式CRC_poly传递给该函数,检查是否通过CRC验证。如果通过,check被设置为1,表示检查通过;否则,check为0,表示检查未通过。
end
%思路就是先对接收块实现BMST,最后用CRC来检查是否出错
注:1、概念
-
BMST 编码(Block Markov Superposition Transmission): BMST 是一种用于通信系统的编码技术。在 BMST 编码中,信息比特被分块处理,每个块的编码依赖于前一块的编码结果,这种依赖关系是通过马尔可夫链实现的。BMST 编码可以用于提高通信系统的性能和可靠性。
-
CRC 检查(Cyclic Redundancy Check): CRC 是一种纠错校验方法,通常用于检测或纠正数据传输中的错误。CRC 使用多项式除法来生成冗余校验码,然后将这些校验码附加到原始数据中。在接收端,通过再次进行多项式除法,可以检测或纠正数据中的错误。
2、
de2bi
函数:de2bi
函数用于将这个整数转换为二进制表示,并m
表示每个二进制表示的比特数。例如,如果
m
是 4,那么de2bi(current_path(current_block)-1, m)
将把current_path(current_block)-1
转换为一个包含 4 位的二进制向量。这个二进制向量表示了信息块的信息比特。
2.1.3 CRC_encoding.m
function c = CRC_encoding(m, g)
% m :信息向量
% g :生成多项式
% c : CRC编码的结果
% 注意:由于gfdeconv中的多项式次数是按升序排列的,因此需要执行fliplr操作。
c = zeros(1, length(g)-1);
m_r = [m zeros(1, length(g)-1)];% 在信息向量 m 的末尾添加零(后面留的是冗余位)
[~, r] = gfdeconv(fliplr(m_r), fliplr(g));% m_r 除以 g 得到的CRC码的长度会比 g 的长度大,因为需要加冗余位,这里只保留余数 r (r也是向量)
c(1:length(r)) = r;% 将余数 r 的内容复制到CRC编码结果 c 中
c = fliplr(c);% 由于之前进行了fliplr操作,这里再次使用fliplr将结果翻转,以得到正确的CRC编码结果。
end
2.1.4 outer_encoding_BMST.m
function outer_encoded = outer_encoding_BMST(message, memory, m, num_round, r, protect_sections, num_info_bits_round, orderings)
% CRC-BMST 编码过程
% 只有信息比特(message bits)受到CRC码的保护,而不是全部比特。
% message: 要进行编码的消息比特;
% memory: BNST中的编码内存;
% m: 每块的比特数;
% num_round: 每个用户的原始消息被分割的次数;
% r: 一个向量,指示每一轮的冗余比特数;
% protect_sections: 前面受保护的块的数量;
% num_info_bits_round: 一个向量,指示每一轮的信息比特数;
% orderings: CRC-BMST编码过程中使用的交织器;
% 不同CRC位下的CRC生成多项式(r位CRC码最多可保护2^r-1-r位信息位)
poly{4} = [1 0 0 1 1]; % 信息位为2^4-1-4=11
%poly{5} = [1 0 0 1 0 1]; % 信息位为 26
poly{5} = [1 0 1 0 1 1]; % 信息位为 10
%poly{6} = [1 0 0 0 0 1 1]; % 信息位为 57
poly{6} = [1 0 0 0 1 1 1]; % 信息位为 25
poly{7} = [1 0 1 1 0 1 1 1]; % 信息位为 56
%poly{8} = [1 0 0 1 0 1 1 1 1]; % 信息位为 119
%poly{8} = [1 0 0 0 0 0 1 1 1]; % 信息位为 119
poly{8} = [1 1 1 0 1 0 1 1 1]; % 信息位为 9
%poly{9} = [1 0 1 0 0 1 0 1 1 1]; % 信息位为 246
%poly{9} = [1 0 1 1 1 1 1 0 1 1]; % 信息位为 246
%poly{9} = [1 1 0 0 0 0 1 0 1 1]; % 信息位为 13
poly{9} = [1 0 0 1 1 1 1 0 0 1]; % 信息位为 8
%poly{10} = [1 1 0 0 0 1 1 0 0 1 1]; % 信息位为 501
%poly{10} = [1 0 1 0 1 1 1 0 0 1 1]; % 信息位为 21
%poly{10} = [1 0 1 0 0 0 1 1 1 0 1]; % 信息位为 12
poly{10} = [1 0 1 0 0 1 1 0 1 1 1]; % 信息位为 5
% poly{11} = [1 0 0 1 1 1 1 0 1 0 1 1]; % 信息位为 4
poly{11} = [1 0 1 0 1 1 1 0 0 0 1 1]; % 信息位为 12
poly{12} = [1 0 1 0 0 1 0 0 1 1 1 1 1]; % 信息位为 11
poly{13} = [1 0 0 0 0 1 0 1 1 0 1 1 1 1]; % 信息位为 11
poly{14} = [1 0 0 0 1 1 0 1 1 1 0 0 0 1 1]; % 信息位为 11
outer_encoded(1:m) = message(1:m);% message 的前 m 位直接赋值给 outer_encoded,因为信息位不需要进行 CRC-BMST 编码。
message_last_end =