CC雷达基数据格式说明(附函数)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CINRAD/CC/CCJ雷达原始数据格式
声明:
本数据格式适用CINRAD/CC和CINRAD/CCJ.安徽四创电子股份有限公司保留最终解释权.本文档仅供内部交流,请不要发表.
文件名:
平扫(PPI):NNNNYYDDHH.MMP
高扫(RHI):NNNNYYDDHH.MMR
体扫(VPPI):NNNNYYDDHH.MMV
单库FFT:NNNNYYDDHH.MMF
等高PPI(CAPPI):NNNNYYDDHH.MMC
N:年Y:月D:日H:时M:分
数据组成:
整个数据由文件头(1个)和基于极坐标系的原始数据(512个径向)组成.
文件头:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//tagWEATHERRADAR雷达信息的结构
typedef struct tagWEATHERRADAR
{
char cFileType[16]; //3830数据标识(CINRADC)
char cCountry[30]; //国家名
char cProvince[20]; //省名
char cStation[40]; //站名
char cStationNumber[10]; //区站号
char cRadarType[20]; //雷达型号
char cLongitude[16]; //天线所在经度
char cLatitude[16]; //天线所在纬度
long lLongitudeValue; //具体经度
long lLatitudeValue; //具体纬度
long lHeight; //天线海拔高度
short sMaxAngle; //地物阻挡最大仰角
short sOptAngle; //最佳观测仰角
unsigned char ucSYear1; //观测开始时间的年千百位(19-20)
unsigned char ucSYear2; //观测开始时间的年十个位(00-99)
unsigned char ucSMonth; //观测开始时间的月(1-12)
unsigned char ucSDay; //观测开始时间的日(1-31)
unsigned char ucSHour; //观测开始时间的时(0-23)
unsigned char ucSMinute; //观测开始时间的分(0-59)
unsigned char ucSSecond; //观测开始时间的秒(0-59)
unsigned char ucTimeFrom; //时间来源0-计算机时钟(1天内未对时)
// 1-计算机时钟(1天内已对时)
// 2-GPS
// 3-其它
unsigned char ucEYear1; //观测结束时间的年千百位(19-20)
unsigned char ucEYear2; //观测结束时间的年十个位(00-99)
unsigned char ucEMonth; //观测结束时间的月(1-12)
unsigned char ucEDay; //观测结束时间的日(1-31)
unsigned char ucEHour; //观测结束时间的时(0-23)
unsigned char ucEMinute; //观测结束时间的分(0-59)
unsigned char ucESecond; //观测结束时间的秒(0-59)
unsigned char ucScanMode; //扫描方式1-RHI
// 10-PPI和ZPPI
// 1XX=VPPI(XX为扫描圈数) unsigned long ulSmilliSecond; //以微秒为单位表示的秒的小数位
unsigned short usRHIA; //RHI所在的方位角(0.01度为单位)
// PPI和VPPI时为FFFF
short sRHIL; //RHI所在的最低仰角(0.01度为单位)
//PPI和VPPI时为FFFF
short sRHIH; //RHI所在的最高仰角(0.01度为单位)
//PPI和VPPI时为FFFF
unsigned short usEchoType; //回波类型0x405a-Z 0x406a-V 0x407a-W
// 0x408a-ZVW三要素
unsigned short usProdCode; //数据类型0x8001-PPI数据0x8002-RHI数据
// 0x8003-VPPI数据0x8004-单强度PPI数据
// 0x8005-CAPPI数据
unsigned char ucCalibration; //标校状态0-无1-自动2-1星期内人工
// 3-1月内人工
unsigned char remain1[3]; //保留字
unsigned char remain2[660]; //保留字,放VPPISCANPARAMETER数据
//该结构的说明见后
long lAntennaG; //天线增益(0.001dB)
long lPower; //峰值功率(瓦)
long lWavelength; //波长(微米)
unsigned short usBeamH; //垂直波束宽度(秒)
unsigned short usBeamL; //水平波束宽度(秒)
unsigned short usPolarization; //极化状态0-水平1-垂直2-双偏振
// 3-圆偏振4-其它
unsigned short usLogA; //对数动态范围(0.01dB)
unsigned short usLineA; //线性动态范围(0.01dB)
unsigned short usAGCP; //AGC延迟量(微秒)
unsigned short usFreqMode; //频率方式1-单重复频率2-双重复频率3:2
// 3-双重复频率4:3
unsigned short usFreqRepeat; //重复频率
unsigned short usPPPPulse; //PPP脉冲数
unsigned short usFFTPoint; //FFT间隔点数
unsigned short usProcessType; //信号处理方式1-PPP 2-全程FFT
// 3-单库FFT
unsigned char ucClutterT; //杂波消除阀值(即STC)
char cSidelobe; //第一旁瓣(dB)
unsigned char ucVelocityT; //速度门限
unsigned char ucFilderP; //地物消除方式0-无1-IIR滤波器1
// 2-IIR滤波器2 3-IIR滤波器3
// 4-IIR滤波器4
unsigned char ucNoiseT; //噪声消除阀值(即强度门限)
unsigned char ucSQIT; //SQI门限
unsigned char ucIntensityC; //DVIP强度值估算采用的通道
// 1-对数通道2-线性通道
unsigned char ucIntensityR; //强度值估算是否距离订正
// 0-无(dB) 1-已订正(dBZ)
unsigned char ucCalNoise; //噪声系数标定值
unsigned char ucCalPower; //发射功率标定值
unsigned char ucCalPulseWidth; //脉冲宽度标定值
unsigned char ucCalWorkFreq; //工作频率标定值
unsigned char ucCalLog; //对数斜率标定值
char remain3[92]; //保留字
unsigned long int liDataOffset; //数据偏移地址
}WEATHERRADAR;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//tagVPPISCANPARAMETER仰角层的结构
typedef struct tagVPPISCANPARAMETER
{
unsigned short usMaxV; //最大可测速度(厘米/秒)
unsigned short usMaxL; //最大可测距离(10米)
unsigned short usBindWidth; //库长(米)
unsigned short usBinNumber; //每径向库数
unsigned short usRecordNumber; //本圈径向数
unsigned short usArotate; //本圈转速(0.01度/秒)
unsigned short usPrf1; //本圈第一次重复频率(0.1Hz)对应单重频或双重频的高者unsigned short usPrf2; //本圈第二次重复频率(0.1Hz)对应双重频的低者unsigned short usSpulseW; //本圈脉宽(微秒)
short usAngle; //仰角(0.01度)
unsigned char cSweepStatus; //1=单要素2=三要素(单重频) 3=三要素(双重频) unsigned char cAmbiguousp; //0=无软件退模糊1=软件退模糊
}VPPISCANPARAMETER;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
注:在WEATHERRADAR结构的remain2处填写了的VPPISCANPARAMETER;结构表明本仰角层的参数(对PPI和VPPI而言)或其他含义(对RHI和单库FFT文件而言)
VPPI有几层填几个,PPI RHI FFT数据只填写一层即一个.
原始数据:
PPI RHI VPPI的数据排列如下:
第0个径向的数据:Z(字)500个
V(字)500个
W(字)500个
….
….
第512个径向的数据:Z(字)500个
V(字)500个
W(字)500个
注: Z V W均为16位的字型数据(在C语言中用short int 有符整型) 所读出的值除以10得到一个小数就是最终的值.
Z以dBz为单位V W均以m/s为单位
读出的数据如果是0x8000,说明此处无回波.这样做的目的是为了必须区别回波强度为0和无回波.
单库FFT数据排列如下:
当为256点时:256个通道的功率值(字型单位:dB)
当为128点时:128个通道的功率值(字型单位:dB)
附函数段:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//检查要打开的文件
//filename:文件名
CString CRadar::CheckData(CString filename)
{
CFile *fp;
CString str="INV ALID",error,tempfilename=filename;
try{
fp=new CFile(filename,CFile::modeRead);
}
catch(CFileException* e){
ProcessFileError(e,1);
return str;
}
WEATHERRADAR tempinfo;
fp->SeekToBegin();
fp->Read(&tempinfo,sizeof(WEATHERRADAR));
if(strcmp(tempinfo.cFileType,"CINRADC"))
{
error.Format("%s 不是3830雷达数据文件!",tempfilename);
AfxMessageBox(error,MB_OK|MB_ICONSTOP);
delete fp;
return str;
}
if(ProdCode==0x8001) str="PPI";
else if(ProdCode==0x8002) str="RHI";
else if(ProdCode==0x8003) str="VPPI";
else if(ProdCode==0x8004) str="ZPPI";
else if(ProdCode==0x8005) str="CAPPI";
else if(ProdCode==0x8006) str="FFT";
else
{
error.Format("文件%s 不是3830雷达数据文件!",tempfilename);
AfxMessageBox(error,MB_OK|MB_ICONSTOP);
}
delete fp;
return str;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //读取数据
//filename:要打开的文件名
BOOL CPPI::LoadData(CString filename)
{
CFile *fp;
CString str;
try{
fp=new CFile(filename,CFile::modeRead);
}
catch(CFileException* e){
radar->ProcessFileError(e,1);
return FALSE;
}
fp->SeekToBegin();
fp->Read(&info,sizeof(WEATHERRADAR));
fp->Seek(218L,CFile::begin);
fp->Read(&vppipara,sizeof(VPPISCANPARAMETER));
rmax=int(MaxL/100.0+0.5);
scanyj=Angle/100.0;
//装地图文件
long l;
//申请数据存储区
hData=::GlobalAlloc(GHND,512L*1500L*2L);
if(!hData)
{
AfxMessageBox("内存不足",MB_OK|MB_ICONSTOP);
::GlobalFree(hData);
delete fp;
return FALSE;
}
pData=(short*)::GlobalLock(hData);
for(l=0;l<(512*1500);l++) pData[l]=short(0x8000); //程序中用来表示有无数据,可以
//不用考虑
fp->Seek(info.liDataOffset,CFile::begin);
int i,BEGINPOS,angle;
long pos;
short tempData[500];
//我的程序要把每一个径向的连续的ZVW数据块读出后再按每个点排列成
//第1个点的Z V W 第2个点的Z V W …. /第500个点的Z V W
//可以不用考虑
if(radar->scanmode=="PPI")
{
for(angle=0;angle<512;angle++)
{
for(BEGINPOS=0;BEGINPOS<=2;BEGINPOS++)
{
fp->Read(tempData,500L*2);
pos=long(angle*1500+BEGINPOS);
for(i=0;i<500;i++)
{
pData[pos]=tempData[i];
pos+=3;
}
}
}
}
else if(radar->scanmode=="ZPPI")
{
for(angle=0;angle<512;angle++)
{
fp->Read(tempData,500L*2);
pos=long(angle*1500+0);
for(i=0;i<500;i++)
{
pData[pos]=tempData[i];
pos+=3;
}
}
}
delete fp;
openfilename=filename;
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //读取数据
//filename:要打开的文件名
BOOL CRHI::LoadData(CString filename)
{
CFile *fp;
CString str;
try{
fp=new CFile(filename,CFile::modeRead);
}
catch(CFileException* e){
radar->ProcessFileError(e,1);
return FALSE;
}
fp->SeekToBegin();
fp->Read(&info,sizeof(WEATHERRADAR));
fp->Seek(218L,CFile::begin);
fp->Read(&vppipara,sizeof(VPPISCANPARAMETER));
rmax=int(MaxL/100);
scanfw=RHIA/100.0;
beginyj=info.sRHIL/100.0;
endyj=info.sRHIH/100.0;
hData=::GlobalAlloc(GHND,512L*1500L*2L);
if(!hData)
{
AfxMessageBox("内存不足",MB_OK|MB_ICONSTOP);
::GlobalFree(hData);
delete fp;
return FALSE;
}
pData=(short*)::GlobalLock(hData);
long l;
for(l=0;l<(512*1500);l++) pData[l]=short(0x8000);
fp->Seek(info.liDataOffset,CFile::begin);
int i,BEGINPOS,angle;
long pos;
short tempData[500];
for(angle=0;angle<512;angle++)
{
for(BEGINPOS=0;BEGINPOS<=2;BEGINPOS++)
{
fp->Read(tempData,500L*2);
pos=long(angle*1500+BEGINPOS);
for(i=0;i<500;i++)
{
pData[pos]=tempData[i];
pos+=3;
}
}
}
delete fp;
openfilename=filename;
if(pDC||pmemDC||pbackDC) ChangeDistanceOrHeight(rmax,hmax);
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //读取数据
//filename:要打开的文件名
BOOL CVPPI::LoadData(CString filename)
{
// if(radar->IsZip) filename=radar->unzipfile;
CFile *fp;
CString str;
try{
fp=new CFile(filename,CFile::modeRead);
}
catch(CFileException* e){
radar->ProcessFileError(e,1);
return FALSE;
}
fp->SeekToBegin();
fp->Read(&info,sizeof(WEATHERRADAR));
fp->Seek(218L,CFile::begin);
ScanPara->num=info.ucScanMode-100;
int yjc,temprf1,temprf2;
for(yjc=0;yjc<ScanPara->num;yjc++)
{
fp->Read(&vppipara[yjc],sizeof(VPPISCANPARAMETER));
ScanPara->yj[yjc]=float(vppipara[yjc].usAngle/100.0);
temprf1=int(vppipara[yjc].usPrf1/10.0+0.5);
temprf2=int(vppipara[yjc].usPrf2/10.0+0.5);
ScanPara->dsp.frequency=temprf1;
if((temprf1*1.0/temprf2)==(3.0/2.0)) ScanPara->dsp.freqctrl=2;
else if((temprf1*1.0/temprf2)==(4.0/3.0)) ScanPara->dsp.freqctrl=3;
else ScanPara->dsp.freqctrl=1;
ScanPara->dsp.pulsewidth=vppipara[yjc].usSpulseW;
}
rmax=int(vppipara[0].usMaxL/100);
long l;
//申请数据存储区
hData=::GlobalAlloc(GHND,512L*1500L*2L*ScanPara->num);
if(!hData)
{
AfxMessageBox("内存不足",MB_OK|MB_ICONSTOP);
::GlobalFree(hData);
delete fp;
return FALSE;
}
pData=(short*)::GlobalLock(hData);
for(l=0;l<(ScanPara->num*512*1500);l++) pData[l]=short(0x8000);
//因为pData中存放的是处理后的数据(有0),为了区分无回波和0,规定无回波0x8000=-32768, //0=0
fp->Seek(info.liDataOffset,CFile::begin);
int i,BEGINPOS,angle;
long pos;
short tempData[500];
for(yjc=0;yjc<ScanPara->num;yjc++)
for(angle=0;angle<512;angle++)
{
for(BEGINPOS=0;BEGINPOS<=2;BEGINPOS++)
{
fp->Read(tempData,500L*2);
pos=long(yjc*1500*512+angle*1500+BEGINPOS);
for(i=0;i<500;i++)
{
pData[pos]=tempData[i];
pos+=3;
}
}
}
delete fp;
openfilename=filename;
curyjc=0;
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //读取数据
//filename:要打开的文件名
BOOL CFFT::LoadData(CString filename)
{
// if(radar->IsZip) filename=radar->unzipfile;
CFile *fp;
CString str;
try{
fp=new CFile(filename,CFile::modeRead);
}
catch(CFileException* e){
radar->ProcessFileError(e,1);
return FALSE;
}
fp->SeekToBegin();
fp->Read(&info,sizeof(WEATHERRADAR));
fp->Seek(218L,CFile::begin);
fp->Read(&vppipara,sizeof(VPPISCANPARAMETER));
rmax=int(MaxL/100.0+0.5);
TESTPoints=int(Arotate);
scanfw=Angle/100.0;
oldFFTPoints=FFTPoint;
fp->Seek(info.liDataOffset,CFile::begin);
fp->Read(linedata.data,256L*2);
delete fp;
openfilename=filename;
ChangeFFTPoints(oldFFTPoints);
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////。