读取含有IQ数据的mat文件
前提是导入matlab文件读写库matio.h
添加静态库libmatio.lib、hdf5.lib、szip.lib、zlib1.lib 下载地址
#include<stdlib.h>
#include "matio.h"
#pragma comment(lib,"libmatio.lib")
#pragma comment(lib,"hdf5.lib")
#pragma comment(lib,"szip.lib")
#pragma comment(lib,"zlib1.lib")
int main(){
int i=0,j=0;
mat_t* matfp;
const char *file;
file="data_double_300000.mat";
matfp=Mat_Open(file, MAT_ACC_RDONLY);
if (NULL == matfp) {
printf("Error opening MAT file %s\n", file);
return -1;
}
matvar_t* matvar_I=NULL;
matvar_t* matvar_Q=NULL;
matvar_I=Mat_VarRead(matfp,"I");
matvar_Q=Mat_VarRead(matfp,"Q");
if(!matvar_I)
{
printf("Error read MatVar: I.\n");
return -1;
}
if(!matvar_Q)
{
printf("Error read MatVar: Q.\n");
return -1;
}
int iDataN=matvar_I->nbytes/matvar_I->data_size;
double* dI=new double[iDataN];
double* dQ=new double[iDataN];
memset(dI,0,iDataN*sizeof(double));
memset(dQ,0,iDataN*sizeof(double));
//IQ数据是double类型
if (matvar_I->data_type == MAT_T_DOUBLE){
const double* xData_I=static_cast<const double*>(matvar_I->data);
const double* xData_Q=static_cast<const double*>(matvar_Q->data);
memcpy(dI,xData_I,iDataN*sizeof(double));
memcpy(dQ,xData_Q,iDataN*sizeof(double));
//IQ数据是short类型
}else if(matvar_I->data_type == MAT_T_INT16){
const short* xData_I=static_cast<const short*>(matvar_I->data);
const short* xData_Q=static_cast<const short*>(matvar_Q->data);
for(i=0; i<iDataN; i++){
dI[i]=(double)xData_I[i];
dQ[i]=(double)xData_Q[i];
}
}else{
printf("IQ data type error.\n");
}
matvar_t* matvar_fs=NULL;
matvar_t* matvar_startfre=NULL;
matvar_t* matvar_stopfre=NULL;
matvar_fs=Mat_VarRead(matfp,"samplingRate");
matvar_startfre=Mat_VarRead(matfp,"startfre");
matvar_stopfre=Mat_VarRead(matfp,"stopfre");
if(!matvar_fs)
{
printf("Error read MatVar: samplingRate.\n");
return -1;
}
if(!matvar_startfre)
{
printf("Error read MatVar: startfre.\n");
return -1;
}
if(!matvar_stopfre)
{
printf("Error read MatVar: stopfre.\n");
return -1;
}
const double *dfSample=static_cast<const double*>(matvar_fs->data);
const double *startfre=static_cast<const double*>(matvar_startfre->data);
const double *stopfre=static_cast<const double*>(matvar_stopfre->data);
double fs=*dfSample;
double Bandw=fs/2;
double Startfre=*startfre, Stopfre=*stopfre;
double band=Stopfre-Startfre;
double F_c=(Stopfre+Startfre)/2;
double iGain=0,iAtt=0;
Mat_VarFree(matvar_I);
Mat_VarFree(matvar_Q);
Mat_VarFree(matvar_fs);
Mat_VarFree(matvar_startfre);
Mat_VarFree(matvar_stopfre);
Mat_Close(matfp);
if (iDataN < 10000)
{
return -1;
}
if(dI != NULL)
{
delete []dI;
dI = NULL;
}
if(dQ != NULL)
{
delete []dQ;
dQ = NULL;
}
return 0;
}