2#include <glm/gtc/constants.hpp>
3#include <glm/gtc/quaternion.hpp>
5#include "BeamResampleTask.h"
6#include "../BeamUtils.h"
7#include "Platform/Instrumentation.h"
9using namespace Cogs::Core::EchoSounder;
12void Cogs::Core::EchoSounder::SetupBeamFilterUnivariate(std::vector<InterpolationSamplePos>& samplesOut,
13 const std::vector<float>& angles,
14 const float angularStep,
20 const float a0 = angles.front();
21 const float a1 = angles.back();
22 const auto sampleCountOut =
static_cast<uint32_t
>(std::max(2.f, std::abs(a1 - a0) / angularStep));
23 samplesOut.resize(sampleCountOut);
26 for (uint32_t i = 0; i < sampleCountOut; i++) {
27 const float t = i / (sampleCountOut - 1.f);
28 const float a = (1.f - t)*a0 + t*a1;
30 while ((ix + 1u < N) && (angles[ix + 1] < a)) ix++;
33 const auto delta = angles[ix + 1] - angles[ix];
34 samplesOut[i].t = delta < std::numeric_limits<float>::epsilon() ? 0.5f : (a - angles[ix]) / delta;
39void Cogs::Core::EchoSounder::SetupBeamFilter(std::vector<InterpolationSamplePos>& iSamplesOut,
40 std::vector<InterpolationSamplePos>& jSamplesOut,
41 const std::vector<glm::vec3>& rayDir,
42 const float angularStep,
43 const float maxAngularUpsample,
44 const uint32_t minorCount,
45 const uint32_t majorCount)
49 CpuInstrumentationScope(SCOPE_ECHOSOUNDER,
"SetupBeamFilter");
51 std::vector<float> minorAngles(minorCount);
53 for (uint32_t i = 1; i < minorCount; i++) {
54 minorAngles[i] = minorAngles[i - 1] + std::acos(glm::dot(rayDir[(majorCount / 2)*minorCount + i - 1], rayDir[(majorCount / 2)*minorCount + i]));
57 std::vector<float> majorAngles(majorCount);
59 for (uint32_t j = 1; j < majorCount; j++) {
60 majorAngles[j] = majorAngles[j - 1] + std::acos(glm::dot(rayDir[(j - 1)*minorCount + minorCount / 2], rayDir[j*minorCount + minorCount / 2]));
63 float clampedStepI = std::max(angularStep, abs((minorAngles.back() - minorAngles.front()) / (maxAngularUpsample*minorCount)));
64 float clampedStepJ = std::max(angularStep, abs((majorAngles.back() - majorAngles.front()) / (maxAngularUpsample*majorCount)));
66 SetupBeamFilterUnivariate(iSamplesOut, minorAngles, clampedStepI, minorCount);
67 SetupBeamFilterUnivariate(jSamplesOut, majorAngles, clampedStepJ, majorCount);
70CalculateBeamDirectionsTask::CalculateBeamDirectionsTask(glm::vec3* directionOut,
71 const uint32_t coordSys,
72 const float* directionX,
73 const float* directionY,
74 const int beamMajorCount,
75 const int beamMinorCount,
76 const glm::quat arrayOrientationVessel,
80 directionOut(directionOut),
82 directionX(directionX),
83 directionY(directionY),
84 beamMajorCount(beamMajorCount),
85 beamMinorCount(beamMinorCount),
86 arrayOrientationVessel(arrayOrientationVessel),
91void CalculateBeamDirectionsTask::operator()()
93 CpuInstrumentationScope(SCOPE_ECHOSOUNDER,
"IntBeamDir");
95 int ja = beamBegin / beamMinorCount;
96 int ia = beamBegin % beamMinorCount;
97 int jb = beamEnd / beamMinorCount;
98 int ib = beamEnd % beamMinorCount;
99 for (
int j = ja; j <= jb; j++) {
100 int la = (j == ja) ? ia : 0;
101 int lb = (j == jb) ? ib : beamMinorCount;
103 for (
int i = la; i < lb; i++) {
104 const auto ixo = j*beamMinorCount + i;
106 directionOut[ixo] = arrayOrientationVessel * getBeamDir(coordSys,
107 directionX[j*beamMinorCount + i],
108 directionY[j*beamMinorCount + i]);
113InterpolateBeamDataMinorTask::InterpolateBeamDataMinorTask(
float* valuesOut,
114 const int beamMajorCount,
115 const int beamMinorCount,
117 const int sampleCount,
118 const float* valuesIn,
123 valuesOut(valuesOut),
124 beamMajorCount(beamMajorCount),
125 beamMinorCount(beamMinorCount),
127 sampleCount(sampleCount),
129 minorSamples(minorSamples),
130 beamBegin(beamBegin),
135void InterpolateBeamDataMinorTask::operator()()
137 CpuInstrumentationScope(SCOPE_ECHOSOUNDER,
"IntValMin");
139 int ja = beamBegin / beamMinorCount;
140 int ia = beamBegin % beamMinorCount;
141 int jb = beamEnd / beamMinorCount;
142 int ib = beamEnd % beamMinorCount;
143 for (
int j = ja; j <= jb; j++) {
144 int la = (j == ja) ? ia : 0;
145 int lb = (j == jb) ? ib : beamMinorCount;
147 for (
int i = la; i < lb; i++) {
148 const auto s = minorSamples[i];
149 const float* a = valuesIn + (j*modulo + s.i)*sampleCount;
150 const float* b = valuesIn + (j*modulo + s.i + 1)*sampleCount;
151 float* d = valuesOut + (j*beamMinorCount + i)*sampleCount;
154 for (
int k = 0; k < sampleCount; k++) {
155 *d++ = (1.f - s.t)*(*a++) + s.t*(*b++);
163InterpolateBeamDataMajorTask::InterpolateBeamDataMajorTask(
float* valuesOut,
164 const int beamMajorCount,
165 const int beamMinorCount,
167 const int sampleCount,
168 const float* valuesIn,
173 valuesOut(valuesOut),
174 beamMajorCount(beamMajorCount),
175 beamMinorCount(beamMinorCount),
177 sampleCount(sampleCount),
179 majorSamples(majorSamples),
180 beamBegin(beamBegin),
185void InterpolateBeamDataMajorTask::operator()()
187 CpuInstrumentationScope(SCOPE_ECHOSOUNDER,
"IntValMaj");
189 int ja = beamBegin / beamMinorCount;
190 int ia = beamBegin % beamMinorCount;
191 int jb = beamEnd / beamMinorCount;
192 int ib = beamEnd % beamMinorCount;
193 for (
int j = ja; j <= jb; j++) {
194 int la = (j == ja) ? ia : 0;
195 int lb = (j == jb) ? ib : beamMinorCount;
197 for (
int i = la; i < lb; i++) {
198 const auto s = majorSamples[j];
199 const float* a = valuesIn + ((s.i)*modulo + i)*sampleCount;
200 const float* b = valuesIn + ((s.i + 1)*modulo + i)*sampleCount;
201 float* d = valuesOut + (j*beamMinorCount + i)*sampleCount;
204 for (
int k = 0; k < sampleCount; k++) {
205 *d++ = (1.f - s.t)*(*a++) + s.t*(*b++);