⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gennavdatabit.c

📁 GPS卫星导航接收机的仿真程序。用C语言实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	CopyBitToWord (omega_n, 0,24, word );
	Parity_computation(word, D29, D30);
	WordtoData(subf+210,word,30);
 
	
	//////////sub frame 3, word 9999: 
	// 24 OMEGADOT, 6 Parity
	CopyBitToWord (OMEGADOT_n, 0,24, word );
	Parity_computation(word, D29, D30);
	WordtoData(subf+240,word,30);

	
	//////////sub frame 3, word 10101010: 
	// 8 IODE, 14 Idot,  6 Parity
	CopyBitToWord (Iode_n, 0,8, word );
	CopyBitToWord (Idot_n, 0,14, word+8 );
	Parity_computation(word, D29, D30);
	// Adjust parity checking
	if (word[28] == 1)
	{
		word[28]	= 0;
		word[23]	=	1 - word[23];
		word[25]	=	1 - word[25];
		word[29]	=	1 - word[29];
	}
	
	if (word[29] == 1)
	{
		word[29]	= 0;
		word[22]	=	1 - word[22];
		word[24]	=	1 - word[24];
		word[27]	=	1 - word[27];
	}
	*D29 = word[28];
	*D30 = word[29];	
	WordtoData(subf+270,word,30);

}

//******************************************************************************
//**	Function:	get_sub4												
//**	Tasks:		Generate subframe4
//******************************************************************************
void get_sub4(char *subf, char *D29, char *D30, unsigned long zcount)
{		
	char word[30],subframeID[3];
//	double IODC_n[10],M0_n[32],ec_n[32],sqrtA_n[32];
//	double W0_n[32], omeg_n[32], i0_n[32];
//	double scale;
	int    i;
		
	//////////////////////////////////////////////////////////////////
	//////////subframe 1 Frame[1:300]

	//////////sub frame 1, word 1111
	//TLM word
	GetTLMWord(word, *D30);		// Preamble contain Capital D
	Parity_computation(word, D29, D30);
	WordtoData(subf,word,30);
	
	//////////sub frame 1, word 2222

	subframeID[0] = 1; subframeID[1] = 0; subframeID[2] = 0;
	GetHOWWord(word, zcount,subframeID);
	Parity_computation(word, D29, D30);
	// Adjust parity checking
	if (word[28] == 1)
	{
		word[28]	= 0;
		word[23]	=	1 - word[23];
		word[25]	=	1 - word[25];
		word[29]	=	1 - word[29];
	}
	
	if (word[29] == 1)
	{
		word[29]	= 0;
		word[22]	=	1 - word[22];
		word[24]	=	1 - word[24];
		word[27]	=	1 - word[27];
	}
	*D29 = word[28];
	*D30 = word[29];

	
	WordtoData(subf+30,word,30);

	//////////sub frame 1, word 3333: 
	//10 WN, 2 reserved, 4 SV accuracy, 6 SV health,2 IODC, 6 Parity
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+60,word,30);

	
	//////////sub frame 1, word 4444: 
	//
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+90,word,30);

	//////////sub frame 1, word 5555: 
	//
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+120,word,30);

	//////////sub frame 1, word 6666:
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+150,word,30);
	//

	
	//////////sub frame 1, word 7777: 
	//16**, 8 Tgd, 6 Parity
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+180,word,30);

	//////////sub frame 1, word 8888: 
	//8 LSB IODC, 16 Toc(Toe), 6 Parity
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+210,word,30);
 
	
	//////////sub frame 1, word 9999: 
	//8 af2, 16 af1, 6 Parity
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+240,word,30);

	
	//////////sub frame 1, word 10101010: 
	//22 af0, 2 t, 6 Parity
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	// Adjust parity checking
	if (word[28] == 1)
	{
		word[28]	= 0;
		word[23]	=	1 - word[23];
		word[25]	=	1 - word[25];
		word[29]	=	1 - word[29];
	}
	
	if (word[29] == 1)
	{
		word[29]	= 0;
		word[22]	=	1 - word[22];
		word[24]	=	1 - word[24];
		word[27]	=	1 - word[27];
	}
	*D29 = word[28];
	*D30 = word[29];
	WordtoData(subf+270,word,30);

}

