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

📄 gennavdatabit.c

📁 GPS卫星导航接收机的仿真程序。用C语言实现
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <memory.h>
#include <string.h>
#include <malloc.h>
#include <math.h>
#include <stdlib.h>
#include <limits.h>

#include "GenNavDataBit.h"

#include "GenSamples.h"

RAW_EPH  eph_navbit;
extern	RAW_EPH  ephsv[ ];


//******************************************************************************
//**	Function:	Gen_NavData_Bit												
//**	Tasks:		Read Ephemeris and generate navigation message
//******************************************************************************
void Gen_NavData_Bit(
					    double Data[],
						int prn,
						double startt,
						int    DataLength
					)		
{
	eph_navbit = ephsv[prn];
	GetData(Data,startt,DataLength);
	return;
}


//******************************************************************************
//**	Function:	GetData												
//**	Tasks:		Generate five subframes
//******************************************************************************
void GetData(double data[],double start_t, int length)
{
	int    i,icount;
	static unsigned long zcount;
	static char D29=0, D30=0;
	char subf[300];
	
	zcount = (unsigned long)(floor(start_t/6.0+0.5)+1);
	
	// lengh/1500 :  Number of frame which is an integer

	for (i=0;i<length/1500;i++)
	{
		get_sub1(subf, &D29, &D30, zcount);
		zcount ++;
		for (icount=0;icount<300;icount++)
			data[i*1500+icount]= ( subf[icount] == 0 )? -1.0: 1.0;

		get_sub2(subf, &D29, &D30, zcount);
		zcount ++;
		for (icount=0;icount<300;icount++)
			data[i*1500+300+icount]=( subf[icount] == 0 )? -1.0: 1.0;

		get_sub3(subf, &D29, &D30, zcount);
		zcount ++;
		for (icount=0;icount<300;icount++)
			data[i*1500+600+icount]=( subf[icount] == 0 )? -1.0: 1.0;

		get_sub4(subf, &D29, &D30, zcount);
		zcount ++;
		for (icount=0;icount<300;icount++)
			data[i*1500+900+icount]=( subf[icount] == 0 )? -1.0: 1.0;

		get_sub5(subf, &D29, &D30, zcount);
		zcount ++;
		for (icount=0;icount<300;icount++)
			data[i*1500+1200+icount]=( subf[icount] == 0 )? -1.0: 1.0;
	}
		
}


