From fd01c5fccbdd4c42873cafc5de29481446561e0d Mon Sep 17 00:00:00 2001 From: lmoesch Date: Sun, 30 Sep 2018 13:23:11 +0200 Subject: [PATCH] Added relation metrics and HRTF TOA substraction. --- .../VABinauralCluster.cpp | 31 ++++++++++++------- .../RelationMetrics/VARelationMetrics.cpp | 24 ++++++++++++++ .../Utils/RelationMetrics/VARelationMetrics.h | 21 +++++++++++++ .../Utils/RelationMetrics/_SourceFiles.cmake | 19 ++++++++++++ .../RealTime/Utils/_SourceFiles.cmake | 2 +- src/Utils/VAUtils.cpp | 1 - 6 files changed, 85 insertions(+), 13 deletions(-) create mode 100644 src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.cpp create mode 100644 src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.h create mode 100644 src/Rendering/Binaural/RealTime/Utils/RelationMetrics/_SourceFiles.cmake diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp index 9148ac1..348526e 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp @@ -3,7 +3,11 @@ #include #include "VABinauralCluster.h" +// ITA includes +#include + // Utils +#include "../RelationMetrics/VARelationMetrics.h" #include "../BinauralTimeOfArrivalEstimator/VABinauralTOAEstimator.h" VABinauralCluster::VABinauralCluster() @@ -88,6 +92,13 @@ VABinauralCluster::getOutput() // reset output Buffer _output->zero(); + // get cluster HRTF TOA + VARelationMetrics clusterSourceMetrics; + clusterSourceMetrics.calc(_listener->predPos, _listener->predView, _listener->predUp, _clusterSourcePos); + + double toaHRTFChL = _listener->toaEstimator->getTOALeft(clusterSourceMetrics.phi, clusterSourceMetrics.theta); + double toaHRTFChR = _listener->toaEstimator->getTOARight(clusterSourceMetrics.phi, clusterSourceMetrics.theta); + // set VDL Values std::map::const_iterator it; for (it = _sources.begin(); it != _sources.end(); ++it) @@ -95,18 +106,16 @@ VABinauralCluster::getOutput() VABinauralSoundSource* source = it->second; const ITASampleBuffer* input = source->data->pSignalSourceInputBuf; - VAVec3 sourceToListenerPos = source->predPos - _listenerPos; - sourceToListenerPos.Norm(); + VARelationMetrics sourceMetrics; + sourceMetrics.calc(_listener->predPos, _listener->predView, _listener->predUp, source->predPos); - double phi = atan2(sourceToListenerPos.y, sourceToListenerPos.x); - double theta = acos(sourceToListenerPos.z); - - //TODO: add general distance VDL - double toaChL = _listener->toaEstimator->getTOALeft(phi, theta); - double toaChR = _listener->toaEstimator->getTOARight(phi, theta); + double toaDistance = sourceMetrics.dist / 343; // TODO: Medium Propagation.... + + double toaSourceChL = _listener->toaEstimator->getTOALeft(sourceMetrics.phi, sourceMetrics.theta); + double toSourceaChR = _listener->toaEstimator->getTOARight(sourceMetrics.phi, sourceMetrics.theta); - source->vdlChL->SetDelayTime(toaChL); - source->vdlChR->SetDelayTime(toaChR); + source->vdlChL->SetDelayTime(toaDistance + toaSourceChL - toaHRTFChL); + source->vdlChR->SetDelayTime(toaDistance + toSourceaChR - toaHRTFChR); source->vdlChL->Process(input, &(_tmpChL)); source->vdlChR->Process(input, &(_tmpChR)); @@ -115,7 +124,7 @@ VABinauralCluster::getOutput() (*_output)[1] += _tmpChR; } - // convolve + // convolve here! return _output; } diff --git a/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.cpp b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.cpp new file mode 100644 index 0000000..8ef6372 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.cpp @@ -0,0 +1,24 @@ +#include "VARelationMetrics.h" + + +VARelationMetrics::VARelationMetrics() +{ +} + + +VARelationMetrics::~VARelationMetrics() +{ +} + +void +VARelationMetrics::calc(const VAVec3& sourcePos, const VAVec3& sourceView, const VAVec3& sourceUp, const VAVec3& targetPos) +{ + VAVec3 relTargetPos = targetPos - sourcePos; + VAVec3 sourceViewMinusZ = sourceView * (-1.0f); + VAVec3 sourceRight = sourceViewMinusZ.Cross(sourceUp); + + dist = relTargetPos.Length(); + relTargetPos = relTargetPos / dist; + phi = atan2(relTargetPos.Dot(sourceRight), relTargetPos.Dot(sourceViewMinusZ)); + theta = asin(relTargetPos.Dot(sourceUp)); +} diff --git a/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.h b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.h new file mode 100644 index 0000000..affa010 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.h @@ -0,0 +1,21 @@ +#ifndef IW_VACORE_RELATIONMETRICS +#define IW_VACORE_RELATIONMETRICS + +// VA Includes +#include + +class VARelationMetrics +{ +public: + double theta; + double phi; + double dist; + + VARelationMetrics(); + ~VARelationMetrics(); + + void + calc(const VAVec3& sourcePos, const VAVec3& sourceView, const VAVec3& sourceUp, const VAVec3& targetPos); +}; + +#endif \\ IW_VACORE_RELATIONMETRICS \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/_SourceFiles.cmake b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/_SourceFiles.cmake new file mode 100644 index 0000000..0a05292 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/_SourceFiles.cmake @@ -0,0 +1,19 @@ +# $Id:$ + +set( RelativeDir "src/Rendering/Binaural/RealTime/Utils/RelationMetrics" ) +set( RelativeSourceGroup "Source Files\\Rendering\\Binaural\\Realtime\\Utils\\RelationMetrics" ) + +set( DirFiles + VARelationMetrics.cpp + VARelationMetrics.h + _SourceFiles.cmake +) +set( DirFiles_SourceGroup "${RelativeSourceGroup}" ) + +set( LocalSourceGroupFiles ) +foreach( File ${DirFiles} ) + list( APPEND LocalSourceGroupFiles "${RelativeDir}/${File}" ) + list( APPEND ProjectSources "${RelativeDir}/${File}" ) +endforeach() +source_group( ${DirFiles_SourceGroup} FILES ${LocalSourceGroupFiles} ) + diff --git a/src/Rendering/Binaural/RealTime/Utils/_SourceFiles.cmake b/src/Rendering/Binaural/RealTime/Utils/_SourceFiles.cmake index 68e2150..bd6f21e 100644 --- a/src/Rendering/Binaural/RealTime/Utils/_SourceFiles.cmake +++ b/src/Rendering/Binaural/RealTime/Utils/_SourceFiles.cmake @@ -2,7 +2,7 @@ set( RelativeDir "src/Rendering/Binaural/Realtime/Utils" ) set( RelativeSourceGroup "Source Files\\Rendering\\Binaural\\Realtime\\Utils" ) -set( SubDirs BinauralListener BinauralClusterEngine BinauralSoundSource BinauralTimeOfArrivalEstimator) +set( SubDirs BinauralListener BinauralClusterEngine BinauralSoundSource BinauralTimeOfArrivalEstimator RelationMetrics) set( DirFiles _SourceFiles.cmake diff --git a/src/Utils/VAUtils.cpp b/src/Utils/VAUtils.cpp index b95e8b9..0787464 100644 --- a/src/Utils/VAUtils.cpp +++ b/src/Utils/VAUtils.cpp @@ -276,7 +276,6 @@ double GetElevationOnTarget_DEG( const VAVec3& vOriginPos, const VAVec3& vView, { VAVec3 vDir = vTargetPos - vOriginPos; vDir.Norm(); - const VAVec3 vRight = vView.Cross( vUp ); const double dElevationAngleDeg = asin( vDir.Dot( vUp ) ) * 180.0f / ITAConstants::PI_D; return dElevationAngleDeg; } -- GitLab