feat: Remove redudent TransDetection lib

This commit is contained in:
kradchen
2024-12-19 10:39:49 +08:00
parent cd8fd76846
commit e475edd243
4 changed files with 120 additions and 153 deletions

View File

@@ -33,8 +33,6 @@ target_link_libraries(UR PUBLIC dcmdata)
target_link_libraries(UR PUBLIC matio) target_link_libraries(UR PUBLIC matio)
target_link_libraries(UR PUBLIC Parser) target_link_libraries(UR PUBLIC Parser)
target_link_libraries(UR PUBLIC URDepends::TransDetection)
# target_link_libraries(UR PUBLIC URDepends::eikonal)
target_link_libraries(UR PUBLIC URDepends::TVALGPU) target_link_libraries(UR PUBLIC URDepends::TVALGPU)
target_link_libraries(UR PUBLIC URDepends::SaftTofi) target_link_libraries(UR PUBLIC URDepends::SaftTofi)
target_link_libraries(UR PUBLIC dcmdata) target_link_libraries(UR PUBLIC dcmdata)
@@ -75,11 +73,10 @@ target_link_libraries(UR_Test PUBLIC dcmdata)
target_link_libraries(UR_Test PUBLIC matio) target_link_libraries(UR_Test PUBLIC matio)
# target_link_libraries(UR_Test PUBLIC ${Parser_Libraries}) # target_link_libraries(UR_Test PUBLIC ${Parser_Libraries})
target_link_libraries(UR_Test PUBLIC Parser) target_link_libraries(UR_Test PUBLIC Parser)
target_link_libraries(UR_Test PUBLIC URDepends::TransDetection)
# target_link_libraries(UR_Test PUBLIC URDepends::eikonal)
target_link_libraries(UR_Test PUBLIC URDepends::TVALGPU) target_link_libraries(UR_Test PUBLIC URDepends::TVALGPU)
target_link_libraries(UR_Test PUBLIC URDepends::SaftTofi) target_link_libraries(UR_Test PUBLIC URDepends::SaftTofi)
# target_link_libraries(UR_Test PUBLIC URDepends::SaftATT)
target_include_directories(UR_Test PRIVATE ./src /usr/local/cuda/include) target_include_directories(UR_Test PRIVATE ./src /usr/local/cuda/include)
set_target_properties(UR_Test PROPERTIES CUDA_SEPARABLE_COMPILATION ON) set_target_properties(UR_Test PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

View File

@@ -12,7 +12,10 @@
#include "common/getMeasurementMetaData.h" #include "common/getMeasurementMetaData.h"
#include "config/config.h" #include "config/config.h"
#include "calculateBankDetectAndHilbertTransformation.hpp"
//remove detectTofAndAttMex function, use detectTofAndAtt function instead of
//保留函数和函数申明备忘以防以后再次使用以下头文件从动态库中映入了detectTofAndAttMex的核心函数
// #include "calculateBankDetectAndHilbertTransformation.hpp"
using namespace Aurora; using namespace Aurora;
namespace Recon { namespace Recon {
@@ -318,101 +321,103 @@ namespace Recon {
return result; return result;
} }
DetectResult detectTofAndAttMex( //remove detectTofAndAttMex function, use detectTofAndAtt function instead of
const Aurora::Matrix &AscanBlock, const Aurora::Matrix &AscanRefBlock, //保留函数和函数申明备忘,以防以后再次使用
const Aurora::Matrix &distBlock, const Aurora::Matrix &distRefBlock, // DetectResult detectTofAndAttMex(
const Aurora::Matrix &sosWaterBlock, // const Aurora::Matrix &AscanBlock, const Aurora::Matrix &AscanRefBlock,
const Aurora::Matrix &sosWaterRefBlock, // const Aurora::Matrix &distBlock, const Aurora::Matrix &distRefBlock,
int resampleFactor,int nthreads, float expectedSOSWater, // const Aurora::Matrix &sosWaterBlock,
int useTimeWindowing, int aScanReconstructionFrequency,int detectionWindowATT, // const Aurora::Matrix &sosWaterRefBlock,
float offsetElectronic, int detectionWindowSOS, float minSpeedOfSound, // int resampleFactor,int nthreads, float expectedSOSWater,
float maxSpeedOfSound, bool gaussWindow) // int useTimeWindowing, int aScanReconstructionFrequency,int detectionWindowATT,
{ // float offsetElectronic, int detectionWindowSOS, float minSpeedOfSound,
// float maxSpeedOfSound, bool gaussWindow)
// {
auto sizeAscan = size(AscanBlock); // auto sizeAscan = size(AscanBlock);
auto sampleRate = aScanReconstructionFrequency; // auto sampleRate = aScanReconstructionFrequency;
float offsetElectronicSamples = offsetElectronic * sampleRate; // float offsetElectronicSamples = offsetElectronic * sampleRate;
Matrix diffStartSearch; // Matrix diffStartSearch;
TimeWindowResult timeResult1; // TimeWindowResult timeResult1;
timeResult1.AscanBlockProcessed = AscanBlock; // timeResult1.AscanBlockProcessed = AscanBlock;
TimeWindowResult timeResult2; // TimeWindowResult timeResult2;
timeResult2.AscanBlockProcessed = AscanRefBlock; // timeResult2.AscanBlockProcessed = AscanRefBlock;
if (useTimeWindowing == 1) { // if (useTimeWindowing == 1) {
timeResult1 = applyTimeWindowing( // timeResult1 = applyTimeWindowing(
AscanBlock, sampleRate, distBlock, sosWaterBlock, // AscanBlock, sampleRate, distBlock, sosWaterBlock,
expectedSOSWater, offsetElectronicSamples, detectionWindowSOS, // expectedSOSWater, offsetElectronicSamples, detectionWindowSOS,
minSpeedOfSound, maxSpeedOfSound, gaussWindow); // minSpeedOfSound, maxSpeedOfSound, gaussWindow);
timeResult2 = applyTimeWindowing( // timeResult2 = applyTimeWindowing(
AscanRefBlock, sampleRate, distRefBlock, sosWaterRefBlock, // AscanRefBlock, sampleRate, distRefBlock, sosWaterRefBlock,
expectedSOSWater, offsetElectronicSamples, detectionWindowSOS, // expectedSOSWater, offsetElectronicSamples, detectionWindowSOS,
minSpeedOfSound, maxSpeedOfSound, gaussWindow); // minSpeedOfSound, maxSpeedOfSound, gaussWindow);
diffStartSearch = timeResult1.startSearch - timeResult2.startSearch; // diffStartSearch = timeResult1.startSearch - timeResult2.startSearch;
} // }
auto _AscanBlock = timeResult1.AscanBlockProcessed; // auto _AscanBlock = timeResult1.AscanBlockProcessed;
auto _AscanRefBlock = timeResult2.AscanBlockProcessed; // auto _AscanRefBlock = timeResult2.AscanBlockProcessed;
int M =std::min(AscanBlock.getDimSize(0),AscanRefBlock.getDimSize(0)); // int M =std::min(AscanBlock.getDimSize(0),AscanRefBlock.getDimSize(0));
Matrix resDetect; // Matrix resDetect;
float * resEnvelopeD = nullptr; // float * resEnvelopeD = nullptr;
float * resEnvelopeRefD = nullptr; // float * resEnvelopeRefD = nullptr;
size_t N = _AscanBlock.getDimSize(1); // size_t N = _AscanBlock.getDimSize(1);
size_t totalSize = N*M; // size_t totalSize = N*M;
Matrix _AscanBlock_trim = _AscanBlock.getDimSize(0)!=M?_AscanBlock.block(0, 0, M-1):_AscanBlock; // Matrix _AscanBlock_trim = _AscanBlock.getDimSize(0)!=M?_AscanBlock.block(0, 0, M-1):_AscanBlock;
Matrix _AscanRefBlock_trim = _AscanRefBlock.getDimSize(0)!=M?_AscanRefBlock.block(0, 0, M-1):_AscanRefBlock; // Matrix _AscanRefBlock_trim = _AscanRefBlock.getDimSize(0)!=M?_AscanRefBlock.block(0, 0, M-1):_AscanRefBlock;
resDetect = Aurora::zeros(1,N); // resDetect = Aurora::zeros(1,N);
resEnvelopeD = Aurora::malloc(totalSize); // resEnvelopeD = Aurora::malloc(totalSize);
resEnvelopeRefD = Aurora::malloc(totalSize); // resEnvelopeRefD = Aurora::malloc(totalSize);
calculateBankDetectAndHilbertTransformation( // calculateBankDetectAndHilbertTransformation(
_AscanBlock_trim.getData(), _AscanRefBlock_trim.getData(), N, M, resampleFactor, nthreads, // _AscanBlock_trim.getData(), _AscanRefBlock_trim.getData(), N, M, resampleFactor, nthreads,
resDetect.getData(), resEnvelopeD, resEnvelopeRefD); // resDetect.getData(), resEnvelopeD, resEnvelopeRefD);
auto resEnvelope =Matrix::New(resEnvelopeD,M,N); // auto resEnvelope =Matrix::New(resEnvelopeD,M,N);
auto resEnvelopeRef =Matrix::New(resEnvelopeRefD,M,N); // auto resEnvelopeRef =Matrix::New(resEnvelopeRefD,M,N);
//floor(size(AscanBlock, 1)*inits.resampleFactor / 2 - 1), // //floor(size(AscanBlock, 1)*inits.resampleFactor / 2 - 1),
int end_1 = std::floor(_AscanBlock.getDimSize(0)*resampleFactor/2-1); // int end_1 = std::floor(_AscanBlock.getDimSize(0)*resampleFactor/2-1);
//-ceil(size(AscanBlock, 1)*inits.resampleFactor / 2) // //-ceil(size(AscanBlock, 1)*inits.resampleFactor / 2)
int begin_2 = -std::ceil(_AscanBlock.getDimSize(0)*resampleFactor/2); // int begin_2 = -std::ceil(_AscanBlock.getDimSize(0)*resampleFactor/2);
int *lags2 = new int[_AscanBlock.getDimSize(0)]; // int *lags2 = new int[_AscanBlock.getDimSize(0)];
for (size_t i = 0; i <= end_1; i++) // for (size_t i = 0; i <= end_1; i++)
{ // {
lags2[i] = i; // lags2[i] = i;
lags2[i+end_1+1] = begin_2+i; // lags2[i+end_1+1] = begin_2+i;
} // }
auto resDetectLags = zeros(1,_AscanBlock.getDimSize(1)); // auto resDetectLags = zeros(1,_AscanBlock.getDimSize(1));
for (size_t i = 0; i < _AscanBlock.getDimSize(1); i++) // for (size_t i = 0; i < _AscanBlock.getDimSize(1); i++)
{ // {
resDetectLags[i] = lags2[(int)resDetect[i]]; // resDetectLags[i] = lags2[(int)resDetect[i]];
} // }
delete [] lags2; // delete [] lags2;
resDetectLags =resDetectLags/resampleFactor; // resDetectLags =resDetectLags/resampleFactor;
if (useTimeWindowing == 1) { // if (useTimeWindowing == 1) {
resDetectLags = resDetectLags - diffStartSearch; // resDetectLags = resDetectLags - diffStartSearch;
} // }
auto tofRel = (resDetectLags / sampleRate); // auto tofRel = (resDetectLags / sampleRate);
auto tofAbs = tofRel + (distBlock / sosWaterBlock); // auto tofAbs = tofRel + (distBlock / sosWaterBlock);
auto sosValue = distBlock / tofAbs; // auto sosValue = distBlock / tofAbs;
auto tof2 = (distRefBlock / sosWaterRefBlock) * sampleRate + offsetElectronicSamples; // auto tof2 = (distRefBlock / sosWaterRefBlock) * sampleRate + offsetElectronicSamples;
auto startPos = zeros(_AscanBlock.getDimSize(1), 1); // auto startPos = zeros(_AscanBlock.getDimSize(1), 1);
auto endPos = zeros(_AscanBlock.getDimSize(1), 1); // auto endPos = zeros(_AscanBlock.getDimSize(1), 1);
auto startPosRef = zeros(_AscanBlock.getDimSize(1), 1); // auto startPosRef = zeros(_AscanBlock.getDimSize(1), 1);
auto endPosRef = zeros(_AscanBlock.getDimSize(1), 1); // auto endPosRef = zeros(_AscanBlock.getDimSize(1), 1);
#pragma omp parallel for // #pragma omp parallel for
for (size_t i = 0; i < _AscanBlock.getDimSize(1); i++) // for (size_t i = 0; i < _AscanBlock.getDimSize(1); i++)
{ // {
startPos[i] = std::floor(std::max(tofAbs[i]*sampleRate+offsetElectronicSamples,(float)1.0)); // startPos[i] = std::floor(std::max(tofAbs[i]*sampleRate+offsetElectronicSamples,(float)1.0));
endPos[i] = std::ceil(std::min(sizeAscan[0], tofAbs[i]*sampleRate+offsetElectronicSamples+detectionWindowATT)); // endPos[i] = std::ceil(std::min(sizeAscan[0], tofAbs[i]*sampleRate+offsetElectronicSamples+detectionWindowATT));
startPosRef[i] = std::floor(std::max( tof2[i],(float)1.0)); // startPosRef[i] = std::floor(std::max( tof2[i],(float)1.0));
endPosRef[i] = std::ceil(std::min(sizeAscan[0], tof2[i]+detectionWindowATT)); // endPosRef[i] = std::ceil(std::min(sizeAscan[0], tof2[i]+detectionWindowATT));
} // }
DetectResult result; // DetectResult result;
result.att = calculateAttenuation(resEnvelope,startPos,endPos,resEnvelopeRef,startPosRef,endPosRef); // result.att = calculateAttenuation(resEnvelope,startPos,endPos,resEnvelopeRef,startPosRef,endPosRef);
result.tof = tofRel; // result.tof = tofRel;
result.sosValue = sosValue; // result.sosValue = sosValue;
return result; // return result;
} // }
DetectResult transmissionDetection(const Aurora::Matrix &AscanBlock, DetectResult transmissionDetection(const Aurora::Matrix &AscanBlock,
const Aurora::Matrix &AscanRefBlock, const Aurora::Matrix &AscanRefBlock,
@@ -424,16 +429,18 @@ namespace Recon {
auto _sosWaterBlock = temperatureToSoundSpeed(sosWaterBlock, "marczak"); auto _sosWaterBlock = temperatureToSoundSpeed(sosWaterBlock, "marczak");
auto _sosWaterRefBlock = temperatureToSoundSpeed(sosWaterRefBlock, "marczak"); auto _sosWaterRefBlock = temperatureToSoundSpeed(sosWaterRefBlock, "marczak");
switch (Recon::transParams::version) { switch (Recon::transParams::version) {
case 1: { //remove detectTofAndAttMex function, use detectTofAndAtt function instead of
return detectTofAndAttMex( //保留函数和函数申明备忘,以防以后再次使用
AscanBlock, AscanRefBlock, distBlock, distRefBlock, // case 1: {
_sosWaterBlock, _sosWaterRefBlock, Recon::transParams::resampleFactor, Recon::transParams::nThreads, // return detectTofAndAttMex(
expectedSOSWater, Recon::transParams::useTimeWindowing, // AscanBlock, AscanRefBlock, distBlock, distRefBlock,
Recon::transParams::aScanReconstructionFrequency, Recon::transParams::detectionWindowATT, // _sosWaterBlock, _sosWaterRefBlock, Recon::transParams::resampleFactor, Recon::transParams::nThreads,
Recon::transParams::offsetElectronic, Recon::transParams::detectionWindowSOS, Recon::transParams::minSpeedOfSound, // expectedSOSWater, Recon::transParams::useTimeWindowing,
Recon::transParams::maxSpeedOfSound, Recon::transParams::gaussWindow); // Recon::transParams::aScanReconstructionFrequency, Recon::transParams::detectionWindowATT,
} // Recon::transParams::offsetElectronic, Recon::transParams::detectionWindowSOS, Recon::transParams::minSpeedOfSound,
case 2: // Recon::transParams::maxSpeedOfSound, Recon::transParams::gaussWindow);
// }
// case 2:
default: default:
return detectTofAndAtt( return detectTofAndAtt(
AscanBlock, AscanRefBlock, distBlock, distRefBlock, AscanBlock, AscanRefBlock, distBlock, distRefBlock,

View File

@@ -63,15 +63,17 @@ detectTofAndAtt(
int detectionWindowATT, float offsetElectronic, int detectionWindowSOS, int detectionWindowATT, float offsetElectronic, int detectionWindowSOS,
float minSpeedOfSound, float maxSpeedOfSound, bool gaussWindow); float minSpeedOfSound, float maxSpeedOfSound, bool gaussWindow);
DetectResult //remove detectTofAndAttMex function, use detectTofAndAtt function instead of
detectTofAndAttMex( //保留函数和函数申明备忘,以防以后再次使用
const Aurora::Matrix &AscanBlock, const Aurora::Matrix &AscanRefBlock, // DetectResult
const Aurora::Matrix &distBlock, const Aurora::Matrix &distBlockRef, // detectTofAndAttMex(
const Aurora::Matrix &sosWaterBlock, const Aurora::Matrix &sosWaterRefBlock, // const Aurora::Matrix &AscanBlock, const Aurora::Matrix &AscanRefBlock,
int resampleFactor, int nthreads, float expectedSOSWater, // const Aurora::Matrix &distBlock, const Aurora::Matrix &distBlockRef,
int useTimeWindowing, int aScanReconstructionFrequency, // const Aurora::Matrix &sosWaterBlock, const Aurora::Matrix &sosWaterRefBlock,
int detectionWindowATT, float offsetElectronic, int detectionWindowSOS, // int resampleFactor, int nthreads, float expectedSOSWater,
float minSpeedOfSound, float maxSpeedOfSound, bool gaussWindow); // int useTimeWindowing, int aScanReconstructionFrequency,
// int detectionWindowATT, float offsetElectronic, int detectionWindowSOS,
// float minSpeedOfSound, float maxSpeedOfSound, bool gaussWindow);
DetectResult DetectResult
transmissionDetection( transmissionDetection(

View File

@@ -38,45 +38,6 @@ protected:
} }
}; };
TEST_F(Detection_Test, detectTofAndAttMex) {
MatlabReader m("/home/sun/testData/transmissionDetection.mat");
auto AscanBlock = m.read("AscanBlock");
auto AscanRefBlock = m.read("AscanRefBlock");
auto distBlock = m.read("dists");
auto distBlockRef = m.read("distRefBlock");
auto sosWaterBlock = Recon::temperatureToSoundSpeed(m.read("waterTempBlock"),"marczak");
auto sosWaterRefBlock = Recon::temperatureToSoundSpeed(m.read("waterTempRefBlock"),"marczak");
float expectedSOSWater = 1.512677498767504e+03;
auto result = Recon::detectTofAndAttMex(
AscanBlock, AscanRefBlock, distBlock, distBlockRef, sosWaterBlock,
sosWaterRefBlock, Recon::transParams::resampleFactor,
Recon::transParams::nThreads, expectedSOSWater,
Recon::transParams::useTimeWindowing,
Recon::transParams::aScanReconstructionFrequency,
Recon::transParams::detectionWindowATT,Recon::transParams::offsetElectronic,
Recon::transParams::detectionWindowSOS,
Recon::transParams::minSpeedOfSound,
Recon::transParams::maxSpeedOfSound, Recon::transParams::gaussWindow);
MatlabReader m3("/home/krad/TestData/sosResult.mat");
auto sosvalue = m3.read("sosValue");
auto tof = m3.read("tofRel");
ASSERT_EQ(sosvalue.getDataSize(), result.tof.getDataSize());
ASSERT_EQ(sosvalue.getDataSize(), result.sosValue.getDataSize());
ASSERT_EQ(sosvalue.getDataSize(), result.att.getDataSize());
#pragma omp parallel for
for (size_t i = 0; i < result.tof.getDataSize(); i++)
{
EXPECT_DOUBLE_AE(tof[i],result.tof[i])<<",index:"<<i;
EXPECT_DOUBLE_AE(sosvalue[i],result.sosValue[i])<<",index:"<<i;
// EXPECT_TRUE(result.att[i]==0)<<",index:"<<i;
}
}
TEST_F(Detection_Test, detectTofAndAtt) { TEST_F(Detection_Test, detectTofAndAtt) {
MatlabReader m("/home/sun/testData/transmissionDetection.mat"); MatlabReader m("/home/sun/testData/transmissionDetection.mat");