DATV: external LDPC tool implementation (1)

This commit is contained in:
f4exb 2021-03-04 08:43:04 +01:00
parent dc8f3ee9d9
commit 078e7fab37
4 changed files with 47 additions and 11 deletions

View File

@ -75,4 +75,10 @@ target_link_libraries(demoddatv
${SWRESAMPLE_LIBRARIES}
)
add_executable(ldpctool
ldpctool/ldpc_tool.cpp
ldpctool/tables_handler.cpp
)
install(TARGETS demoddatv DESTINATION ${INSTALL_PLUGINS_DIR})
install(TARGETS ldpctool DESTINATION ${INSTALL_BIN_DIR})

View File

@ -369,8 +369,12 @@ void DATVDemodSink::CleanUpDATVFramework(bool blnRelease)
}
// INPUT
//if(p_rawiq!=nullptr) delete p_rawiq;
//if(p_rawiq_writer!=nullptr) delete p_rawiq_writer;
if (p_rawiq != nullptr) {
delete p_rawiq;
}
if (p_rawiq_writer != nullptr) {
delete p_rawiq_writer;
}
//if(p_preprocessed!=nullptr) delete p_preprocessed;
//DVB-S2
@ -1137,6 +1141,7 @@ void DATVDemodSink::InitDATVS2Framework()
if (m_settings.m_softLDPC)
{
#if 0
// External LDPC decoder mode.
// Deinterleave into soft bits.
p_fecframes = new leansdr::pipebuf<leansdr::fecframe<leansdr::llr_sb> >(m_objScheduler, "FEC frames", BUF_FRAMES);
@ -1153,6 +1158,30 @@ void DATVDemodSink::InitDATVS2Framework()
p_vbitcount,
p_verrcount
);
#else
// External LDPC decoder mode.
// Deinterleave into soft bits.
// TBD Latency
p_fecframes = new leansdr::pipebuf<leansdr::fecframe<leansdr::llr_sb> >(m_objScheduler, "FEC frames", BUF_FRAMES);
p_s2_deinterleaver = new leansdr::s2_deinterleaver<leansdr::llr_ss, leansdr::llr_sb>(
m_objScheduler,
*(leansdr::pipebuf< leansdr::plslot<leansdr::llr_ss> > *) p_slots_dvbs2,
*(leansdr::pipebuf< leansdr::fecframe<leansdr::llr_sb> > *) p_fecframes
);
// Decode FEC-protected frames into plain BB frames.
leansdr::s2_fecdec_helper<leansdr::llr_t, leansdr::llr_sb> *r_fecdec =
new leansdr::s2_fecdec_helper<leansdr::llr_t, leansdr::llr_sb>(
m_objScheduler,
*(leansdr::pipebuf< leansdr::fecframe<leansdr::llr_sb> > *) p_fecframes,
*(leansdr::pipebuf<leansdr::bbframe> *) p_bbframes,
"/opt/install/sdrangel/bin/ldpctool",
p_vbitcount,
p_verrcount)
;
const int nhelpers = 6;
r_fecdec->nhelpers = nhelpers;
r_fecdec->must_buffer = false;
#endif
}
else
{
@ -1290,8 +1319,8 @@ void DATVDemodSink::feed(const SampleVector::const_iterator& begin, const Sample
m_objScheduler->step();
m_lngReadIQ=0;
//delete p_rawiq_writer;
//p_rawiq_writer = new leansdr::pipewriter<leansdr::cf32>(*p_rawiq);
delete p_rawiq_writer;
p_rawiq_writer = new leansdr::pipewriter<leansdr::cf32>(*p_rawiq);
}
}

View File

@ -19,6 +19,7 @@ Copyright 2019 <pabr@pabr.org>
#include <functional>
#include "testbench.h"
#include "algorithms.h"
#include "ldpc.h"
#if 0
#include "flooding_decoder.h"
@ -28,7 +29,7 @@ static const int DEFAULT_TRIALS = 50;
static const int DEFAULT_TRIALS = 25;
#endif
ldpctool::LDPCInterface *create_ldpc(char *standard, char prefix, int number);
//ldpctool::LDPCInterface *create_ldpc(char *standard, char prefix, int number);
void fail(const char *msg)
{
@ -109,7 +110,7 @@ int main(int argc, char **argv)
if (!tabname)
fail("unsupported modcod");
ldpctool::LDPCInterface *ldpc = create_ldpc((char *)"S2", tabname[0], atoi(tabname + 1));
ldpctool::LDPCInterface *ldpc = ldpctool::create_ldpc((char *)"S2", tabname[0], atoi(tabname + 1));
if (!ldpc)
{

View File

@ -2419,7 +2419,7 @@ struct s2_fecdec_helper : runnable
for (int i = 0; i < p->nprocs; ++i)
{
helper_instance *h = &p->procs[i];
size_t iosize = (pin->pls.framebits() / 8) * sizeof(SOFTBYTE);
int iosize = (pin->pls.framebits() / 8) * sizeof(SOFTBYTE);
// fprintf(stderr, "Writing %lu to fd %d\n", iosize, h->fd_tx);
int nw = write(h->fd_tx, pin->bytes, iosize);
if (nw < 0 && errno == EWOULDBLOCK)
@ -2494,7 +2494,7 @@ struct s2_fecdec_helper : runnable
char mc_arg[16];
sprintf(mc_arg, "%d", pls->modcod);
const char *sf_arg = pls->sf ? "--shortframes" : NULL;
const char *argv[] = {command, "--modcod", mc_arg, sf_arg, NULL};
const char *argv[] = {command, "--trials", "10", "--modcod", mc_arg, sf_arg, NULL};
execve(command, (char *const *)argv, NULL);
fatal(command);
}
@ -2514,7 +2514,7 @@ struct s2_fecdec_helper : runnable
{
// Read corrected frame from helper
const s2_pls *pls = &job->pls;
size_t iosize = (pls->framebits() / 8) * sizeof(ldpc_buf[0]);
int iosize = (pls->framebits() / 8) * sizeof(ldpc_buf[0]);
int nr = read(job->h->fd_rx, ldpc_buf, iosize);
if (nr < 0)
fatal("read(LDPC helper)");
@ -2526,8 +2526,8 @@ struct s2_fecdec_helper : runnable
const fec_info *fi = &fec_infos[job->pls.sf][mcinfo->rate];
uint8_t *hardbytes = softbytes_harden(ldpc_buf, fi->kldpc / 8, bch_buf);
size_t cwbytes = fi->kldpc / 8;
size_t msgbytes = fi->Kbch / 8;
size_t chkbytes = cwbytes - msgbytes;
//size_t msgbytes = fi->Kbch / 8;
//size_t chkbytes = cwbytes - msgbytes;
bch_interface *bch = s2bch.bchs[job->pls.sf][mcinfo->rate];
int ncorr = bch->decode(hardbytes, cwbytes);
if (sch->debug2)