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.rootMeasUniqueID = metaData.getMeasurementID();
result.dacDelay = metaData.getDacDelay(); result.dacDelay = metaData.getDacDelay();
result.filterByPass = metaData.getFilterByPass(); result.filterByPass = metaData.getFilterByPass();
result.ceMeasuredDacDelay = metaData.getCEMeasuredDacDelay();
if(result.Bandpassundersampling) if(result.Bandpassundersampling)
{ {
result.expectedAScanLength = reflectParams::aScanReconstructionFrequency / result.sampleRate * result.expectedAScanLength; 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.offsetFilterEnabled = reconParams::offsetFilterEnabled;
result.offsetFilterDisabled = reconParams::offsetFilterDisabled; result.offsetFilterDisabled = reconParams::offsetFilterDisabled;
result.offsetTransducer = reconParams::offsetTransducer;
return result; return result;
} }

View File

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

View File

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

View File

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

View File

@@ -12,84 +12,33 @@
using namespace Recon; using namespace Recon;
using namespace Aurora; 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; float dacDelay = aExpInfo.dacDelay / reflectParams::aScanReconstructionFrequency;
Matrix ce = aCe.ceRef; float ceMeasuredDacDelay = aExpInfo.ceMeasuredDacDelay / reflectParams::aScanReconstructionFrequency;
float ceOffSet = aCe.ceRefOffSet; float transducerDelay = aCe.offsetTransducer;
Matrix ceMeasured; float configDelay = reflectParams::offsetElectronic;
if(aCe.measuredCEAvailable) float offset;
if(aCe.measuredCEUsed && aCe.measuredCEAvailable)
{ {
if(aCe.measuredCEUsed) offset = dacDelay - ceMeasuredDacDelay + transducerDelay + configDelay;
{
ceMeasured = real(ifft(aMatchedFilter));
}
else
{
ceMeasured = real(ifft(reviseMatchedFilter(aCe.ce, true)));
}
} }
else
offset = offset + reflectParams::offsetElectronic;
if(!aCe.measuredCEUsed)
{ {
if(aCe.measuredCEAvailable && aCe.ceAvailable) float electronicDelay = 0;
switch ((int)aExpInfo.filterByPass)
{ {
size_t column = ceMeasured.getDimSize(1); case 0:
size_t ceRows = ce.getDimSize(0); electronicDelay = aCe.offsetFilterEnabled;
float* offsetCEMeasuredData = Aurora::malloc(column); break;
for(int i=0; i<column; ++i) case 1:
{ electronicDelay = aCe.offsetFilterDisabled;
Matrix corrCE = xcorr(ceMeasured($,i).toMatrix(), ce); break;
long row,column; default:
max(corrCE, FunctionDirection::All,row,column); break;
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;
}
} }
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; return offset;
} }

View File

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

View File

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