//******************************************************************************
//**	Function:	get_sub5												
//**	Tasks:		Generate subframe5
//******************************************************************************
void get_sub5(char *subf, char *D29, char *D30, unsigned long zcount)
{		
	char word[30],subframeID[3];
	//double IODC_n[10],M0_n[32],ec_n[32],sqrtA_n[32];
	//double W0_n[32], omeg_n[32], i0_n[32];
	//double scale;
	int    i;
		
	//////////////////////////////////////////////////////////////////
	//////////subframe 1 Frame[1:300]

	//////////sub frame 1, word 1111
	//TLM word
	GetTLMWord(word, *D30);		// Preamble contain Capital D
	Parity_computation(word, D29, D30);
	WordtoData(subf,word,30);
	
	//////////sub frame 1, word 2222

	subframeID[0] = 1; subframeID[1] = 0; subframeID[2] = 1;
	GetHOWWord(word, zcount,subframeID);
	Parity_computation(word, D29, D30);
	// Adjust parity checking
	if (word[28] == 1)
	{
		word[28]	= 0;
		word[23]	=	1 - word[23];
		word[25]	=	1 - word[25];
		word[29]	=	1 - word[29];
	}
	
	if (word[29] == 1)
	{
		word[29]	= 0;
		word[22]	=	1 - word[22];
		word[24]	=	1 - word[24];
		word[27]	=	1 - word[27];
	}
	*D29 = word[28];
	*D30 = word[29];

	
	WordtoData(subf+30,word,30);

	//////////sub frame 1, word 3333: 
	//10 WN, 2 reserved, 4 SV accuracy, 6 SV health,2 IODC, 6 Parity
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+60,word,30);

	
	//////////sub frame 1, word 4444: 
	//
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+90,word,30);

	//////////sub frame 1, word 5555: 
	//
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+120,word,30);

	//////////sub frame 1, word 6666:
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+150,word,30);
	//

	
	//////////sub frame 1, word 7777: 
	//16**, 8 Tgd, 6 Parity
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+180,word,30);

	//////////sub frame 1, word 8888: 
	//8 LSB IODC, 16 Toc(Toe), 6 Parity
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+210,word,30);
 
	
	//////////sub frame 1, word 9999: 
	//8 af2, 16 af1, 6 Parity
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	Parity_computation(word, D29, D30);
	WordtoData(subf+240,word,30);

	
	//////////sub frame 1, word 10101010: 
	//22 af0, 2 t, 6 Parity
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}

	Parity_computation(word, D29, D30);
	// Adjust parity checking
	if (word[28] == 1)
	{
		word[28]	= 0;
		word[23]	=	1 - word[23];
		word[25]	=	1 - word[25];
		word[29]	=	1 - word[29];
	}
	
	if (word[29] == 1)
	{
		word[29]	= 0;
		word[22]	=	1 - word[22];
		word[24]	=	1 - word[24];
		word[27]	=	1 - word[27];
	}
	*D29 = word[28];
	*D30 = word[29];
	WordtoData(subf+270,word,30);

}


void WordtoData(char Frame[], char word[], int n )
{
	int i;
	for (i=0;i<n;i++)
	{
		Frame[i] =  word[i];
	}
}

void WordtoDataDouble(double Frame[], double word[], int n )
{
	int i;
	for (i=0;i<n;i++)
	{
		Frame[i] =  word[i];
	}
}


