mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-04 05:30:32 -05:00 
			
		
		
		
	
		
			
	
	
		
			158 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			158 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								#include "memory.h"
							 | 
						||
| 
								 | 
							
								#include "DVB2.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								for( int row = 0; row < rows; row++ ) 
							 | 
						||
| 
								 | 
							
								{ 
							 | 
						||
| 
								 | 
							
									for( int n = 0; n < 360; n++ ) 
							 | 
						||
| 
								 | 
							
									{ 
							 | 
						||
| 
								 | 
							
										for( int col = 1; col <= table_name[row][0]; col++ ) 
							 | 
						||
| 
								 | 
							
										{ 
							 | 
						||
| 
								 | 
							
											// parity bit location, position from start of block  
							 | 
						||
| 
								 | 
							
											m_ldpc_encode.p[index] = m_format.kldpc + (table_name[row][col] + (n*m_format.q_val))%pbits; 
							 | 
						||
| 
								 | 
							
											// data bit to be accumulated 
							 | 
						||
| 
								 | 
							
											m_ldpc_encode.d[index] = im; 
							 | 
						||
| 
								 | 
							
											index++; 
							 | 
						||
| 
								 | 
							
										} 
							 | 
						||
| 
								 | 
							
										im++; 
							 | 
						||
| 
								 | 
							
									} 
							 | 
						||
| 
								 | 
							
								} 
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define LDPC_BF( TABLE_NAME, ROWS ) \
							 | 
						||
| 
								 | 
							
								for( int row = 0; row < ROWS; row++ ) \
							 | 
						||
| 
								 | 
							
								{ \
							 | 
						||
| 
								 | 
							
									for( int n = 0; n < 360; n++ ) \
							 | 
						||
| 
								 | 
							
									{ \
							 | 
						||
| 
								 | 
							
										for( int col = 1; col <= TABLE_NAME[row][0]; col++ ) \
							 | 
						||
| 
								 | 
							
										{ \
							 | 
						||
| 
								 | 
							
								                        m_ldpc_encode.p[index] =  (TABLE_NAME[row][col] + (n*q))%pbits; \
							 | 
						||
| 
								 | 
							
											m_ldpc_encode.d[index] = im; \
							 | 
						||
| 
								 | 
							
											index++; \
							 | 
						||
| 
								 | 
							
										} \
							 | 
						||
| 
								 | 
							
										im++; \
							 | 
						||
| 
								 | 
							
									} \
							 | 
						||
| 
								 | 
							
								} 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Generate the lookup tables for the ldpc mode
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								void DVBS2::ldpc_lookup_generate( void )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int im;
							 | 
						||
| 
								 | 
							
									int index;
							 | 
						||
| 
								 | 
							
								    int pbits;
							 | 
						||
| 
								 | 
							
								    int uc;
							 | 
						||
| 
								 | 
							
									int rows;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									index = 0;
							 | 
						||
| 
								 | 
							
									im = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if(m_format.frame_type == FRAME_NORMAL)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if(m_format.code_rate == CR_2_3)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											uc    = m_format.kldpc;
							 | 
						||
| 
								 | 
							
											pbits = m_format.nldpc - m_format.kldpc; //number of parity bits
							 | 
						||
| 
								 | 
							
											rows  = 120;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											for( int row = 0; row < rows; row++ )// for each row
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												for( int n = 0; n < 360; n++ )
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
													for( int col = 1; col <= ldpc_tab_2_3N[row][0]; col++ )
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
														// parity bit location, position from start of block
							 | 
						||
| 
								 | 
							
														m_ldpc_encode.p[index] = m_format.kldpc + (ldpc_tab_2_3N[row][col] + (n*m_format.q_val))%pbits;
							 | 
						||
| 
								 | 
							
														// data bit to be accumulated
							 | 
						||
| 
								 | 
							
														m_ldpc_encode.d[index] = im;
							 | 
						||
| 
								 | 
							
														index++;
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
													im++;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									m_ldpc_encode.length = index;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								void DVB2::ldpc_lookup_generate( void )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int im;
							 | 
						||
