change loop order between satellite and samples

omit iq_buff's on each channel
treat carr_phase as int
This commit is contained in:
TT 2015-11-28 03:48:24 +09:00
parent ccbb0baba0
commit 8f6b083057

View File

@ -224,7 +224,8 @@ typedef struct
int ca[CA_SEQ_LEN]; /*< C/A Sequence */ int ca[CA_SEQ_LEN]; /*< C/A Sequence */
double f_carr; /*< Carrier frequency */ double f_carr; /*< Carrier frequency */
double f_code; /*< Code frequency */ double f_code; /*< Code frequency */
double carr_phase; /*< Carrier phase */ unsigned int carr_phase; /*< Carrier phase */
int carr_phasestep; /*< Carrier phasestep */
double code_phase; /*< Code phase */ double code_phase; /*< Code phase */
gpstime_t g0; /*!< GPS time at start */ gpstime_t g0; /*!< GPS time at start */
unsigned long dwrd[N_DWRD]; /*!< Data words of sub-frame */ unsigned long dwrd[N_DWRD]; /*!< Data words of sub-frame */
@ -233,7 +234,6 @@ typedef struct
int icode; /*!< initial code */ int icode; /*!< initial code */
int dataBit; /*!< current data bit */ int dataBit; /*!< current data bit */
int codeCA; /*!< current C/A code */ int codeCA; /*!< current C/A code */
short *iq_buff; /*< buffer of I/Q samples */
} channel_t; } channel_t;
/* !\brief generate the C/A code sequence for a given Satellite Vehicle PRN /* !\brief generate the C/A code sequence for a given Satellite Vehicle PRN
@ -1341,7 +1341,8 @@ int main(int argc, char *argv[])
#else #else
double ip,qp; double ip,qp;
#endif #endif
void *iq_buff = NULL; short *iq_buff = NULL;
signed char *iq8_buff = NULL;
gpstime_t grx; gpstime_t grx;
range_t rho0[MAX_SAT]; range_t rho0[MAX_SAT];
@ -1569,17 +1570,23 @@ int main(int argc, char *argv[])
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// Allocate I/Q buffer // Allocate I/Q buffer
if (data_format==SC08) iq_buff = calloc(2*iq_buff_size, 2);
iq_buff = (signed char *)calloc(2*iq_buff_size, 1);
else
iq_buff = (short *)calloc(2*iq_buff_size, 2);
if (iq_buff==NULL) if (iq_buff==NULL)
{ {
printf("Faild to allocate IQ buffer.\n"); printf("Faild to allocate IQ buffer.\n");
exit(1); exit(1);
} }
if (data_format==SC08)
{
iq8_buff = calloc(2*iq_buff_size, 1);
if (iq8_buff==NULL)
{
printf("Faild to allocate IQ buffer.\n");
exit(1);
}
}
// Open output file // Open output file
if (NULL==(fp=fopen(outfile,"wb"))) if (NULL==(fp=fopen(outfile,"wb")))
{ {
@ -1598,15 +1605,6 @@ int main(int argc, char *argv[])
{ {
// C/A code generation // C/A code generation
codegen(chan[i].ca, chan[i].prn); codegen(chan[i].ca, chan[i].prn);
// Allocate I/Q buffer
chan[i].iq_buff = (short *)calloc(2*iq_buff_size, 2);
if (chan[i].iq_buff==NULL)
{
printf("Faild to allocate IQ buffer.\n");
exit(1);
}
} }
// Initialize carrier phase // Initialize carrier phase
@ -1626,8 +1624,8 @@ int main(int argc, char *argv[])
r_xyz = tmp.range; r_xyz = tmp.range;
phase_ini = (2.0*r_ref - r_xyz)/LAMBDA_L1; phase_ini = (2.0*r_ref - r_xyz)/LAMBDA_L1;
phase_ini -= floor(phase_ini);
chan[i].carr_phase = phase_ini - floor(phase_ini); chan[i].carr_phase = 512 * 65536.0 * phase_ini;
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
@ -1710,21 +1708,27 @@ int main(int argc, char *argv[])
// Update code phase and data bit counters // Update code phase and data bit counters
computeCodePhase(&chan[i], rho0[sv], rho, 0.1); computeCodePhase(&chan[i], rho0[sv], rho, 0.1);
chan[i].carr_phasestep = 512 * 65536.0 * chan[i].f_carr * delt;
// Save current pseudorange // Save current pseudorange
rho0[sv] = rho; rho0[sv] = rho;
}
for (isamp=0; isamp<iq_buff_size; isamp++) for (isamp=0; isamp<iq_buff_size; isamp++)
{ {
int i_acc = 0;
int q_acc = 0;
for (i=0; i<nsat; i++)
{
#ifdef _SINE_LUT #ifdef _SINE_LUT
iTable = (int)floor(chan[i].carr_phase*512.0); iTable = (chan[i].carr_phase >> 16) & 511;
ip = chan[i].dataBit * chan[i].codeCA * cosTable512[iTable]; ip = chan[i].dataBit * chan[i].codeCA * cosTable512[iTable];
qp = chan[i].dataBit * chan[i].codeCA * sinTable512[iTable]; qp = chan[i].dataBit * chan[i].codeCA * sinTable512[iTable];
// Store I/Q samples into buffer i_acc += ip;
chan[i].iq_buff[isamp*2] = (short)ip; q_acc += qp;
chan[i].iq_buff[isamp*2+1] = (short)qp;
#else #else
ip = chan[i].dataBit * chan[i].codeCA * cos(2.0*PI*chan[i].carr_phase); ip = chan[i].dataBit * chan[i].codeCA * cos(2.0*PI*chan[i].carr_phase);
qp = chan[i].dataBit * chan[i].codeCA * sin(2.0*PI*chan[i].carr_phase); qp = chan[i].dataBit * chan[i].codeCA * sin(2.0*PI*chan[i].carr_phase);
@ -1762,35 +1766,25 @@ int main(int argc, char *argv[])
chan[i].codeCA = chan[i].ca[(int)chan[i].code_phase]*2-1; chan[i].codeCA = chan[i].ca[(int)chan[i].code_phase]*2-1;
// Update carrier phase // Update carrier phase
chan[i].carr_phase += chan[i].f_carr * delt; chan[i].carr_phase += chan[i].carr_phasestep;
if (chan[i].carr_phase>=1.0)
chan[i].carr_phase -= 1.0;
else if (chan[i].carr_phase<0.0)
chan[i].carr_phase += 1.0;
} }
// Store I/Q samples into buffer
iq_buff[isamp*2] = (short)i_acc;
iq_buff[isamp*2+1] = (short)q_acc;
} // End of omp parallel for } // End of omp parallel for
if (data_format==SC08) if (data_format==SC08)
{ {
for (isamp=0; isamp<2*iq_buff_size; isamp++) for (isamp=0; isamp<2*iq_buff_size; isamp++)
{ {
signed char sample = 0; iq8_buff[isamp] = iq_buff[isamp]>>4; // 12-bit bladeRF -> 8-bit HackRF
for (i=0; i<nsat; i++)
sample += (signed char)(chan[i].iq_buff[isamp]>>4); // 12-bit bladeRF -> 8-bit HackRF
((signed char*)iq_buff)[isamp] = sample;
} }
fwrite(iq_buff, 1, 2*iq_buff_size, fp); fwrite(iq8_buff, 1, 2*iq_buff_size, fp);
} }
else else
{ {
for (isamp=0; isamp<2*iq_buff_size; isamp++)
{
short sample = 0;
for (i=0; i<nsat; i++)
sample += chan[i].iq_buff[isamp];
((short*)iq_buff)[isamp] = sample;
}
fwrite(iq_buff, 2, 2*iq_buff_size, fp); fwrite(iq_buff, 2, 2*iq_buff_size, fp);
} }
@ -1808,8 +1802,6 @@ int main(int argc, char *argv[])
// Free I/Q buffer // Free I/Q buffer
free(iq_buff); free(iq_buff);
for (i=0; i<nsat; i++)
free(chan[i].iq_buff);
// Close file // Close file
fclose(fp); fclose(fp);