//No parity bits are included yet in TLM word
//Only 8 bits preamble, researved bits are set to 1
void GetTLMWord(char word[], char D30 )
{
	// Output is small d.
	int i;
	char	ini_val, set_val;

	ini_val = 1;
	set_val = 0;
	if (D30 == 1)
	{
		ini_val = 0;
		set_val = 1;
	}
	
	//	Initialize Preamble, after parity checking, it should ne 10001011
   for (i=0;i<8;i++)
	{
		word[i] =  ini_val;
	}

	// Initialize TLM message and reserverd bit
   for (i=8;i<24;i++)
	{
		word[i] =  (i & 1);
	}

	word[1] = set_val;
	word[2] = set_val;
	word[3] = set_val;
	word[5] = set_val;
}

void GetHOWWord( char word[],unsigned long TOW, char subframeID[] )
{
	int i;
		
    for (i=0;i<30;i++)
	{
		word[i] =  i & 1;
	}

	//Compute binary of eph_navbit.TOW transmit time of the next subframe
	//eph_navbit.TOW is transmit time of this subframe
	//z count 19bits. 2 LSB are truncted
	//TOW=Ttr=z count 17 MSB *6-6
	Convert_to_B(word, (long int)TOW, 17);

	//2 flags
	//word[17] = 1;
	//word[18] = 1;

	//subframe ID
	WordtoData(word+19,subframeID,3);

	//parity not available
}


void Convert_to_B(char B_value[],  long int In_value, int n)
{
	int i,pow2,tmp;

//	In_value = (int)In;

	if (In_value>=0)
	{
		for (i=0;i<n;i++)
		{
			pow2      = (int)pow(2,n-i-1);
			tmp       = In_value/pow2;

			if (tmp==1)
				B_value[i] =  1;
			else
				B_value[i] = 0;

			In_value = In_value % pow2;
		}
	}
	else
	{
		In_value  = -In_value-1;
		for (i=0;i<n;i++)
		{
			pow2      = (int)pow(2,n-i-1);
			tmp       = In_value/pow2;

			if (tmp==1)
				B_value[i] = 0 ;
			else
				B_value[i] =  1;

			In_value  = In_value % pow2;
		}
	}
}


//void Parity_bits()
char Parity_calculation( char *hd, char *d)
{
	int icount;
	char one_bit = 0;
	for (icount =0 ; icount < 26; icount ++)
		if (hd[icount])
			one_bit = (one_bit == d[icount])?0:1;

	return one_bit;
}


void Parity_computation( char word[], char *D29, char *D30)
{
	// word[] : Small d
	char h1[] = {1,0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1,0,0,1,0 };		// from GPS Th & App p.131
	char h2[] = {0,1,0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1,0,0,1 };		// by B.W. Parkinson & J. J. Spilker
	char h3[] = {1,0,1,0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1,0,0 };
	char h4[] = {0,1,0,1,0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1,0 };
	char h5[] = {0,1,1,0,1,0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1 };
	char h6[] = {1,0,0,0,1,0,1,1,0,1,1,1,1,0,1,0,1,0,0,0,1,0,0,1,1,1 };

	char ch_word[26];
	int		icount;
//	char ch_bit;//ch_D29, ch_D30, 

	ch_word[0] = *D29;
	ch_word[1] = *D30;

	// ch_word contains source bits
	for (icount=0; icount <24; icount ++)
		ch_word[icount+2] = (word[icount]!=0)? 1: 0;

	// word contains the transmit bits
	for (icount = 0; icount < 24; icount ++ )
		word[icount] = (ch_word[icount+2] == ch_word[1])? 0 : 1;

	word[24] = Parity_calculation(h1, ch_word);
	word[25] = Parity_calculation(h2, ch_word);
	word[26] = Parity_calculation(h3, ch_word);
	word[27] = Parity_calculation(h4, ch_word);
	word[28] = Parity_calculation(h5, ch_word);
	word[29] = Parity_calculation(h6, ch_word);

	*D29 = word[28];
	*D30 = word[29];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -