mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-07-30 20:52:26 -04:00
DATV: external LDPC tool implementation (1)
This commit is contained in:
parent
dc8f3ee9d9
commit
078e7fab37
@ -75,4 +75,10 @@ target_link_libraries(demoddatv
|
|||||||
${SWRESAMPLE_LIBRARIES}
|
${SWRESAMPLE_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_executable(ldpctool
|
||||||
|
ldpctool/ldpc_tool.cpp
|
||||||
|
ldpctool/tables_handler.cpp
|
||||||
|
)
|
||||||
|
|
||||||
install(TARGETS demoddatv DESTINATION ${INSTALL_PLUGINS_DIR})
|
install(TARGETS demoddatv DESTINATION ${INSTALL_PLUGINS_DIR})
|
||||||
|
install(TARGETS ldpctool DESTINATION ${INSTALL_BIN_DIR})
|
||||||
|
@ -369,8 +369,12 @@ void DATVDemodSink::CleanUpDATVFramework(bool blnRelease)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// INPUT
|
// INPUT
|
||||||
//if(p_rawiq!=nullptr) delete p_rawiq;
|
if (p_rawiq != nullptr) {
|
||||||
//if(p_rawiq_writer!=nullptr) delete p_rawiq_writer;
|
delete p_rawiq;
|
||||||
|
}
|
||||||
|
if (p_rawiq_writer != nullptr) {
|
||||||
|
delete p_rawiq_writer;
|
||||||
|
}
|
||||||
//if(p_preprocessed!=nullptr) delete p_preprocessed;
|
//if(p_preprocessed!=nullptr) delete p_preprocessed;
|
||||||
|
|
||||||
//DVB-S2
|
//DVB-S2
|
||||||
@ -1137,6 +1141,7 @@ void DATVDemodSink::InitDATVS2Framework()
|
|||||||
|
|
||||||
if (m_settings.m_softLDPC)
|
if (m_settings.m_softLDPC)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
// External LDPC decoder mode.
|
// External LDPC decoder mode.
|
||||||
// Deinterleave into soft bits.
|
// Deinterleave into soft bits.
|
||||||
p_fecframes = new leansdr::pipebuf<leansdr::fecframe<leansdr::llr_sb> >(m_objScheduler, "FEC frames", BUF_FRAMES);
|
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_vbitcount,
|
||||||
p_verrcount
|
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
|
else
|
||||||
{
|
{
|
||||||
@ -1290,8 +1319,8 @@ void DATVDemodSink::feed(const SampleVector::const_iterator& begin, const Sample
|
|||||||
m_objScheduler->step();
|
m_objScheduler->step();
|
||||||
|
|
||||||
m_lngReadIQ=0;
|
m_lngReadIQ=0;
|
||||||
//delete p_rawiq_writer;
|
delete p_rawiq_writer;
|
||||||
//p_rawiq_writer = new leansdr::pipewriter<leansdr::cf32>(*p_rawiq);
|
p_rawiq_writer = new leansdr::pipewriter<leansdr::cf32>(*p_rawiq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ Copyright 2019 <pabr@pabr.org>
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include "testbench.h"
|
#include "testbench.h"
|
||||||
#include "algorithms.h"
|
#include "algorithms.h"
|
||||||
|
#include "ldpc.h"
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
#include "flooding_decoder.h"
|
#include "flooding_decoder.h"
|
||||||
@ -28,7 +29,7 @@ static const int DEFAULT_TRIALS = 50;
|
|||||||
static const int DEFAULT_TRIALS = 25;
|
static const int DEFAULT_TRIALS = 25;
|
||||||
#endif
|
#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)
|
void fail(const char *msg)
|
||||||
{
|
{
|
||||||
@ -109,7 +110,7 @@ int main(int argc, char **argv)
|
|||||||
if (!tabname)
|
if (!tabname)
|
||||||
fail("unsupported modcod");
|
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)
|
if (!ldpc)
|
||||||
{
|
{
|
||||||
|
@ -2419,7 +2419,7 @@ struct s2_fecdec_helper : runnable
|
|||||||
for (int i = 0; i < p->nprocs; ++i)
|
for (int i = 0; i < p->nprocs; ++i)
|
||||||
{
|
{
|
||||||
helper_instance *h = &p->procs[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);
|
// fprintf(stderr, "Writing %lu to fd %d\n", iosize, h->fd_tx);
|
||||||
int nw = write(h->fd_tx, pin->bytes, iosize);
|
int nw = write(h->fd_tx, pin->bytes, iosize);
|
||||||
if (nw < 0 && errno == EWOULDBLOCK)
|
if (nw < 0 && errno == EWOULDBLOCK)
|
||||||
@ -2494,7 +2494,7 @@ struct s2_fecdec_helper : runnable
|
|||||||
char mc_arg[16];
|
char mc_arg[16];
|
||||||
sprintf(mc_arg, "%d", pls->modcod);
|
sprintf(mc_arg, "%d", pls->modcod);
|
||||||
const char *sf_arg = pls->sf ? "--shortframes" : NULL;
|
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);
|
execve(command, (char *const *)argv, NULL);
|
||||||
fatal(command);
|
fatal(command);
|
||||||
}
|
}
|
||||||
@ -2514,7 +2514,7 @@ struct s2_fecdec_helper : runnable
|
|||||||
{
|
{
|
||||||
// Read corrected frame from helper
|
// Read corrected frame from helper
|
||||||
const s2_pls *pls = &job->pls;
|
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);
|
int nr = read(job->h->fd_rx, ldpc_buf, iosize);
|
||||||
if (nr < 0)
|
if (nr < 0)
|
||||||
fatal("read(LDPC helper)");
|
fatal("read(LDPC helper)");
|
||||||
@ -2526,8 +2526,8 @@ struct s2_fecdec_helper : runnable
|
|||||||
const fec_info *fi = &fec_infos[job->pls.sf][mcinfo->rate];
|
const fec_info *fi = &fec_infos[job->pls.sf][mcinfo->rate];
|
||||||
uint8_t *hardbytes = softbytes_harden(ldpc_buf, fi->kldpc / 8, bch_buf);
|
uint8_t *hardbytes = softbytes_harden(ldpc_buf, fi->kldpc / 8, bch_buf);
|
||||||
size_t cwbytes = fi->kldpc / 8;
|
size_t cwbytes = fi->kldpc / 8;
|
||||||
size_t msgbytes = fi->Kbch / 8;
|
//size_t msgbytes = fi->Kbch / 8;
|
||||||
size_t chkbytes = cwbytes - msgbytes;
|
//size_t chkbytes = cwbytes - msgbytes;
|
||||||
bch_interface *bch = s2bch.bchs[job->pls.sf][mcinfo->rate];
|
bch_interface *bch = s2bch.bchs[job->pls.sf][mcinfo->rate];
|
||||||
int ncorr = bch->decode(hardbytes, cwbytes);
|
int ncorr = bch->decode(hardbytes, cwbytes);
|
||||||
if (sch->debug2)
|
if (sch->debug2)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user