//******************************************************************************
//**	Function:	get_sub1												
//**	Tasks:		Generate subframe1
//******************************************************************************
void get_sub1(char *subf, char *D29, char *D30, unsigned long zcount)
{		
	char word[30],subframeID[3];
	int i;
	long int  week_n, IODC_n, Tgd_n, Toc_n, af0_n, af1_n, af2_n, CodeL2_n, L2P_n, SVAcc_n, SVHealth_n ;
		

	/*Prepare the ephemeris in subframe 1*/

	//  week number	: 10 bits
	week_n = (long int)eph_navbit.weekn;
	week_n = week_n % 1023;

	//	IODC number	:		10 bits
	IODC_n	=	(long int)	eph_navbit.IODC;
	// TGD	:	8 bits
	Tgd_n		=	(long int) (eph_navbit.Tgd / pow(2.0, -31.0));
	// Toc	: 16 bits
	Toc_n		=	(long int) (eph_navbit.Toc / pow(2.0, 4.0) );
	// af2	:	8 bits
	af2_n		=	(long int) (eph_navbit.af2 / pow(2.0, -55.0) );
	// af1	:	16 bits
	af1_n		=	(long int) (eph_navbit.af1 / pow(2.0, -43.0) );
	// af0	:	22 bits 
	af0_n		=	(long int) (eph_navbit.af0 / pow(2.0, -31.0) );
	// Code on L2:	2 bits
	CodeL2_n =	(long int) (eph_navbit.codeL2 );
	// L2 P data flag:	1 bit
	L2P_n		=	(long int) (eph_navbit.L2p );
	// SV Accuracy	:	4 bits
	SVAcc_n	=	(long int) (eph_navbit.SVaccuracy);
	// AV Health	:	6 bits
	SVHealth_n	=	(long int) (eph_navbit.SVhealth);


	//////////////////////////////////////////////////////////////////
	//////////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] = 0; 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;
	}

	CopyBitToWord (week_n, 0, 10, word);
	CopyBitToWord (CodeL2_n, 0, 2, word+10);
	CopyBitToWord (SVAcc_n, 0, 4, word+12 );
	CopyBitToWord (SVHealth_n, 0, 6, word+16 );
	CopyBitToWord (IODC_n, 8, 2, word+22 );
	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;
	CopyBitToWord (L2P_n, 0,1, word );
	Parity_computation(word, D29, D30);
	WordtoData(subf+90,word,30);

	//////////sub frame 1, word 5555: 
	// 24 bits *** + Parity checking
	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:
	// 24 bits *** + Parity checking
	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;
	CopyBitToWord (Tgd_n, 0,8, word+16 );
	Parity_computation(word, D29, D30);
	WordtoData(subf+180,word,30);

	//////////sub frame 1, word 8888: 
	//8 LSB IODC, 16 Toc(Toe), 6 Parity
	CopyBitToWord (IODC_n, 0,8, word );
	CopyBitToWord (Toc_n, 0,16, word+8 );
	Parity_computation(word, D29, D30);
	WordtoData(subf+210,word,30);
 
	
	//////////sub frame 1, word 9999: 
	//8 af2, 16 af1, 6 Parity
	CopyBitToWord (af2_n, 0,8, word );
	CopyBitToWord (af1_n, 0,16, word+8 );	
	Parity_computation(word, D29, D30);
	WordtoData(subf+240,word,30);

	//////////sub frame 1, word 10101010: 
	//22 af0, 2 t, 6 Parity
	CopyBitToWord (af0_n, 0, 22, word );
	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 CopyBitToWord(int val, int bit, int bitnum, char word[] )
{
	INTtoBIT unIntBit;
	unsigned char	chtmp, chtmp1;
	int icount, ibyte, ibit, iword = 0;

	unIntBit.itemp	=	val;
	for (icount = bit +  bitnum - 1 ; icount >= bit ; icount -- )
	{
		ibyte = icount / 8;
		ibit	= icount - ibyte * 8;
		chtmp1	=	0x01 << ibit;
		chtmp	=	unIntBit.ch[ibyte]& chtmp1;
		word[iword] = (chtmp)? 1:0;
		iword ++;
	}
	return;
}

