在 CCSDS 蓝皮书中验证 LDPC 矩阵

信息处理 matlab 数字通信 信道编码 前向纠错 低功耗
2022-02-08 12:58:04

我的理解是 LDPC 是一个线性块码,它的生成矩阵和奇偶校验矩阵满足GHGHT=0

我在这里使用 CCSDS 蓝皮书作为参考,特别是图 7-1 和 7-2。

图 7-1 和表 7-1 产生了一个奇偶校验矩阵,使用循环构造,列权重为 4,行权重为 32。除了给出常规权重之外,循环似乎有些随意;

  • 流通者背后是否有原因/方法?

另外,我已经在 MATLAB 中实现了这两个矩阵,但是在将生成矩阵与奇偶校验矩阵的转置相乘时没有得到一个零矩阵,我也从GitHub - nicopi - LDPC Codes for Deep-Space Communications得到了这个结果(特别是 data.mat 中的矩阵)。GH

  • 有什么我在概念上遗漏的东西可以解释这个奇偶校验结果吗?

我编写了以下代码来创建矩阵:

在给定所有循环的第一行的情况下创建矩阵的辅助函数:

function [matrix,matrixHex] = auxiliary_expandCirculants(circulantSize,matrixSize,circulantFirstRow,circulantFirstRowType)
% Inputs:
%   circulantSize: size of the circulant
%   matrixSize: dimensions of the matrix in terms of circulants
%   circulantFirstRow: either 1) a matrix where each row corresponds to the
%       locations of 1s in the first row of each circulant, or 2) a cell
%       containing character arrays of the hex value of the first row of
%       each circulant; circulants are enumerated from left to right and
%       top to bottom
%   circulantFirstRowType: 'binary' if circulantFirstRow is a matrix or
%   'hex' if circulantFirstRow is a cell
% Outputs:
%   matrix: the matrix corresponding to the specified input circulants
%   matrixHex: a single character array containing the hex values of all
%       circulant first rows

% check for errors
if prod(matrixSize)~=length(circulantFirstRow)
    error('The number of circulants in the matrix and the number of entries in the input data file should be equal.');
end

if strcmp(circulantFirstRowType,'binary')
    matrixHex = '';
elseif strcmp(circulantFirstRowType,'hex')
    matrixHex = strjoin(circulantFirstRow);
    matrixHex = matrixHex(~isspace(matrixHex));
end

% fill matrix
matrix = zeros(circulantSize*matrixSize);
for ii=1:matrixSize(1)
    for jj=1:matrixSize(2)
        
        % used to index the input 'circulantFirstRow'
        idxMatrix = (ii-1)*matrixSize(2)+jj;
        
        % represent the first row of the circulant as a binary vector
        if strcmp(circulantFirstRowType,'binary')
            row = zeros(1,circulantSize);
            row(circulantFirstRow(idxMatrix,:)+1) = 1; % one-based indexing
        elseif strcmp(circulantFirstRowType,'hex')
            currentHex = circulantFirstRow{idxMatrix};
            row = [];
            for kk=1:ceil(circulantSize/4)
                row = [de2bi(hex2dec(currentHex(end-kk+1)),'left-msb',min(4,circulantSize-length(row))) row]; % generate from right to left
            end
        end
        
        circulant = toeplitz([row(1) fliplr(row(2:end))],row);
        idxMatrixRows = (ii-1)*circulantSize+1:ii*circulantSize;
        idxMatrixCols = (jj-1)*circulantSize+1:jj*circulantSize;
        matrix(idxMatrixRows,idxMatrixCols) = circulant;
        
        % generate hexadecimal value for circulant first rows
        if strcmp(circulantFirstRowType,'binary')
            circulantFirstRowHex = '';
            for kk=1:ceil(circulantSize/4)
                idxLeft = max(1,circulantSize-kk*4+1);
                idxRight = circulantSize-(kk-1)*4;
                circulantFirstRowHex = [dec2hex(bi2de(row(idxLeft:idxRight),'left-msb'),1) circulantFirstRowHex]; % generate each hex value from right to left
            end
            matrixHex = [matrixHex circulantFirstRowHex]; % concatenate all hex values from left to right
        end
    end
end

end

主文件:

circulantSize = 511;
baseMatrixSize = [2 16];
circulantFirstRow = readmatrix('data_8176-7156.csv'); % corresponds to Table 7-1 of the blue book
fileID = fopen('data_generatorParityColumns.txt','r'); % corresponds to Table C-1 of the blue book
formatSpec = '%s';
generatorParitySize = [baseMatrixSize(2)-baseMatrixSize(1) baseMatrixSize(1)];
generatorParityColumnsHex = textscan(fileID,formatSpec);
generatorParityColumnsHex = generatorParityColumnsHex{1};

% create base matrix as given by Figure 7-1 of the blue book
[baseMatrix,baseMatrixHex] = auxiliary_expandCirculants(circulantSize,baseMatrixSize,circulantFirstRow,'binary');

% create generator matrix as given by Figure 7-2 of the blue book
[generatorParityColumns,~] = auxiliary_expandCirculants(circulantSize,generatorParitySize,generatorParityColumnsHex,'hex');
generatorMatrix = [eye(size(generatorParityColumns,1)) generatorParityColumns];

generatorMatrix*baseMatrix.'

data_8176-7156.csv: 一个两列的csv文件,对应蓝皮书表7-1的中间列

0   176
12  239
0   352
24  431
0   392
151 409
0   351
9   359
0   307
53  329
0   207
18  281
0   399
202 457
0   247
36  261
99  471
130 473
198 435
260 478
215 420
282 481
48  396
193 445
273 430
302 451
96  379
191 386
244 467
364 470
51  382
192 414

'data_generatorParityColumns.txt':蓝皮书表C-1对应的文本文件

