All
I have an HDF5 file I need to read in a C++ application. I performed an
h5dump on the data and have the following structure (with many items
removed that I am not interested in). I have successfully read in all 7500
values of "num_samps" using the C++ HDF5 library. What I am struggling to
figure out how to read is the array of compound "iq_data". I know in the
datatype it says there are 1000 compound objects. I don't know if I can get
this value out of the DataType, but I do know the num_samps points to this
array size as well, which is fine since I can read this. Can any of you
help me figure out how to read the "iq_data" array. Below is the sample
data followed by my code I have so far. In my code "numSamps" is good, but
"iqData" is not holding anything useful. I am sure I am missing something.
Thanks for your help!
Todd Dobmeyer
--------------SAMPLE DATA-------------------------
HDF5 "hdfFile.be01" {
GROUP "/" {
DATATYPE "DRdata" H5T_COMPOUND {
H5T_ARRAY { [5] H5T_STD_U32LE } "guid";
H5T_STD_I32LE "version";
...
H5T_STD_U32LE "num_samps";
...
H5T_STD_U32LE "sequence_dummy";
H5T_ARRAY { [1000] H5T_COMPOUND {
H5T_IEEE_F32LE "f_i";
H5T_IEEE_F32LE "f_q";
} } "iq_data";
}
DATASET "DRx1data" {
DATATYPE "/DRx1"
DATASPACE SIMPLE { ( 7500 ) / ( H5S_UNLIMITED ) }
DATA {
(0): {
[ 352430272, 25602, 2314, 1442149219, 43629 ],
1,
1.44215e+09,
1442149219,
0,
1,
1,
0,
1,
0,
0,
0,
3,
0,
0,
0,
0,
1,
31095000,
20000,
0,
1000,
1000, // (this is num_samps)
1,
1000,
[ {
1.09068e+09,
4.53469e+08
}, {
4.03303e+08,
4.11846e+08
}, {
-1.35295e+08,
-1.70107e+08
}, ...
--------------------CODE------------------
typedef struct {
float f_i;
float f_q;
} complex_t;
int main(int argc, char *argv[])
{
std::string path = "/data/hdfFile.be01";
// Open the file, dataset, and dataspace
H5::H5File file(path, H5F_ACC_RDONLY);
H5::DataSet dataset = file.openDataSet("DRx1data");
H5::DataSpace dataspace = dataset.getSpace();
// Get the number of elements and number of samples
int nelems = dataspace.getSimpleExtentNpoints();
int numSamps[nelems];
// Create number of samples type
H5::CompType sampsType(sizeof(uint));
sampsType.insertMember("num_samps", 0, H5::PredType::STD_U32LE);
// Read the number of samples
dataset.read(numSamps, sampsType);
// Now try to read the I/Q data
H5::CompType iqDataType(sizeof(complex_t));
iqDataType.insertMember("f_i", HOFFSET(complex_t, f_i),
H5::PredType::NATIVE_FLOAT);
iqDataType.insertMember("f_q", HOFFSET(complex_t, f_q),
H5::PredType::NATIVE_FLOAT);
complex_t** iqData = new complex_t*[nelems];
for(int i = 0 ; i < nelems ; ++i)
{
iqData[i] = new complex_t[numSamps[i]];
}
dataset.read(iqData, iqDataType);