📄 gennavdatabit.c
字号:
#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 + -