1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-09-02 13:17:48 -04:00

DATV demod: GUI: more accurate display of video thread active and MCOD detection. Correction of RRC=0.2 bug. Small optimizations in dvbs2.h match_frame

This commit is contained in:
f4exb 2021-03-31 05:03:10 +02:00
parent be3802af68
commit c4e9ada144
5 changed files with 27 additions and 16 deletions

View File

@ -346,8 +346,10 @@ void DATVDemodGUI::displaySettings()
} }
#endif #endif
if (m_settings.m_standard == DATVDemodSettings::dvb_version::DVB_S) { if (m_settings.m_standard == DATVDemodSettings::dvb_version::DVB_S)
{
ui->statusText->clear(); ui->statusText->clear();
ui->statusText->setStyleSheet("QLabel { background:rgb(79,79,79); }");
} }
ui->cmbFilter->setCurrentIndex((int) m_settings.m_filter); ui->cmbFilter->setCurrentIndex((int) m_settings.m_filter);
@ -606,8 +608,10 @@ void DATVDemodGUI::on_cmbStandard_currentIndexChanged(int index)
} }
#endif #endif
if (m_settings.m_standard == DATVDemodSettings::dvb_version::DVB_S) { if (m_settings.m_standard == DATVDemodSettings::dvb_version::DVB_S)
{
ui->statusText->clear(); ui->statusText->clear();
ui->statusText->setStyleSheet("QLabel { background:rgb(79,79,79); }");
} }
m_settings.validateSystemConfiguration(); m_settings.validateSystemConfiguration();

View File

@ -720,6 +720,9 @@
<height>19</height> <height>19</height>
</rect> </rect>
</property> </property>
<property name="toolTip">
<string>Modulation detection status</string>
</property>
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>

View File

@ -177,7 +177,6 @@ bool DATVDemodSink::playVideo()
m_objVideoStream->MultiThreaded = true; m_objVideoStream->MultiThreaded = true;
m_objVideoStream->ThreadTimeOut = DATVideoRenderThread::videoThreadTimeoutMs; m_objVideoStream->ThreadTimeOut = DATVideoRenderThread::videoThreadTimeoutMs;
m_objRenderThread->start(); m_objRenderThread->start();
return true;
} }
return false; return false;
@ -893,7 +892,7 @@ void DATVDemodSink::InitDATVS2Framework()
m_objCfg.fastlock = m_settings.m_fastLock; m_objCfg.fastlock = m_settings.m_fastLock;
m_objCfg.sampler = m_settings.m_filter; m_objCfg.sampler = m_settings.m_filter;
m_objCfg.rolloff = m_settings.m_rollOff; //0...1 m_objCfg.rolloff = m_settings.m_rollOff * 1.001f; //0...1 and correct 0.2 bug
m_objCfg.rrc_rej = (float) m_settings.m_excursion; //dB m_objCfg.rrc_rej = (float) m_settings.m_excursion; //dB
m_objCfg.rrc_steps = 0; //auto m_objCfg.rrc_steps = 0; //auto

View File

@ -234,8 +234,7 @@ class DATVideoRenderThread : public QThread
m_renderingVideo = false; m_renderingVideo = false;
} }
void stopRendering() void stopRendering() {
{
m_renderingVideo = false; m_renderingVideo = false;
} }

View File

