Fix detectTofAndAtt and main log time

This commit is contained in:
kradchen
2023-06-05 14:55:53 +08:00
parent 90fd2afe7c
commit 15cfc29e6f
3 changed files with 114 additions and 24 deletions

View File

@@ -151,7 +151,7 @@ namespace Recon {
for (size_t i = 0; i < Ascan.getDimSize(1); i++)
{
startPos[i] = std::floor(std::max(tof[i]*sampleRate+offsetElectronicSamples,1.0));
endPos[i] = std::ceil(std::min(sizeAscan[1], tof[i]*sampleRate+offsetElectronicSamples+detectionWindowATT));
endPos[i] = std::ceil(std::min(sizeAscan[0], tof[i]*sampleRate+offsetElectronicSamples+detectionWindowATT));
startPosRef[i] = std::floor(std::max( tof2[i],1.0));
endPosRef[i] = std::ceil(std::min(sizeAscan[1], tof2[i]+detectionWindowATT));
}
@@ -194,7 +194,7 @@ namespace Recon {
expectedSOSWater, offsetElectronicSamples, detectionWindowSOS,
minSpeedOfSound, maxSpeedOfSound, gaussWindow);
diffStartSearch = timeResult1.startSearch - timeResult1.startSearch;
diffStartSearch = timeResult1.startSearch - timeResult2.startSearch;
}
auto _AscanBlock = timeResult1.AscanBlockProcessed;
auto _AscanRefBlock = timeResult2.AscanBlockProcessed;
@@ -213,15 +213,17 @@ namespace Recon {
auto c1 = real(c_1_2);
auto c = zeros(mxl + mxl + 1, c1.getDimSize(1));
#pragma omp parallel for
for (size_t i = 0; i < mxl; i++) {
c(i, $) = c1(m2 - mxl + i, $);
c(i + mxl, $) = c1(i, $);
}
c(mxl + mxl, $) = c1(mxl, $);
c.setBlock(0, 0, mxl-1, c1.block(0, m2-mxl,m2-1));
c.setBlock(0, mxl, mxl*2, c1.block(0, 0, mxl));
// #pragma omp parallel for
// for (size_t i = 0; i < mxl; i++) {
// c(i, $) = c1(m2 - mxl + i, $);
// c(i + mxl, $) = c1(i, $);
// }
// c(mxl + mxl, $) = c1(mxl, $);
auto shiftInSamples = zeros(1, c1.getDimSize(1));
#pragma omp parallel for
// #pragma omp parallel for
for (size_t i = 0; i < c1.getDimSize(1); i++) {
long rowID = 0, colID = 0;
max(c($, i).toMatrix(), All, rowID, colID);
@@ -248,15 +250,69 @@ namespace Recon {
double offsetElectronic, int detectionWindowSOS, double minSpeedOfSound,
double maxSpeedOfSound, bool gaussWindow)
{
auto result = detectTofVectorized(
AscanBlock, AscanRefBlock, distBlock, distRefBlock, sosWaterBlock,
sosWaterRefBlock, expectedSOSWater, useTimeWindowing,
aScanReconstructionFrequency, offsetElectronic, detectionWindowSOS,
minSpeedOfSound, maxSpeedOfSound, gaussWindow);
auto tofRel = result.tof - distBlock / sosWaterBlock;
auto sampleRate = aScanReconstructionFrequency;
double 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;
auto m = std::max(size(_AscanBlock, 1), size(_AscanRefBlock, 1));
auto maxlag =
std::max(size(_AscanBlock, 1), size(_AscanRefBlock, 1)) - 1;
auto mxl = std::min(maxlag, m - 1);
auto ceilLog2 = nextpow2(2 * m - 1);
auto m2 = pow(2, ceilLog2);
auto x = fft(_AscanBlock, m2);
auto y = fft(_AscanRefBlock, m2);
auto c_1_1 = x * conj(y);
auto c_1_2 = ifft(c_1_1);
auto c1 = real(c_1_2);
auto c = zeros(mxl + mxl + 1, c1.getDimSize(1));
c.setBlock(0, 0, mxl-1, c1.block(0, m2-mxl,m2-1));
c.setBlock(0, mxl, mxl*2, c1.block(0, 0, mxl));
// #pragma omp parallel for
// for (size_t i = 0; i < mxl; i++) {
// c(i, $) = c1(m2 - mxl + i, $);
// c(i + mxl, $) = c1(i, $);
// }
// c(mxl + mxl, $) = c1(mxl, $);
auto shiftInSamples = zeros(1, c1.getDimSize(1));
#pragma omp parallel for
for (size_t i = 0; i < c1.getDimSize(1); i++) {
long rowID = 0, colID = 0;
max(c($, i).toMatrix(), All, rowID, colID);
shiftInSamples[i] = -maxlag + colID + rowID;
}
if (useTimeWindowing) {
shiftInSamples = shiftInSamples - diffStartSearch;
}
auto tof = shiftInSamples / sampleRate + distBlock / sosWaterBlock;
auto sosValue = distBlock / tof;
DetectResult result;
result.sosValue = sosValue;
auto tofRel = tof - distBlock / sosWaterBlock;
result.att = detectAttVectorized(
AscanBlock, AscanRefBlock, distRefBlock, sosWaterRefBlock,
result.tof, aScanReconstructionFrequency, offsetElectronic,
_AscanBlock, _AscanRefBlock, distRefBlock, sosWaterRefBlock,
tof, aScanReconstructionFrequency, offsetElectronic,
detectionWindowATT);
result.tof = tofRel;
return result;