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