mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 21:20:31 -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user