mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-04 05:30:32 -05:00 
			
		
		
		
	
		
			
	
	
		
			111 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								#include "DVBS2.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int DVBS2::parity_chk( long a, long b)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int c = 0;
							 | 
						||
| 
								 | 
							
								    a = a & b;
							 | 
						||
| 
								 | 
							
								    for( int i = 0; i < 18; i++ )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if( a&(1L<<i)) c++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return c&1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// This is not time sensitive and is only run at start up
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								void DVBS2::build_symbol_scrambler_table( void )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    long x,y;
							 | 
						||
| 
								 | 
							
								    int xa,xb,xc,ya,yb,yc;
							 | 
						||
| 
								 | 
							
								    int rn,zna,znb;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Initialisation
							 | 
						||
| 
								 | 
							
								    x = 0x00001;
							 | 
						||
| 
								 | 
							
								    y = 0x3FFFF;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for( int i = 0; i < FRAME_SIZE_NORMAL; i++ )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        xa = parity_chk( x, 0x8050 );
							 | 
						||
| 
								 | 
							
								        xb = parity_chk( x, 0x0081 );
							 | 
						||
| 
								 | 
							
								        xc = x&1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        x >>= 1;
							 | 
						||
| 
								 | 
							
								        if( xb ) x |= 0x20000;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        ya = parity_chk( y, 0x04A1 );
							 | 
						||
| 
								 | 
							
								        yb = parity_chk( y, 0xFF60 );
							 | 
						||
| 
								 | 
							
								        yc = y&1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        y >>= 1;
							 | 
						||
| 
								 | 
							
								        if( ya ) y |= 0x20000;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        zna = xc ^ yc;
							 | 
						||
| 
								 | 
							
								        znb = xa ^ yb;
							 | 
						||
| 
								 | 
							
								        rn = (znb<<1) + zna;
							 | 
						||
| 
								 | 
							
								        m_cscram[i] = rn;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void DVBS2::pl_scramble_symbols( scmplx *fs, int len )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    scmplx x;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Start at the end of the PL Header.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for( int n = 0; n < len; n++ )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        switch( m_cscram[n] )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            case 0:
							 | 
						||
| 
								 | 
							
								                // Do nothing
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            case 1:
							 | 
						||
| 
								 | 
							
												x = fs[n];
							 | 
						||
| 
								 | 
							
												fs[n].re = -x.im;
							 | 
						||
| 
								 | 
							
								                fs[n].im =  x.re;
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            case 2:
							 | 
						||
| 
								 | 
							
								                fs[n].re = -fs[n].re;
							 | 
						||
| 
								 | 
							
								                fs[n].im = -fs[n].im;
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            case 03:
							 | 
						||
| 
								 | 
							
								                x = fs[n];
							 | 
						||
| 
								 | 
							
								                fs[n].re =  x.im;
							 | 
						||
| 
								 | 
							
								                fs[n].im = -x.re;
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								void DVBS2::pl_scramble_dummy_symbols( int len )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    scmplx x;
							 | 
						||
| 
								 | 
							
								    int p = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    x = m_bpsk[0][0];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for( int n = 90; n < len; n++ )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        switch( m_cscram[p] )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            case 0:
							 | 
						||
| 
								 | 
							
								                // Do nothing
							 | 
						||
| 
								 | 
							
								                m_pl_dummy[n].re =  x.re;
							 | 
						||
| 
								 | 
							
								                m_pl_dummy[n].im =  x.im;
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            case 1:
							 | 
						||
| 
								 | 
							
								                m_pl_dummy[n].re = -x.im;
							 | 
						||
| 
								 | 
							
								                m_pl_dummy[n].im =  x.re;
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            case 2:
							 | 
						||
| 
								 | 
							
								                m_pl_dummy[n].re = -x.re;
							 | 
						||
| 
								 | 
							
								                m_pl_dummy[n].im = -x.im;
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            case 3:
							 | 
						||
| 
								 | 
							
								                m_pl_dummy[n].re =  x.im;
							 | 
						||
| 
								 | 
							
								                m_pl_dummy[n].im = -x.re;
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        p++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |