#include "ceMatchedFilterHandling.h" #include "Function.h" #include "Function1D.h" #include "Function2D.h" #include "Function3D.h" Aurora::Matrix Recon::adaptFrequency(Aurora::Matrix &aCE, double ceSampleFrequency, double requiredFrequency) { if (requiredFrequency < ceSampleFrequency){ double stride = ceSampleFrequency / (aCE.getDataSize() - 1); double *f2Data = Aurora::malloc(aCE.getDataSize()); for (size_t i = 0; i < aCE.getDataSize(); i++) { f2Data[i] = i*stride; } auto f2 = Aurora::Matrix::New(f2Data, aCE.getDataSize(), 1, 1); auto df = fft(aCE); df = df * (f2 < (requiredFrequency / 2)); int halfdfLength = (int)std::ceil(((double)aCE.getDataSize()) * 0.5); df.forceReshape(halfdfLength, 1, 1); aCE = Aurora::ifft_symmetric(df, aCE.getDataSize()); } double *xData = Aurora::malloc(aCE.getDataSize()); for (size_t i = 0; i < aCE.getDataSize(); i++) { xData[i] = (double)(i+1.0); } auto xMatrix = Aurora::Matrix::New(xData,aCE.getDataSize(),1,1); double stride = ceSampleFrequency /requiredFrequency; double value = 1.0; size_t length = std::ceil(((double)(aCE.getDataSize()-1))/stride); double *x1Data = Aurora::malloc(length); for (size_t i = 0; i < length; i++) { x1Data[i] = value; value+=stride; } auto x1Matrix = Aurora::Matrix::New(x1Data,length,1,1); aCE = Aurora::interp1(xMatrix,aCE,x1Matrix,Aurora::InterpnMethod::Spline); return aCE; } Aurora::Matrix Recon::preprocessCE(Aurora::Matrix &aCE, double ceSampleFrequency, double requiredFrequency, double expectedLength) { adaptFrequency(aCE,ceSampleFrequency,requiredFrequency); aCE = aCE - Aurora::mean(aCE).getScalar(); aCE = aCE / Aurora::max(Aurora::abs(aCE)).getScalar(); aCE = aCE / Aurora::sum(Aurora::abs(aCE)).getScalar(); Aurora::padding(aCE,expectedLength-1,0.0); if (expectedLength sumDiffJ) { matchedFilter(Aurora::$, l) = matchedFilter(Aurora::$, minCol); } } return matchedFilter; } Aurora::Matrix Recon::createMatchedFilter(const Aurora::Matrix &aCE, bool measuredCEused, bool findDefects, bool aRemoveOutliersFromCEMeasured, std::string aHardwareVersion) { Aurora::Matrix mFTime = Aurora::Matrix::copyFromRawData(aCE.getData(), aCE.getDimSize(0), aCE.getDimSize(1)); Aurora::Matrix matchedFilter; if (measuredCEused && findDefects){ matchedFilter = reviseMatchedFilter(mFTime, aRemoveOutliersFromCEMeasured); } else{ matchedFilter = Aurora::fft(mFTime); } if (measuredCEused) { auto mFTime2 = Aurora::real(Aurora::ifft(aHardwareVersion == "USCT3dv3" ? -matchedFilter : matchedFilter)); mFTime2 = mFTime2 / Aurora::repmat(Aurora::max(Aurora::abs(mFTime2)), mFTime2.getDimSize(0), 1); mFTime2 = mFTime2 / Aurora::repmat(Aurora::sum(Aurora::abs(mFTime2)), mFTime2.getDimSize(0), 1); matchedFilter = Aurora::fft(mFTime2); } return matchedFilter; }