From 1056f970fa29870e05558d5c84afdb80bbd3365d Mon Sep 17 00:00:00 2001 From: Krad Date: Thu, 27 Apr 2023 14:32:57 +0800 Subject: [PATCH] Add matio and MatLab Reader. --- CMakeLists.txt | 2 + src/MatlabReader.cpp | 100 +++++++++++++++++++++++++++++++++++++++++++ src/MatlabReader.h | 76 ++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 src/MatlabReader.cpp create mode 100644 src/MatlabReader.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ddef3f9..0136edf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,7 @@ target_compile_options(Aurora PUBLIC $) target_link_libraries(Aurora PUBLIC $) target_link_libraries(Aurora PUBLIC OpenMP::OpenMP_CXX) +target_link_libraries(Aurora PUBLIC matio) find_package(GTest REQUIRED) INCLUDE_DIRECTORIES(${GTEST_INCLUDE_DIRS}) include_directories(./src/util) @@ -38,6 +39,7 @@ target_compile_options(Aurora_Test PUBLIC $) target_link_libraries(Aurora_Test PUBLIC $) target_link_libraries(Aurora_Test PUBLIC OpenMP::OpenMP_CXX) +target_link_libraries(Aurora_Test PUBLIC matio) target_link_libraries(Aurora_Test PUBLIC ${GTEST_BOTH_LIBRARIES} ) gtest_discover_tests(Aurora_Test ) #target_link_libraries(CreateMatchedFilter PRIVATE TBB::tbb) \ No newline at end of file diff --git a/src/MatlabReader.cpp b/src/MatlabReader.cpp new file mode 100644 index 0000000..14226b1 --- /dev/null +++ b/src/MatlabReader.cpp @@ -0,0 +1,100 @@ +#include "MatlabReader.h" + +#include + +double* calculateArray(matvar_t* aMatVar, const char* aFieldName) +{ + matvar_t* matVar = Mat_VarGetStructFieldByName(aMatVar,aFieldName,0); + double* data = reinterpret_cast(matVar->data); + unsigned long long dataLength = matVar->nbytes / static_cast(matVar->data_size); + double* result = new double[dataLength]; + std::copy(data,data+dataLength,result); + Mat_VarFree(matVar); + return result; +} + +MatlabReader::MatlabReader() +{ + +} + +bool MatlabReader::read(Input* aInput,MatchedFilter* aOutput,const std::string& aFilePath) +{ + mat_t* mat = Mat_Open(aFilePath.c_str(), MAT_ACC_RDONLY); + if(mat == nullptr) + { + return false; + } + + matvar_t* matvar = Mat_VarRead(mat,"input"); + if (matvar == nullptr) + { + return false; + } + + aInput->mCe = calculateArray(matvar,"ce"); + + matvar_t* measuredCEusedVar = Mat_VarGetStructFieldByName(matvar,"measuredCEused",0); + double* measuredCEused = reinterpret_cast(measuredCEusedVar->data); + aInput->mMeasuredCEused = *measuredCEused; + Mat_VarFree(measuredCEusedVar); + + matvar_t* removeOutliersFromCEMeasuredVar = Mat_VarGetStructFieldByName(matvar,"removeOutliersFromCEMeasured",0); + double* removeOutliersFromCEMeasured = reinterpret_cast(removeOutliersFromCEMeasuredVar->data); + aInput->mRemoveOutliersFromCEMeasured = *removeOutliersFromCEMeasured; + Mat_VarFree(removeOutliersFromCEMeasuredVar); + + matvar_t* hardwareVersionVar = Mat_VarGetStructFieldByName(matvar,"hardwareVersion",0); + char* hardwareVersion = reinterpret_cast(hardwareVersionVar->data); + aInput->mHardwareVersion = hardwareVersion; + Mat_VarFree(hardwareVersionVar); + + matvar_t* paramsVar = Mat_VarGetStructFieldByName(matvar,"params",0); + + aInput->mParams->mSenderTasList = calculateArray(paramsVar,"senderTasList"); + + aInput->mParams->mSenderElementList = calculateArray(paramsVar,"senderElementList"); + + aInput->mParams->mReceiverTasList = calculateArray(paramsVar,"receiverTasList");; + + aInput->mParams->mSenderElementList = calculateArray(paramsVar,"receiverElementList"); + + aInput->mParams->mMotorPos = calculateArray(paramsVar,"motorPos"); + + matvar_t* constrictReflectionAnglesVar = Mat_VarGetStructFieldByName(paramsVar,"constrictReflectionAngles",0); + aInput->mParams->mConstrictReflectionAngles = *reinterpret_cast(constrictReflectionAnglesVar->data); + Mat_VarFree(constrictReflectionAnglesVar); + + matvar_t* angleLowerLimitVar = Mat_VarGetStructFieldByName(paramsVar,"angleLowerLimit",0); + aInput->mParams->mAngleLowerLimit = *reinterpret_cast(angleLowerLimitVar->data); + Mat_VarFree(angleLowerLimitVar); + + matvar_t* angleUpperLimitVar = Mat_VarGetStructFieldByName(paramsVar,"angleUpperLimit",0); + aInput->mParams->mAngleUpperLimit = *reinterpret_cast(angleUpperLimitVar->data); + Mat_VarFree(angleUpperLimitVar); + + matvar_t* findDefectsVar = Mat_VarGetStructFieldByName(paramsVar,"findDefects",0); + aInput->mParams->mFindDefects = *reinterpret_cast(findDefectsVar->data); + Mat_VarFree(findDefectsVar); + + matvar_t* epsilonVar = Mat_VarGetStructFieldByName(paramsVar,"epsilon",0); + aInput->mParams->mEpsilon = *reinterpret_cast(epsilonVar->data); + Mat_VarFree(epsilonVar); + + matvar = Mat_VarRead(mat,"output"); + mat_complex_split_t* complexDouble = reinterpret_cast(matvar->data); + unsigned long long dataLength = matvar->nbytes / static_cast(matvar->data_size);; + double* real = reinterpret_cast(complexDouble->Re); + double* imag = reinterpret_cast(complexDouble->Im); + double* realData = new double[dataLength]; + double* imagData = new double[dataLength]; + std::copy(real,real+dataLength,realData); + std::copy(imag,imag+dataLength,imagData); + aOutput->mImag = imagData; + aOutput->mReal = realData; + + Mat_VarFree(matvar); + Mat_Close(mat); + + return true; +} diff --git a/src/MatlabReader.h b/src/MatlabReader.h new file mode 100644 index 0000000..de53170 --- /dev/null +++ b/src/MatlabReader.h @@ -0,0 +1,76 @@ +#ifndef MATLABREADER_H +#define MATLABREADER_H + +#include +#include + +class Params +{ +public: + Params(){} + + double* mSenderTasList; + double* mSenderElementList; + double* mReceiverTasList; + double* mReceiverElementList; + double* mMotorPos; + double mConstrictReflectionAngles; + double mAngleLowerLimit; + double mAngleUpperLimit; + double mFindDefects; + double mEpsilon; +}; + +class Input +{ +public: + Input():mParams(new Params()){} + ~Input(){delete mParams;} + Params* mParams; + double* mCe; + double mMeasuredCEused; + double mRemoveOutliersFromCEMeasured; + std::string mHardwareVersion; +}; + +class MatchedFilter +{ +public: + MatchedFilter(){}; + + double* mReal; + double* mImag; +}; + + +class MatlabReader +{ +public: + MatlabReader(); + bool read(Input* aInput,MatchedFilter* aOutput,const std::string& aFilePath); +}; + +class MatlabCreator +{ +public: + MatlabCreator(){}; + void createMat(const std::string& aFileName,size_t* aSize,int aRank,double* aRealData,double* aImageData) + { + mat_t* matfp = nullptr; + matfp = Mat_CreateVer(aFileName.c_str(),nullptr,MAT_FT_DEFAULT); + if ( nullptr == matfp ) + { + return; + } + mat_complex_split_t complexDouble; + complexDouble.Im = aImageData; + complexDouble.Re = aRealData; + matvar_t* measurementIdVar = Mat_VarCreate("output", MAT_C_DOUBLE,MAT_T_DOUBLE,aRank,aSize,&complexDouble,MAT_F_COMPLEX); + Mat_VarWrite(matfp,measurementIdVar,MAT_COMPRESSION_NONE); + Mat_VarFree(measurementIdVar); + Mat_Close(matfp); + return; + } +}; + +#endif // MATLABREADER_H