ISCE_INSAR/contrib/issi/components/ISSI/src/tecToPhase.c

74 lines
1.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "tecToPhase.h"
/**
* Convert from a map of Total Electron Count (TEC) to phase in radians
*
* @param tecFilename the file containing the Total Electron Count [electrons/m^2/1e16]
* @param outFilename the output file name for phase
* @param width the width of the input and output files in number of samples in range
* @param fc the carrier frequency of the radar [Hz]
*/
int
convertToPhase(char *tecFilename, char *outFilename, int width, float fc)
{
int length,i,j;
float *tec,*phase;
FILE *tecFile,*outFile;
tecFile = fopen(tecFilename,"rb");
outFile = fopen(outFilename,"wb");
fseek(tecFile,0L,SEEK_END);
length = ftell(tecFile);
rewind(tecFile);
if ( (length%width) != 0 )
{
printf("File has a non-integer number of lines\n");
exit(EXIT_FAILURE);
}
length = (int)(length/(sizeof(float)*width));
tec = (float *)malloc(width*sizeof(float));
phase = (float *)malloc(width*sizeof(float));
for(i=0;i<length;i++)
{
fread(tec,sizeof(float),width,tecFile);
for(j=0;j<width;j++)
{
phase[j] = tecToPhase(tec[j],fc);
}
fwrite(phase,sizeof(float),width,outFile);
}
free(tec);
free(phase);
fclose(tecFile);
fclose(outFile);
return 1;
}
/**
* Convert from Total Electron Count (TEC) in electrons/m^2*1e16 to phase in radians
*
* @param tec the Total Electron Count in [electrons/m^2/1e16]
* @param fc the carrier frequency of the radar [Hz]
* @return the phase in radians
*/
float
tecToPhase(float tec, float fc)
{
float phase;
// Constant (2*pi)/c * e^2/(8*pi^2*\epsilon_0*m_e)
// e is the elementary charge, \epsilon is the permitivity of free space, m_e is the electron mass, and c is the speed of light
// [=] coulombs^2/((m/s) (F/m) kg)
float k3 = 8.45e-7;
phase = (k3/fc)*tec*1e16;
return phase;
}