mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-04 05:30:32 -05:00 
			
		
		
		
	
		
			
	
	
		
			157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								#include "memory.h"
							 | 
						||
| 
								 | 
							
								#include "DVBS2.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// called at the end of a frame
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								void  DVBS2::end_of_frame_actions(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if( m_s2_config_updated )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        modulator_configuration();
							 | 
						||
| 
								 | 
							
								        m_s2_config_updated = 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int DVBS2::is_valid( int mod, int coderate )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if( mod == M_QPSK )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_1_4)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_1_3)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_2_5)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_1_2)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_3_5)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_2_3)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_3_4)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_4_5)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_5_6)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_8_9)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_9_10) return 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if( mod == M_8PSK )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_3_5)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_2_3)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_3_4)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_5_6)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_8_9)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_9_10) return 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if( mod == M_16APSK )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_2_3)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_3_4)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_4_5)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_5_6)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_8_9)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_9_10) return 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if( mod == M_32APSK )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_3_4)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_4_5)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_5_6)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_8_9)  return 0;
							 | 
						||
| 
								 | 
							
								        if(coderate == CR_9_10) return 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return -1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// index 0 and 1 will only be different when being reconfigured.
							 | 
						||
| 
								 | 
							
								// Use index 1 as this will be applied in the following transmit
							 | 
						||
| 
								 | 
							
								// frames
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								void DVBS2::calc_efficiency( void )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    double p,m,a,s,b,po;
							 | 
						||
| 
								 | 
							
								    // Calculate the number of symbols in the payload
							 | 
						||
| 
								 | 
							
								    p = 0;a = 0; m = 0;
							 | 
						||
| 
								 | 
							
								    if( m_format[1].frame_type == FRAME_NORMAL )  p = (double)FRAME_SIZE_NORMAL;
							 | 
						||
| 
								 | 
							
								    if( m_format[1].frame_type == FRAME_SHORT  )  p = (double)FRAME_SIZE_SHORT;
							 | 
						||
| 
								 | 
							
								    if( m_format[1].constellation == M_QPSK )     m = 2.0;
							 | 
						||
| 
								 | 
							
								    if( m_format[1].constellation == M_8PSK )     m = 3.0;
							 | 
						||
| 
								 | 
							
								    if( m_format[1].constellation == M_16APSK )   m = 4.0;
							 | 
						||
| 
								 | 
							
								    if( m_format[1].constellation == M_32APSK )   m = 5.0;
							 | 
						||
| 
								 | 
							
								    s = p/m;//Number of symbols per frame
							 | 
						||
| 
								 | 
							
								    // PL header overhead
							 | 
						||
| 
								 | 
							
								    if( m_format[1].pilots )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        po = (s/(90*16))-1;// 1 pilot every 16 blocks (of 90 symbols)
							 | 
						||
| 
								 | 
							
								        po = po*36;        // No pilot at the end
							 | 
						||
| 
								 | 
							
								        a  = s/(90+po+s);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        a = s/(90+s);// No pilots
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    // Modulation efficiency
							 | 
						||
| 
								 | 
							
								    a = a*m;
							 | 
						||
| 
								 | 
							
								    // Take into account pilot symbols
							 | 
						||
| 
								 | 
							
								    // TBD
							 | 
						||
| 
								 | 
							
								    // Now calculate the useable data as percentage of the frame
							 | 
						||
| 
								 | 
							
								    b = ((double)m_format[1].useable_data_bits)/p;
							 | 
						||
| 
								 | 
							
								    // Now calculate the efficiency by multiplying the
							 | 
						||
| 
								 | 
							
								    // useable bits efficiency by the modulation efficiency
							 | 
						||
| 
								 | 
							
								    m_efficiency = b*a;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Multiply the efficiency value by the symbol rate
							 | 
						||
| 
								 | 
							
								// to get the useable bitrate
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								double DVBS2::s2_get_efficiency( void )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return m_efficiency;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int DVBS2::s2_set_configure( DVB2FrameFormat *f )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if( is_valid( f->constellation, f->code_rate ) == 0 )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if( set_configure( f ) == 0 )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								             calc_efficiency();
							 | 
						||
| 
								 | 
							
								             m_s2_config_updated = 1;
							 | 
						||
| 
								 | 
							
											 m_configured = 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								             return 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return -1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								void DVBS2::s2_get_configure( DVB2FrameFormat *f )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    get_configure( f );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								int DVBS2::s2_add_ts_frame( u8 *ts )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int res = 0;
							 | 
						||
| 
								 | 
							
									if (m_configured == 0) return 0;
							 | 
						||
| 
								 | 
							
								    // Call base class
							 | 
						||
| 
								 | 
							
								    if( next_ts_frame_base( ts ) )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        // Interleave and pack
							 | 
						||
| 
								 | 
							
								        s2_interleave();
							 | 
						||
| 
								 | 
							
								        // create the header
							 | 
						||
| 
								 | 
							
								        s2_pl_header_create();
							 | 
						||
| 
								 | 
							
								        // Add the data
							 | 
						||
| 
								 | 
							
								        res = s2_pl_data_pack();
							 | 
						||
| 
								 | 
							
								        // Do any updates required for the next frame
							 | 
						||
| 
								 | 
							
								        end_of_frame_actions();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return res;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								void DVBS2::physical( void )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DVBS2::DVBS2()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									m_configured = 0;
							 | 
						||
| 
								 | 
							
								    modulator_configuration();
							 | 
						||
| 
								 | 
							
								    build_symbol_scrambler_table();
							 | 
						||
| 
								 | 
							
								    pl_build_dummy();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |