feat: Change estimate offset logic.

This commit is contained in:
sunwen
2025-03-14 17:58:10 +08:00
parent 3db427dc6b
commit 6460267889
7 changed files with 34 additions and 75 deletions

View File

@@ -56,6 +56,7 @@ MeasurementInfo Recon::loadMeasurementInfos(Parser* aParser)
result.rootMeasUniqueID = metaData.getMeasurementID();
result.dacDelay = metaData.getDacDelay();
result.filterByPass = metaData.getFilterByPass();
result.ceMeasuredDacDelay = metaData.getCEMeasuredDacDelay();
if(result.Bandpassundersampling)
{
result.expectedAScanLength = reflectParams::aScanReconstructionFrequency / result.sampleRate * result.expectedAScanLength;
@@ -238,6 +239,6 @@ CEInfo Recon::getCEInfo(Parser* aParser, const MeasurementInfo aInfo)
}
result.offsetFilterEnabled = reconParams::offsetFilterEnabled;
result.offsetFilterDisabled = reconParams::offsetFilterDisabled;
result.offsetTransducer = reconParams::offsetTransducer;
return result;
}

View File

@@ -21,6 +21,7 @@ namespace Recon
unsigned int expectedAScanLength;
std::string rootMeasUniqueID;
float dacDelay;
float ceMeasuredDacDelay;
float filterByPass;
Aurora::Matrix matchedFilter;
};
@@ -40,6 +41,7 @@ namespace Recon
bool ceAvailable;
float offsetFilterEnabled;
float offsetFilterDisabled;
float offsetTransducer;
};
struct TempInfo

View File

@@ -74,6 +74,10 @@ namespace Recon
{
reconParams::offsetFilterDisabled = ce.at("offsetFilterDisabled").get<float>();
}
if(ce.contains("offsetTransducer"))
{
reconParams::offsetTransducer = ce.at("offsetTransducer").get<float>();
}
}
if(measurementInfo.contains("temp"))
@@ -630,6 +634,7 @@ namespace Recon
reconParams::removeOutliersFromCEMeasured = true;
reconParams::offsetFilterEnabled = 6.9e-6;
reconParams::offsetFilterDisabled = 1.2e-6;
reconParams::offsetTransducer = 1.0e-6;
//reconParams.measurementInfo.temp
reconParams::useTASTempComp = true;
reconParams::correctTASTemp = 1;

View File

@@ -18,6 +18,7 @@ namespace Recon
EXTERN_C bool removeOutliersFromCEMeasured;
EXTERN_C float offsetFilterEnabled;
EXTERN_C float offsetFilterDisabled;
EXTERN_C float offsetTransducer;
//reconParams.measurementInfo.temp
EXTERN_C bool useTASTempComp;
EXTERN_C bool correctTASTemp;

View File

