mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-27 10:19:15 -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();
|
||
|
}
|
||
|
|