55BF56CC55283DFEEFEA8C8CFF04E1EBD9067710988E25048D67525426939E2068D2DC6FCD2F822BEB6BD96C8A76F4932AAE9BC53AD20A2A9C86BB461E43759C
6855AE08698A50AA3051768793DC238544AF3FE987391021AAF6383A6503409C3CE971A80B3ECE12363EE809A01D91204F1811123EAB867D3E40E8C652585D28
62B21CF0AEE0649FA67B7D0EA6551C1CD194CA77501E0FCF8C85867B9CF679C18BCF7939E10F8550661848A4E0A9E9EDB7DAB9EDABA18C168C8E28AACDDEAB1E
64B71F486AD57125660C4512247B229F0017BA649C6C11148FB00B70808286F1A9790748D296A593FA4FD2C6D7AAF7750F0C71B31AEE5B400C7F5D73AAF00710
681A8E51420BD8294ECE13E491D618083FFBBA830DB5FAF330209877D801F92B5E07117C57E75F6F0D873B3E520F21EAFD78C1612C6228111A369D5790F5929A
04DF1DD77F1C20C1FB570D7DD7A1219EAECEA4B2877282651B0FFE713DF338A63263BC0E324A87E2DC1AD64C9F10AAA585ED6905946EE167A73CF04AD2AF9218
35951FEE6F20C902296C9488003345E6C5526C5519230454C556B8A04FC0DC642D682D94B4594B5197037DF15B5817B26F16D0A3302C09383412822F6D2B234E
7681CF7F278380E28F1262B22F40BF3405BFB92311A8A34D084C086464777431DBFDDD2E82A2E6742BAD6533B51B2BDEE0377E9F6E63DCA0B0F1DF97E73D5CD8
188157AE41830744BAE0ADA6295E08B79A44081E111F69BBE7831D07BEEBF76232E065F752D4F218D39B6C5BF20AE5B8FF172A7F1F680E6BF5AAC3C4343736C2
5D80A6007C175B5C0DD88A442440E2C29C6A136BBCE0D95A58A83B48CA0E7474E9476C92E33D164BFF943A61CE1031DFF441B0B175209B498394F4794644392E
60CD1F1C282A1612657E8C7C1420332CA245C0756F78744C807966C3E1326438878BD2CCC83388415A612705AB192B3512EEF0D95248F7B73E5B0F412BF76DB4
434B697B98C9F3E48502C8DBD891D0A0386996146DEBEF11D4B833033E05EDC28F808F25E8F314135E6675B7608B66F7FF3392308242930025DDC4BB65CD7B6E
766855125CFDC804DAF8DBE3660E8686420230ED4E049DF11D82E357C54FE256EA01F5681D95544C7A1E32B7C30A8E6CF5D0869E754FFDE6AEFA6D7BE8F1B148
222975D325A487FE560A6D146311578D9C5501D28BC0A1FB48C9BDA173E869133A3AA9506C42AE9F466E85611FC5F8F74E439638D66D2F00C682987A96D8887C
14B5F98E8D55FC8E9B4EE453C6963E052147A857AC1E08675D99A308E7269FAC5600D7B155DE8CB1BAC786F45B46B523073692DE745FDF10724DDA38FD093B1C
1B71AFFB8117BCF8B5D002A99FEEA49503C0359B056963FE5271140E626F6F8FCE9F29B37047F9CA89EBCE760405C6277F329065DF21AB3B779AB3E8C8955400
0008B4E899E5F7E692BDCE69CE3FAD997183CFAEB2785D0C3D9CAE510316D4BD65A2A06CBA7F4E4C4A80839ACA81012343648EEA8DBBA2464A68E115AB3F4034
5B7FE6808A10EA42FEF0ED9B41920F82023085C106FBBC1F56B567A14257021BC5FDA60CBA05B08FAD6DC3B0410295884C7CCDE0E56347D649DE6DDCEEB0C95E
5E9B2B33EF82D0E64AA2226D6A0ADCD179D5932EE1CF401B336449D0FF775754CA56650716E61A43F963D59865C7F017F53830514306649822CAA72C152F6EB2
2CD8140C8A37DE0D0261259F63AA2A420A8F81FECB661DBA5C62DF6C817B4A61D2BC1F068A50DFD0EA8FE1BD387601062E2276A4987A19A70B460C54F215E184
06F1FF249192F2EAF063488E267EEE994E7760995C4FA6FFA0E4241825A7F5B65C74FB16AC4C891BC008D33AD4FF97523EE5BD14126916E0502FF2F8E4A07FC2
65287840D00243278F41CE1156D1868F24E02F91D3A1886ACE906CE741662B40B4EFDFB90F76C1ADD884D920AFA8B3427EEB84A759FA02E00635743F50B942F0
4109DA2A24E41B1F375645229981D4B7E88C36A12DAB64E91C764CC43CCEC188EC8C5855C8FF488BB91003602BEF43DBEC4A621048906A2CDC5DBD4103431DB8
2185E3BC7076BA51AAD6B199C8C60BCD70E8245B874927136E6D8DD527DF0693DC10A1C8E51B5BE93FF7538FA138B335738F4315361ABF8C73BF40593AE22BE4
228845775A262505B47288E065B23B4A6D78AFBDDB2356B392C692EF56A35AB4AA27767DE72F058C6484457C95A8CCDD0EF225ABA56B7657B7F0E947DC17F972
2630C6F79878E50CF5ABD353A6ED80BEACC7169179EA57435E44411BC7D566136DFA983019F3443DE8E4C60940BC4E31DCEAD514D755AF95A622585D69572692
7273E8342918E097B1C1F5FEF32A150AEF5E11184782B5BD5A1D8071E94578B0AC722D7BF49E8C78D391294371FFBA7B88FABF8CC03A62B940CE60D669DFB7B6
087EA12042793307045B283D7305E93D8F74725034E77D25D3FF043ADC5F8B5B186DB70A968A816835EFB575952EAE7EA4E76DF0D5F097590E1A2A978025573E
1个回答

发现问题出在哪里。上面的代码给出了一个 0s、2s 和 4s 的矩阵,但我忘了取矩阵乘法模 2,这将给出全零的预期矩阵。GHT