| 
								 | 
							
								    int index;
							 | 
						||
| 
								 | 
							
								    int pbits;
							 | 
						||
| 
								 | 
							
								    int q;
							 | 
						||
| 
								 | 
							
								    index = 0;
							 | 
						||
| 
								 | 
							
								    im = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    pbits = m_format[0].nldpc - m_format[0].kldpc; //number of parity bits
							 | 
						||
| 
								 | 
							
								    q = m_format[0].q_val;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if(m_format[0].frame_type == FRAME_NORMAL)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_1_4 ) LDPC_BF( ldpc_tab_1_4N,  45  );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_1_3 ) LDPC_BF( ldpc_tab_1_3N,  60  );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_2_5 ) LDPC_BF( ldpc_tab_2_5N,  72  );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_1_2 ) LDPC_BF( ldpc_tab_1_2N,  90  );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_3_5 ) LDPC_BF( ldpc_tab_3_5N,  108 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_2_3 ) LDPC_BF( ldpc_tab_2_3N,  120 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_3_4 ) LDPC_BF( ldpc_tab_3_4N,  135 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_4_5 ) LDPC_BF( ldpc_tab_4_5N,  144 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_5_6 ) LDPC_BF( ldpc_tab_5_6N,  150 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_8_9 ) LDPC_BF( ldpc_tab_8_9N,  160 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_9_10) LDPC_BF( ldpc_tab_9_10N, 162 );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if(m_format[0].frame_type == FRAME_SHORT)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_1_4 ) LDPC_BF( ldpc_tab_1_4S, 9  );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_1_3 ) LDPC_BF( ldpc_tab_1_3S, 15 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_2_5 ) LDPC_BF( ldpc_tab_2_5S, 18 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_1_2 ) LDPC_BF( ldpc_tab_1_2S, 20 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_3_5 ) LDPC_BF( ldpc_tab_3_5S, 27 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_2_3 ) LDPC_BF( ldpc_tab_2_3S, 30 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_3_4 ) LDPC_BF( ldpc_tab_3_4S, 33 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_4_5 ) LDPC_BF( ldpc_tab_4_5S, 35 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_5_6 ) LDPC_BF( ldpc_tab_5_6S, 37 );
							 | 
						||
| 
								 | 
							
								        if( m_format[0].code_rate == CR_8_9 ) LDPC_BF( ldpc_tab_8_9S, 40 );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    m_ldpc_encode.table_length = index;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void DVB2::ldpc_encode( void )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    Bit *d,*p;
							 | 
						||
| 
								 | 
							
								    // Calculate the number of parity bits
							 | 
						||
| 
								 | 
							
								    int plen = m_format[0].nldpc - m_format[0].kldpc;
							 | 
						||
| 
								 | 
							
								    d = m_frame;
							 | 
						||
| 
								 | 
							
								    p = &m_frame[m_format[0].kldpc];
							 | 
						||
| 
								 | 
							
								    // First zero all the parity bits
							 | 
						||
| 
								 | 
							
								    memset( p, 0, sizeof(Bit)*plen);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // now do the parity checking
							 | 
						||
| 
								 | 
							
								    for( int i = 0; i < m_ldpc_encode.table_length; i++ )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        p[m_ldpc_encode.p[i]] ^= d[m_ldpc_encode.d[i]];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
									for (int i = 1; i < plen; i++)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										p[i] ^= p[i - 1];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								void DVB2::ldpc_encode_test( void )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if(1)// m_format.code_rate == CR_1_2 )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        printf("\n\nEncode length %d\n",m_ldpc_encode.table_length);
							 | 
						||
| 
								 | 
							
								        printf("Parity start  %d\n",m_format[0].kldpc);
							 | 
						||
| 
								 | 
							
								        for( int i = 0; i < m_ldpc_encode.table_length; i++ )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if(m_ldpc_encode.d[i] == 0 )
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                printf("%d+%d\n",m_ldpc_encode.p[i],m_ldpc_encode.d[i]);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        printf("Encode test end\n\n");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |