mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-04 16:01:14 -05:00
DATV demod: detect MODCOD induced change in constellation and update screen points (DVB-S2)
This commit is contained in:
parent
8cb4ed57ed
commit
354b59c793
@ -101,7 +101,11 @@ static inline cstln_lut<eucl_ss, 256> * make_dvbs_constellation(cstln_lut<eucl_s
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return new cstln_lut<eucl_ss, 256>(c, 10, gamma1, gamma2, gamma3);
|
cstln_lut<eucl_ss, 256> *newCstln = new cstln_lut<eucl_ss, 256>(c, 10, gamma1, gamma2, gamma3);
|
||||||
|
newCstln->m_rateCode = (int) r;
|
||||||
|
newCstln->m_typeCode = (int) c;
|
||||||
|
newCstln->m_setByModcod = false;
|
||||||
|
return newCstln;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> struct datvconstellation: runnable
|
template<typename T> struct datvconstellation: runnable
|
||||||
|
@ -49,6 +49,7 @@ DATVDemod::DATVDemod(DeviceAPI *deviceAPI) :
|
|||||||
m_audioFifo(48000),
|
m_audioFifo(48000),
|
||||||
m_blnRenderingVideo(false),
|
m_blnRenderingVideo(false),
|
||||||
m_blnStartStopVideo(false),
|
m_blnStartStopVideo(false),
|
||||||
|
m_cstlnSetByModcod(false),
|
||||||
m_enmModulation(DATVDemodSettings::BPSK /*DATV_FM1*/),
|
m_enmModulation(DATVDemodSettings::BPSK /*DATV_FM1*/),
|
||||||
m_sampleRate(1024000),
|
m_sampleRate(1024000),
|
||||||
m_objSettingsMutex(QMutex::NonRecursive)
|
m_objSettingsMutex(QMutex::NonRecursive)
|
||||||
@ -1080,7 +1081,7 @@ void DATVDemod::InitDATVS2Framework()
|
|||||||
|
|
||||||
|
|
||||||
objDemodulatorDVBS2->cstln = make_dvbs2_constellation(m_objCfg.constellation, m_objCfg.fec);
|
objDemodulatorDVBS2->cstln = make_dvbs2_constellation(m_objCfg.constellation, m_objCfg.fec);
|
||||||
|
m_cstlnSetByModcod = false;
|
||||||
|
|
||||||
//constellation
|
//constellation
|
||||||
|
|
||||||
@ -1254,6 +1255,23 @@ void DATVDemod::feed(const SampleVector::const_iterator& begin, const SampleVect
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
} // Samples for loop
|
||||||
|
|
||||||
|
// DVBS2: Track change of constellation via MODCOD
|
||||||
|
if (m_settings.m_standard==DATVDemodSettings::DVB_S2)
|
||||||
|
{
|
||||||
|
leansdr::s2_frame_receiver<leansdr::f32, leansdr::llr_ss> * objDemodulatorDVBS2 = (leansdr::s2_frame_receiver<leansdr::f32, leansdr::llr_ss> *) m_objDemodulatorDVBS2;
|
||||||
|
|
||||||
|
if (objDemodulatorDVBS2->cstln->m_setByModcod && !m_cstlnSetByModcod)
|
||||||
|
{
|
||||||
|
qDebug("DATVDemod::feed: change by MODCOD detected");
|
||||||
|
|
||||||
|
if (r_scope_symbols_dvbs2) {
|
||||||
|
r_scope_symbols_dvbs2->calculate_cstln_points();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_cstlnSetByModcod = objDemodulatorDVBS2->cstln->m_setByModcod;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1425,3 +1443,61 @@ int DATVDemod::GetSampleRate()
|
|||||||
{
|
{
|
||||||
return m_sampleRate;
|
return m_sampleRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DATVDemodSettings::DATVCodeRates getCodeRateFromLeanDVBCode(int leanDVBCodeRate)
|
||||||
|
{
|
||||||
|
if (leanDVBCodeRate == leansdr::code_rate::FEC12) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC12;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC13) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC13;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC14) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC14;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC23) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC23;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC25) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC25;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC34) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC34;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC35) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC35;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC45) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC45;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC46) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC46;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC56) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC56;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC78) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC78;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC89) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC89;
|
||||||
|
} else if (leanDVBCodeRate == leansdr::code_rate::FEC910) {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC910;
|
||||||
|
} else {
|
||||||
|
return DATVDemodSettings::DATVCodeRates::FEC12;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DATVDemodSettings::DATVModulation getModulationFromLeanDVBCode(int leanDVBModulation)
|
||||||
|
{
|
||||||
|
if (leanDVBModulation == leansdr::cstln_base::predef::APSK16) {
|
||||||
|
return DATVDemodSettings::DATVModulation::APSK16;
|
||||||
|
} else if (leanDVBModulation == leansdr::cstln_base::predef::APSK32) {
|
||||||
|
return DATVDemodSettings::DATVModulation::APSK32;
|
||||||
|
} else if (leanDVBModulation == leansdr::cstln_base::predef::APSK64E) {
|
||||||
|
return DATVDemodSettings::DATVModulation::APSK64E;
|
||||||
|
} else if (leanDVBModulation == leansdr::cstln_base::predef::BPSK) {
|
||||||
|
return DATVDemodSettings::DATVModulation::BPSK;
|
||||||
|
} else if (leanDVBModulation == leansdr::cstln_base::predef::PSK8) {
|
||||||
|
return DATVDemodSettings::DATVModulation::PSK8;
|
||||||
|
} else if (leanDVBModulation == leansdr::cstln_base::predef::QAM16) {
|
||||||
|
return DATVDemodSettings::DATVModulation::QAM16;
|
||||||
|
} else if (leanDVBModulation == leansdr::cstln_base::predef::QAM64) {
|
||||||
|
return DATVDemodSettings::DATVModulation::QAM64;
|
||||||
|
} else if (leanDVBModulation == leansdr::cstln_base::predef::QAM256) {
|
||||||
|
return DATVDemodSettings::DATVModulation::QAM256;
|
||||||
|
} else if (leanDVBModulation == leansdr::cstln_base::predef::QPSK) {
|
||||||
|
return DATVDemodSettings::DATVModulation::QPSK;
|
||||||
|
} else {
|
||||||
|
return DATVDemodSettings::DATVModulation::BPSK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -185,6 +185,8 @@ public:
|
|||||||
void InitDATVFramework();
|
void InitDATVFramework();
|
||||||
void InitDATVS2Framework();
|
void InitDATVS2Framework();
|
||||||
double getMagSq() const { return m_objMagSqAverage; } //!< Beware this is scaled to 2^30
|
double getMagSq() const { return m_objMagSqAverage; } //!< Beware this is scaled to 2^30
|
||||||
|
static DATVDemodSettings::DATVCodeRates getCodeRateFromLeanDVBCode(int leanDVBCodeRate);
|
||||||
|
static DATVDemodSettings::DATVModulation getModulationFromLeanDVBCode(int leanDVBModulation);
|
||||||
|
|
||||||
static const QString m_channelIdURI;
|
static const QString m_channelIdURI;
|
||||||
static const QString m_channelId;
|
static const QString m_channelId;
|
||||||
@ -381,6 +383,7 @@ private:
|
|||||||
bool m_blnInitialized;
|
bool m_blnInitialized;
|
||||||
bool m_blnRenderingVideo;
|
bool m_blnRenderingVideo;
|
||||||
bool m_blnStartStopVideo;
|
bool m_blnStartStopVideo;
|
||||||
|
bool m_cstlnSetByModcod;
|
||||||
|
|
||||||
DATVDemodSettings::DATVModulation m_enmModulation;
|
DATVDemodSettings::DATVModulation m_enmModulation;
|
||||||
|
|
||||||
|
@ -47,6 +47,23 @@ struct DATVDemodSettings
|
|||||||
QAM256
|
QAM256
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum DATVCodeRates
|
||||||
|
{
|
||||||
|
FEC12,
|
||||||
|
FEC23,
|
||||||
|
FEC46,
|
||||||
|
FEC34,
|
||||||
|
FEC56,
|
||||||
|
FEC78, // DVB-S
|
||||||
|
FEC45,
|
||||||
|
FEC89,
|
||||||
|
FEC910, // DVB-S2
|
||||||
|
FEC14,
|
||||||
|
FEC13,
|
||||||
|
FEC25,
|
||||||
|
FEC35
|
||||||
|
};
|
||||||
|
|
||||||
enum dvb_sampler
|
enum dvb_sampler
|
||||||
{
|
{
|
||||||
SAMP_NEAREST,
|
SAMP_NEAREST,
|
||||||
|
@ -103,7 +103,11 @@ static inline cstln_lut<llr_ss, 256> * make_dvbs2_constellation(cstln_lut<llr_ss
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new cstln_lut<llr_ss, 256>(c, 10, gamma1, gamma2, gamma3);
|
cstln_lut<llr_ss, 256> *newCstln = new cstln_lut<llr_ss, 256>(c, 10, gamma1, gamma2, gamma3);
|
||||||
|
newCstln->m_rateCode = (int) r;
|
||||||
|
newCstln->m_typeCode = (int) c;
|
||||||
|
newCstln->m_setByModcod = false;
|
||||||
|
return newCstln;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> struct datvdvbs2constellation: runnable
|
template<typename T> struct datvdvbs2constellation: runnable
|
||||||
|
@ -808,6 +808,9 @@ struct s2_frame_receiver : runnable
|
|||||||
cstln_base::names[mcinfo->c], mcinfo->rate);
|
cstln_base::names[mcinfo->c], mcinfo->rate);
|
||||||
cstln = new cstln_lut<SOFTSYMB, 256>(mcinfo->c, mcinfo->esn0_nf,
|
cstln = new cstln_lut<SOFTSYMB, 256>(mcinfo->c, mcinfo->esn0_nf,
|
||||||
mcinfo->g1, mcinfo->g2, mcinfo->g3);
|
mcinfo->g1, mcinfo->g2, mcinfo->g3);
|
||||||
|
cstln->m_rateCode = (int) mcinfo->rate;
|
||||||
|
cstln->m_typeCode = (int) mcinfo->c;
|
||||||
|
cstln->m_setByModcod = true;
|
||||||
#if 0
|
#if 0
|
||||||
fprintf(stderr, "Dumping constellation LUT to stdout.\n");
|
fprintf(stderr, "Dumping constellation LUT to stdout.\n");
|
||||||
cstln->dump(stdout);
|
cstln->dump(stdout);
|
||||||
|
@ -875,6 +875,10 @@ struct cstln_lut : cstln_base
|
|||||||
softsymb_harden(&lut[i][q].ss);
|
softsymb_harden(&lut[i][q].ss);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int m_typeCode;
|
||||||
|
int m_rateCode;
|
||||||
|
bool m_setByModcod;
|
||||||
};
|
};
|
||||||
// cstln_lut
|
// cstln_lut
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user