@ -793,7 +793,11 @@ struct s2_frame_receiver : runnable
void run_frame_detect() void run_frame_detect()
{ {
if ( discard ) cstln->m_rateCode = -1;
cstln->m_typeCode = -1;
cstln->m_setByModcod = cstln->m_typeCode != -1;
if (discard)
{ {
size_t d = std::min(discard, in.readable()); size_t d = std::min(discard, in.readable());
in.read(d); in.read(d);
@ -921,7 +925,7 @@ struct s2_frame_receiver : runnable
if (sof_errors >= S2_MAX_ERR_SOF) if (sof_errors >= S2_MAX_ERR_SOF)
{ {
if (sch->debug2) { if (sch->debug2) {
fprintf(stderr, "Too many errors in SOF (%u/26)\n", sof_errors); fprintf(stderr, "Too many errors in SOF (%u/%u)\n", sof_errors, S2_MAX_ERR_SOF);
} }
in.read(ss.p-in.rd()); in.read(ss.p-in.rd());
@ -1087,7 +1091,7 @@ struct s2_frame_receiver : runnable
cstln = dcstln; // Used by GUI cstln = dcstln; // Used by GUI
cstln->m_rateCode = mcinfo->rate < code_rate::FEC_COUNT ? mcinfo->rate : -1; cstln->m_rateCode = mcinfo->rate < code_rate::FEC_COUNT ? mcinfo->rate : -1;
cstln->m_typeCode = mcinfo->c < cstln_base::predef::COUNT ? mcinfo->c : -1; cstln->m_typeCode = mcinfo->c < cstln_base::predef::COUNT ? mcinfo->c : -1;
cstln->m_setByModcod = true; cstln->m_setByModcod = cstln->m_typeCode != -1;
// Output special slot with PLS information. // Output special slot with PLS information.
pout->is_pls = true; pout->is_pls = true;
pout->pls = pls; pout->pls = pls;
@ -1658,17 +1662,19 @@ struct s2_frame_receiver : runnable
fprintf(stderr, "match_frame\n"); fprintf(stderr, "match_frame\n");
} }
bool pilots = pls->pilots; // force to true for lighter processing
// With pilots: Use first block of data slots. // With pilots: Use first block of data slots.
// Without pilots: Use whole frame. // Without pilots: Use whole frame.
int ns = pls->pilots ? 16*90 : S*90; int ns = pilots ? 16*90 : S*90;
// Pilots: steps of ~700 ppm (= 1 cycle between pilots) // Pilots: steps of ~700 ppm (= 1 cycle between pilots)
// No pilots, normal frames: steps of ~30(QPSK) - ~80(32APSK) ppm // No pilots, normal frames: steps of ~30(QPSK) - ~80(32APSK) ppm
// No pilots, short frames: steps of ~120(QPSK) - 300(32APSK) ppm // No pilots, short frames: steps of ~120(QPSK) - 300(32APSK) ppm
int nwrap = pls->pilots ? 16*90+pilot.LENGTH : S*90+sof.LENGTH; int nwrap = pilots ? 16*90+pilot.LENGTH : S*90+sof.LENGTH;
// Frequency search range. // Frequency search range.
int sliprange = pls->pilots ? 10 : 50; // TBD Customizable ? int sliprange = pilots ? 10 : 50; // TBD Customizable ?
float besterr = 1e99; float besterr = 1e99;
float bestslip = 0; // Avoid compiler warning float bestslip = 0; // Avoid compiler warning
int err_div = ns * cstln_amp * cstln_amp;
for (int slip = -sliprange; slip <= sliprange; ++slip) for (int slip = -sliprange; slip <= sliprange; ++slip)
{ {
@ -1685,12 +1691,12 @@ struct s2_frame_receiver : runnable
std::complex<float> p = interp_next(&ssl) * ssl.gain; std::complex<float> p = interp_next(&ssl) * ssl.gain;
typename cstln_lut<SOFTSYMB,256>::result *cr = typename cstln_lut<SOFTSYMB,256>::result *cr =
dcstln->lookup(p.real(), p.imag()); dcstln->lookup(p.real(), p.imag());
std::complex<int8_t> &cp = dcstln->symbols[cr->symbol]; float evreal = p.real() - dcstln->symbols[cr->symbol].real();
std::complex<float> ev(p.real()-cp.real(), p.imag()-cp.imag()); float evimag = p.imag() - dcstln->symbols[cr->symbol].imag();
err += cnorm2(ev); err += evreal*evreal + evimag*evimag;
} }
err /= ns * cstln_amp * cstln_amp; err /= err_div;
if (err < besterr) if (err < besterr)
{ {