首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DVB-S2: LDPC短格式

DVB-S2: LDPC短格式
EN

Stack Overflow用户
提问于 2017-10-28 10:17:00
回答 1查看 1K关注 0票数 2

作用域

Matlab中包含了一个名为dvbs2ldpc的函数,用于构造一个奇偶校验矩阵,用于DVB-S2标准中的LDPC编码阶段。

这个标准有两种不同的传输模式(短的和正常的),这取决于产生的码字的大小。然而,dvbs2ldpc函数只适用于普通函数。因此,我试图建立一个功能,用于短时传输模式。

代码描述

您可以在下面的函数dvbs2ldpcShort.m中找到所有相关代码,其中我要为短传输模式构造一个奇偶校验矩阵,LDPC.m,在这里我执行一些误码率模拟来检查结果。

您可能会看到,dvbs2ldpcShortdvbs2ldpc非常相似,后者出现在中。我所包含的两个不同之处是改变了码字的长度和它可能对应的奇偶校验矩阵的累加器位(进一步的信息是请参阅本链接附件B和附件C。)。

代码

dvbs2ldpcShort.m

代码语言:javascript
运行
复制
function H = dvbs2ldpcShort(R)

if R = 1/2
    Rreal = 4/9;     % Actual rate (as k = 7200 and N = 16200)
end

lenCodeWord = 16200;  % Length of codeword for DVB-S.2
NB = 360;  % Node indices parameter for DVB-S.2.

numInfoBits = lenCodeWord * Rreal;
numParityBits = lenCodeWord - numInfoBits;

[ct1, ct2] = getchecknodetable(R);

ck1 = nodeindices(ct1, numParityBits, NB);
ck2 = nodeindices(ct2, numParityBits, NB);

d = [size(ck1,2) size(ck1,1) size(ck2,2) size(ck2,1) numParityBits-1 2 1 1];
r = [ck1(:); ck2(:); 0; reshape(ones(2,1)*(1:numParityBits-1),[],1)];
S = zeros(length(r),1);
numGroup = length(d)/2;
n = 0;
ncol = 1;
for i = 1:numGroup
    p = d(2*i-1)*d(2*i);
    S(n+1:n+p) = reshape(ones(d(2*i),1)*(ncol:ncol+d(2*i-1)-1),p,1);
    ncol = ncol + d(2*i-1);
    n = n + p;
end

% Parity-check matrix (sparse) for DVB-S.2
outputFormat = 'sparse'; % Sparse matrix by default
if nargin == 2
    if ~strcmp(varargin{1}, 'sparse') && ~strcmp(varargin{1}, 'indices')
        error(message('comm:dvbs2ldpc:InvalidOutputFormat'));
    end
    outputFormat = varargin{1};
end

if strcmp(outputFormat, 'sparse')
    H = logical(sparse(double(r+1), S, 1));
else
    H = [double(r+1), double(S)];
end

%--------------------------------------------------------------------------
function ck = nodeindices(ct, M, NB)
% ct: check node table (single group)
% M: number of parity bits
% NB: block size
[N, D] = size(ct);
q = (M/NB);
b = (1:NB);
bq = (b-1).'*q;
ck = zeros(D, NB*N);
for r=1:N
    ck(:, NB*(r-1)+1:NB*r) = mod(addcr(bq, ct(r,:)), M)';
end

%--------------------------------------------------------------------------
function A = addcr(c, r)
M = length(c);
N = length(r);
A = zeros(M, N);
for m = 1:M
    A(m, :) = r + c(m);
end

%--------------------------------------------------------------------------
function [ct1, ct2] = getchecknodetable(R)
switch R
    case 1/2 % There are all cases, but here I only include the R=1/2 one
        ct1 = [20 712 2386 6354 4061 1062 5045 5158
               21 2543 5748 4822 2348 3089 6328 5876
               22 926 5701 269 3693 2438 3190 3507
               23 2802 4520 3577 5324 1091 4667 4449
               24 5140 2003 1263 4742 6497 1185 6202];
        ct2 = [0 4046 6934   
               1 2855 66
               2 6694 212
               3 3439 1158
               4 3850 4422
               5 5924 290
               6 1467 4049
               7 7820 2242
               8 4606 3080
               9 4633 7877
               10 3884 6868
               11 8935 4996
               12 3028 764
               13 5988 1057
               14 7411 3450];
end

LDPC.m

代码语言:javascript
运行
复制
r = 1/2;
k = 7200;

ldpcEnc = comm.LDPCEncoder(dvbs2ldpcShort(r));
psk4Mod = comm.PSKModulator(4, 'BitInput',true);
EsNo = 0.2 : 0.1 : 1.2;
BER = zeros(size(EsNo));
for k = 1 : 1 : length(EsNo)
    awgnChan = comm.AWGNChannel(...
            'NoiseMethod','Signal to noise ratio (Es/No)','EsNo',EsNo(k));
    psk4Demod = comm.PSKDemodulator(4, 'BitOutput',true,...
            'DecisionMethod','Approximate log-likelihood ratio', ...
            'Variance', 1/(2*10^(awgnChan.EsNo/10)));
    ldpcDec = comm.LDPCDecoder(dvbs2ldpcShort(r));
    ber = comm.ErrorRate;
    for counter = 1:100
      data           = logical(randi([0 1], k, 1));
      encodedData    = ldpcEnc(data);
      modSignal      = psk4Mod(encodedData);
      receivedSignal = awgnChan(modSignal);
      demodSignal    = psk4Demod(receivedSignal);
      receivedBits   = ldpcDec(demodSignal);
      errorStats     = ber(data, receivedBits);
    end
    BER(k) = errorStats(1);
end

问题

相应的误码率曲线与正常传输模式完全不同。 (它们将误码率表示为信噪比的函数。而且我的函数是EbNo,但差别不应该太大)。相反,结果似乎出乎意料地好起来。你能看出我的密码有什么问题吗?

我的代码有什么问题吗?

提前表示感谢,祝您周末愉快!

EN

回答 1

Stack Overflow用户

发布于 2019-04-11 16:11:03

感谢关于LDPC代码标识符和有效LDPC速率的说明。

您的示例--性能应该更好,因为您使用了更多的冗余:代码字的5/9 (0.56),而在MATLAB示例中,它们使用代码字的(1 - 2/3) = 1/3 (0.33)作为冗余。

我还想补充一点:在ETSI标准中,他们也使用一个参数q,它等于q = (M/NB);(M - num的奇偶校验位,NB = 360)当n_ldpc = 64800时,但是如果n_ldpc = 16200应该根据ETSI标准中的一个表使用q

让我们看看我的解决方案:自定义

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46988590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档