//******************************************************************************
//**	Function:	get_sub2												
//**	Tasks:		Generate subframe2
//******************************************************************************
void get_sub2(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;

	int		Iode_n,Crs_n,Deltan_n,M0_n,Cuc_n,e_n,Cus_n,sqrta_n,toe_n,Fitint_n;

	/*Prepare the ephemeris in subframe 1*/
	Iode_n	=	(int)(eph_navbit.IODE );
	Crs_n		=	(int)(eph_navbit.Crs/pow(2.0,-5.0));
	Deltan_n	=	(int)(eph_navbit.dn / pow(2.0,-43.0) / PI);
	M0_n		=	(int)(eph_navbit.M0 / pow(2.0,-31.0) / PI);
	Cuc_n		=	(int)(eph_navbit.Cuc /pow(2.0, -29.0));
	e_n		=	(int)(eph_navbit.ec /pow(2.0, -33.0));
	Cus_n		=	(int)(eph_navbit.Cus /pow(2.0,-29.0));
	sqrta_n	=	(int)(eph_navbit.sqrtA / pow(2.0, -19.0));
	toe_n		=	(int)(eph_navbit.Toe / pow(2.0, 4.0) );
	Fitint_n	=	(int)1;		//Unknown



	//////////////////////////////////////////////////////////////////
	//////////subframe 2 Frame[1:300]

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

	subframeID[0] = 0; subframeID[1] = 1; 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 2, word 3333: 
	//8 IODE, 16 Crs, 6 Parity
	CopyBitToWord (Iode_n, 0,8, word );
	CopyBitToWord (Crs_n, 0, 16, word + 8 );
	Parity_computation(word, D29, D30);
	WordtoData(subf+60,word,30);

	
	//////////sub frame 2, word 4444: 
	// 16 Delta_n    8 MSB M0
	CopyBitToWord (Deltan_n, 0,16, word );
	CopyBitToWord (M0_n, 24,8, word+16 );
	Parity_computation(word, D29, D30);
	WordtoData(subf+90,word,30);


	//////////sub frame 2, word 5555: 
	// 24 LSB M0
	CopyBitToWord (M0_n, 0, 24, word );
	Parity_computation(word, D29, D30);
	WordtoData(subf+120,word,30);

	//////////sub frame 2, word 6666:
	// 16 Cus  8 MSB e
	CopyBitToWord (Cuc_n, 0,16, word );
	CopyBitToWord (e_n, 24,8, word+16 );
	Parity_computation(word, D29, D30);
	WordtoData(subf+150,word,30);
	
	//////////sub frame 2, word 7777: 
	// 24 LSB e
	CopyBitToWord (e_n, 0, 24, word );
	Parity_computation(word, D29, D30);
	WordtoData(subf+180,word,30);

	//////////sub frame 2, word 8888: 
	// 16 Cus  ,  8 MSB sqrta  , 6 Parity
	CopyBitToWord (Cus_n, 0,16, word );
	CopyBitToWord (sqrta_n, 24,8, word+16 );
	Parity_computation(word, D29, D30);
	WordtoData(subf+210,word,30);
 
	
	//////////sub frame 2, word 9999: 
	//24 LSB sqrta , 6 Parity
	CopyBitToWord (sqrta_n, 0, 24, word );
	Parity_computation(word, D29, D30);
	WordtoData(subf+240,word,30);

	
	//////////sub frame 2, word 10101010: 
	//22 af0, 2 t, 6 Parity
	for (i=0;i<30;i++)
	{
		word[i] = i&1;
	}
	CopyBitToWord (toe_n, 0, 16, word );
	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_sub3												
//**	Tasks:		Generate subframe3
//******************************************************************************
void get_sub3(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;
	int Cic_n, OMEGA0_n, Cis_n, i0_n, Crc_n, omega_n, OMEGADOT_n, Iode_n, Idot_n;
		
	// Prepare ephemeris data in subframe 3
	Cic_n	=	(int)(eph_navbit.Cic / pow(2.0, -29.0) );
	OMEGA0_n	=	(int)(eph_navbit.W0 / pow(2.0, -31.0) /PI );
	Cis_n	=	(int)(eph_navbit.Cis / pow(2.0, -29.0) );
	i0_n	=	(int)(eph_navbit.i0 / pow(2.0, -31.0) / PI );
	Crc_n	=	(int)(eph_navbit.Crc / pow(2.0, -5.0 ) );
	omega_n	=	(int)(eph_navbit.omeg / pow(2.0, -31.0) / PI );
	OMEGADOT_n = (int)(eph_navbit.omegdot / pow(2.0, -43.0) / PI );
	Iode_n	=	(int)(eph_navbit.IODE);
	Idot_n	=	(int)(eph_navbit.Idot / pow(2.0, -43.0) / PI );

	//////////sub frame 3, 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] = 0; subframeID[1] = 1; 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 3, word 3333: 
	//16 Cic,  8 MSB OMEGA0,  6 Parity
	CopyBitToWord (Cic_n, 0,16, word );
	CopyBitToWord (OMEGA0_n, 24,8, word+16 );
	Parity_computation(word, D29, D30);
	WordtoData(subf+60,word,30);

	
	//////////sub frame 3, word 4444: 
	// 24 LSB OMEGA0, 6 parity
	CopyBitToWord (OMEGA0_n, 0, 24, word);
	Parity_computation(word, D29, D30);
	WordtoData(subf+90,word,30);

	//////////sub frame 3, word 5555: 
	// 16 Cis, 8 MSB i0, 6 parity
	CopyBitToWord (Cis_n, 0,16, word );
	CopyBitToWord (i0_n, 24,8, word+16 );
	Parity_computation(word, D29, D30);
	WordtoData(subf+120,word,30);

	//////////sub frame 3, word 6666:
	// 24 LSB i0, 6 parity
	CopyBitToWord (i0_n, 0, 24, word);
	Parity_computation(word, D29, D30);
	WordtoData(subf+150,word,30);

	
	//////////sub frame 3, word 7777: 
	//16 Crc, 8 MSB omega, 6 parity
	CopyBitToWord (Crc_n, 0,16, word );
	CopyBitToWord (omega_n, 24,8, word+16 );
	Parity_computation(word, D29, D30);
	WordtoData(subf+180,word,30);

	//////////sub frame 3, word 8888: 
	// 24 MSB omega, 6 Parity

⌨️ 快捷键说明

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