@@ -12,84 +12,33 @@
using namespace Recon;
using namespace Aurora;
float Recon::estimateOffset(const MeasurementInfo aExpInfo, const CEInfo& aCe, const Aurora::Matrix& aMatchedFilter)
float Recon::estimateOffset(const MeasurementInfo aExpInfo, const CEInfo& aCe)
{
float offset = 0;
Matrix ce = aCe.ceRef;
float ceOffSet = aCe.ceRefOffSet;
Matrix ceMeasured;
if(aCe.measuredCEAvailable)
float dacDelay = aExpInfo.dacDelay / reflectParams::aScanReconstructionFrequency;
float ceMeasuredDacDelay = aExpInfo.ceMeasuredDacDelay / reflectParams::aScanReconstructionFrequency;
float transducerDelay = aCe.offsetTransducer;
float configDelay = reflectParams::offsetElectronic;
float offset;
if(aCe.measuredCEUsed && aCe.measuredCEAvailable)
{
if(aCe.measuredCEUsed)
{
ceMeasured = real(ifft(aMatchedFilter));
}
else
{
ceMeasured = real(ifft(reviseMatchedFilter(aCe.ce, true)));
}
offset = dacDelay - ceMeasuredDacDelay + transducerDelay + configDelay;
}
offset = offset + reflectParams::offsetElectronic;
if(!aCe.measuredCEUsed)
else
{
if(aCe.measuredCEAvailable && aCe.ceAvailable)
float electronicDelay = 0;
switch ((int)aExpInfo.filterByPass)
{
size_t column = ceMeasured.getDimSize(1);
size_t ceRows = ce.getDimSize(0);
float* offsetCEMeasuredData = Aurora::malloc(column);
for(int i=0; i<column; ++i)
{
Matrix corrCE = xcorr(ceMeasured($,i).toMatrix(), ce);
long row,column;
max(corrCE, FunctionDirection::All,row,column);
offsetCEMeasuredData[i] = row + 1;
offsetCEMeasuredData[i] = offsetCEMeasuredData[i] - ceRows;
}
Matrix offsetCEMeasured = Matrix::New(offsetCEMeasuredData, column);
offset = offset + median(offsetCEMeasured)[0] / reflectParams::aScanReconstructionFrequency;
// 2代
// if strcmpi(info.Hardware,'USCT3Dv2')
// offset = offset - CEOffset;
// CEOffset = 0;
// end
}
else
{
float dacDelay = aExpInfo.dacDelay;
float filterDisabled = aExpInfo.filterByPass;
float dacDelayInS = dacDelay / 10000000;
if(filterDisabled == 1)
{
offset += aCe.offsetFilterDisabled + dacDelayInS;
}
else
{
offset += aCe.offsetFilterEnabled + dacDelayInS;
}
case 0:
electronicDelay = aCe.offsetFilterEnabled;
break;
case 1:
electronicDelay = aCe.offsetFilterDisabled;
break;
default:
break;
}
offset = dacDelay + electronicDelay + transducerDelay + configDelay;
}
//只对三代处理Digitalfilterdelay为0
// if (strcmp(info.Hardware,'USCT3Dv2')==1 && info.Bandpassundersampling==1) %%%3.3MHz Filter 208 Tabs
// Digitalfilterdelay=-(0.8e-6);
// %seconds
// elseif(strcmp(info.Hardware,'USCT3Dv2')==1) %%%%10 MHz 32 Tabs
// Digitalfilterdelay=-(4.67e-6 + 0.8e-6);
// %seconds
// elseif(strcmp(info.Hardware,'USCT3Dv3')==1)
float digitalfilterdelay = 0;
// else
// Digitalfilterdelay = 0;
// end
if (!aCe.measuredCEUsed)
{
offset += digitalfilterdelay;
offset += ceOffSet;
}
offset -= aExpInfo.EOffset;
return offset;
}

View File

@@ -3,9 +3,10 @@
#include "common/getMeasurementMetaData.h"
class Parser;
namespace Recon
{
float estimateOffset(const MeasurementInfo aExpInfo, const CEInfo& aCe, const Aurora::Matrix& aMatchedFilter);
float estimateOffset(const MeasurementInfo aExpInfo, const CEInfo& aCe);
}
#endif

View File

@@ -173,7 +173,7 @@ int Recon::startReconstructions( const std::string& aDataPath, const std::string
preComputes.measuredCEUsed = ce.measuredCEUsed;
preComputes.measuredCE_TASIndices = ce.tasIndices;
preComputes.measuredCE_receiverIndices = ce.receiverIndices;
preComputes.offset = estimateOffset(expInfo, ce, preComputes.matchedFilter);
preComputes.offset = estimateOffset(expInfo, ce);
expInfo.matchedFilter = preComputes.matchedFilter;
expInfoRef.matchedFilter = preComputes.matchedFilterRef;
@@ -240,7 +240,7 @@ int Recon::startReconstructions( const std::string& aDataPath, const std::string
preComputes.measuredCEUsed = ce.measuredCEUsed;
preComputes.measuredCE_TASIndices = ce.tasIndices;
preComputes.measuredCE_receiverIndices = ce.receiverIndices;
preComputes.offset = estimateOffset(expInfo, ce, preComputes.matchedFilter);
preComputes.offset = estimateOffset(expInfo, ce);
reflectParams::gpuSelectionList = reconParams::gpuSelectionList;
RECON_INFO("Start reflectionRecostruction.");