Add TransmissionReconstruction Datafilter.
This commit is contained in:
132
src/transmissionReconstruction/dataFilter/dataFilter.cpp
Normal file
132
src/transmissionReconstruction/dataFilter/dataFilter.cpp
Normal file
@@ -0,0 +1,132 @@
|
||||
#include "dataFilter.h"
|
||||
|
||||
#include <cmath>
|
||||
#include <cstddef>
|
||||
#include <iostream>
|
||||
|
||||
#include "Function.h"
|
||||
#include "Function1D.h"
|
||||
#include "Function2D.h"
|
||||
#include "Function3D.h"
|
||||
#include "Matrix.h"
|
||||
|
||||
using namespace Aurora;
|
||||
namespace Recon {
|
||||
Aurora::Matrix calculateSnr(const Aurora::Matrix &aMDataBlock,
|
||||
double aReferenceNoise) {
|
||||
auto maxSignal = max(abs(aMDataBlock));
|
||||
auto snrBlock = 10 * log(maxSignal / aReferenceNoise, 10);
|
||||
return snrBlock;
|
||||
}
|
||||
|
||||
Aurora::Matrix filterTransmissionSensitivityMap(
|
||||
double sensFilter, const Aurora::Matrix &aVslBlock,
|
||||
const Aurora::Matrix &aVsnBlock, const Aurora::Matrix &aVrlBlock,
|
||||
const Aurora::Matrix &aVrnBlock, std::vector<Aurora::Matrix> &aMSensData) {
|
||||
if (aMSensData.empty()) {
|
||||
std::cerr << "aMSensData cant be empty!!!" << std::endl;
|
||||
return Aurora::Matrix();
|
||||
}
|
||||
auto aMSensData0 = aMSensData[0];
|
||||
auto size = zeros(4, 1, 1);
|
||||
size.getData()[0] = aMSensData0.getDimSize(0);
|
||||
size.getData()[1] = aMSensData0.getDimSize(1);
|
||||
size.getData()[2] = aMSensData0.getDimSize(2);
|
||||
size.getData()[3] = aMSensData.size();
|
||||
auto idx = sub2ind(size, {aVrnBlock, aVrlBlock, aVsnBlock, aVslBlock});
|
||||
auto transData = zeros(idx.getDataSize(), 1, 1);
|
||||
for (size_t i = 0; i < idx.getDataSize(); i++) {
|
||||
auto index = (size_t)(idx.getData()[i] - 1);
|
||||
auto sliceIndex = index / aMSensData0.getDataSize();
|
||||
transData.getData()[i] =
|
||||
(aMSensData[sliceIndex].getData()[index] >= sensFilter ? 1.0 : 0.0);
|
||||
}
|
||||
return transData;
|
||||
}
|
||||
|
||||
Aurora::Matrix
|
||||
filterTransmissionAngle(double aAngleLowerLimit, double aAngleUpperLimit,
|
||||
const Aurora::Matrix &aMSenderNormalBlock,
|
||||
const Aurora::Matrix &aMReceiverNormalBlock) {
|
||||
// dot(senderNormalBlock, receiverNormalBlock,
|
||||
// 1))./(vecnorm(senderNormalBlock, 2, 1) .* vecnorm(receiverNormalBlock, 2,
|
||||
// 1)
|
||||
auto transData = ones(1, aMSenderNormalBlock.getDimSize(1));
|
||||
auto inbetweenAngle = acosd(dot(aMSenderNormalBlock, aMReceiverNormalBlock) /
|
||||
(vecnorm(aMSenderNormalBlock, Norm2, 1) *
|
||||
vecnorm(aMReceiverNormalBlock, Norm2, 1)));
|
||||
for (size_t i = 0; i < transData.getDataSize(); i++)
|
||||
{
|
||||
transData.getData()[i] = (inbetweenAngle.getData()[i]<aAngleLowerLimit || inbetweenAngle.getData()[i] > aAngleUpperLimit)?0.0:1.0;
|
||||
}
|
||||
return transData;
|
||||
}
|
||||
|
||||
Aurora::Matrix checkTofDetections(Aurora::Matrix &aVTofValues, const Aurora::Matrix &aVDists,
|
||||
const Aurora::Matrix &aVSosRef,
|
||||
double minSpeedOfSound,
|
||||
double maxSpeedOfSound)
|
||||
{
|
||||
auto sosValues = aVDists / (aVTofValues + (aVDists / aVSosRef));
|
||||
|
||||
auto valid = (sosValues < maxSpeedOfSound) * (sosValues > minSpeedOfSound);
|
||||
auto minSpeedOfSoundM = minSpeedOfSound+ zeros(sosValues.getDimSize(0),sosValues.getDimSize(1),sosValues.getDimSize(2));
|
||||
auto maxSpeedOfSoundM = maxSpeedOfSound+zeros(sosValues.getDimSize(0),sosValues.getDimSize(1),sosValues.getDimSize(2));
|
||||
sosValues = max(minSpeedOfSoundM, sosValues);
|
||||
sosValues = min(maxSpeedOfSoundM, sosValues);
|
||||
|
||||
aVTofValues = (aVDists / sosValues) - (aVDists / aVSosRef);
|
||||
return sosValues;
|
||||
}
|
||||
|
||||
Aurora::Matrix filterTransmissionData(int aFilterSensitivity, const Aurora::Matrix &aVslBlock,
|
||||
const Aurora::Matrix &aVsnBlock, const Aurora::Matrix &aVrlBlock,
|
||||
const Aurora::Matrix &aVrnBlock, std::vector<Aurora::Matrix> &aMSensData,
|
||||
const Aurora::Matrix &aMSenderNormalBlock,
|
||||
const Aurora::Matrix &aMReceiverNormalBlock,
|
||||
double* params)
|
||||
{
|
||||
switch (aFilterSensitivity) {
|
||||
case 1:
|
||||
return filterTransmissionSensitivityMap(params[0], aVslBlock, aVsnBlock, aVrlBlock, aVrnBlock, aMSensData);
|
||||
case 2:
|
||||
return filterTransmissionAngle(params[0], params[1], aMSenderNormalBlock, aMReceiverNormalBlock);
|
||||
}
|
||||
std::cerr<<"FilterSensitivity value error!"<<std::endl;
|
||||
return Aurora::Matrix();
|
||||
}
|
||||
|
||||
Aurora::Matrix findDefectTransmissionData(const Aurora::Matrix &aVSNRList,double aSNRDifference)
|
||||
{
|
||||
auto valid = auroraNot(Aurora::isnan(aVSNRList));
|
||||
double meanSNR = 0.0;
|
||||
|
||||
auto finite_SNRList = Aurora::isfinite(aVSNRList);
|
||||
int count = (int)sum(finite_SNRList).getScalar();
|
||||
double* std_SNRListData = Aurora::malloc(count);
|
||||
int j = 0;
|
||||
for (size_t i = 0; i < aVSNRList.getDataSize(); i++)
|
||||
{
|
||||
if (finite_SNRList.getData()[i] == 1.0){
|
||||
meanSNR+=aVSNRList[i];
|
||||
std_SNRListData[j++] = aVSNRList[i];
|
||||
}
|
||||
}
|
||||
Aurora::Matrix std_SNRList = Aurora::Matrix::New(std_SNRListData,count,1,1);
|
||||
std_SNRList = Aurora::std(std_SNRList);
|
||||
double localSNRDifference = 2 * std_SNRList.getScalar();
|
||||
aSNRDifference = localSNRDifference < aSNRDifference?localSNRDifference:aSNRDifference;
|
||||
double sub = meanSNR - aSNRDifference;
|
||||
double add = meanSNR + aSNRDifference;
|
||||
for (size_t i = 0; i < aVSNRList.getDataSize(); i++)
|
||||
{
|
||||
double value = aVSNRList[i];
|
||||
if (value<sub || value>add){
|
||||
valid[i] = 0;
|
||||
}
|
||||
}
|
||||
return valid;
|
||||
}
|
||||
|
||||
} // namespace Recon
|
||||
|
||||
53
src/transmissionReconstruction/dataFilter/dataFilter.h
Normal file
53
src/transmissionReconstruction/dataFilter/dataFilter.h
Normal file
@@ -0,0 +1,53 @@
|
||||
#ifndef __DATAFILTER_H__
|
||||
#define __DATAFILTER_H__
|
||||
#include "Matrix.h"
|
||||
#include <vector>
|
||||
|
||||
namespace Recon {
|
||||
Aurora::Matrix calculateSnr(const Aurora::Matrix &aMDataBlock,
|
||||
double aReferenceNoise);
|
||||
|
||||
Aurora::Matrix filterTransmissionSensitivityMap(
|
||||
double sensFilter, const Aurora::Matrix &aVslBlock,
|
||||
const Aurora::Matrix &aVsnBlock, const Aurora::Matrix &aVrlBlock,
|
||||
const Aurora::Matrix &aVrnBlock, std::vector<Aurora::Matrix> &aMSensData);
|
||||
|
||||
Aurora::Matrix
|
||||
filterTransmissionAngle(double aAngleLowerLimit, double aAngleUpperLimit,
|
||||
const Aurora::Matrix &aMSenderNormalBlock,
|
||||
const Aurora::Matrix &aMReceiverNormalBlock);
|
||||
|
||||
Aurora::Matrix checkTofDetections(Aurora::Matrix &aVTofValues,
|
||||
const Aurora::Matrix &aVDists,
|
||||
const Aurora::Matrix &aVSosRef,
|
||||
double minSpeedOfSound,
|
||||
double maxSpeedOfSound);
|
||||
/**
|
||||
* filterTransmissionData
|
||||
*
|
||||
* @param aFilterSensitivity
|
||||
* @param aVslBlock
|
||||
* @param aVsnBlock
|
||||
* @param aVrlBlock
|
||||
* @param aVrnBlock
|
||||
* @param aMSensData
|
||||
* @param aMSenderNormalBlock
|
||||
* @param aMReceiverNormalBlock
|
||||
* @param params
|
||||
* 如果aFilterSensitivity为1,单个值sensFilter,如果为2,双值angleLowerLimit,
|
||||
* angleUpperLimit
|
||||
* @return Aurora::Matrix
|
||||
*/
|
||||
Aurora::Matrix filterTransmissionData(
|
||||
int aFilterSensitivity, const Aurora::Matrix &aVslBlock,
|
||||
const Aurora::Matrix &aVsnBlock, const Aurora::Matrix &aVrlBlock,
|
||||
const Aurora::Matrix &aVrnBlock, std::vector<Aurora::Matrix> &aMSensData,
|
||||
const Aurora::Matrix &aMSenderNormalBlock,
|
||||
const Aurora::Matrix &aMReceiverNormalBlock, double *params);
|
||||
|
||||
Aurora::Matrix findDefectTransmissionData(const Aurora::Matrix &aVSNRList,double aSNRDifference);
|
||||
|
||||
//TODO:estimateNoiseValueFromAScans.m
|
||||
|
||||
} // namespace Recon
|
||||
#endif // __DATAFILTER_H__
|
||||
Reference in New Issue
Block a user