Skip to content
Snippets Groups Projects
Commit c9502f59 authored by João Fatela's avatar João Fatela :airplane:
Browse files

correcting redundant geometrical transformations (VAAirTrafficNoiseRenderer.cpp)

benchmark for data history interpolation
parent 7cf57599
Branches feature/ATNRenderer_with_simulation_scheduling
Tags
No related merge requests found
......@@ -48,8 +48,8 @@ std::shared_ptr<const CPathProperties> GetARTRayProperties( std::shared_ptr<cons
auto pRayProps = std::make_shared<CPathProperties>( );
pRayProps->dPropagationDelay = pRay->LastTimeStamp( );
pRayProps->dSpreadingLoss = pRay->SpreadingLoss( );
pRayProps->v3SourceWaveFrontNormal = ARTtoOpenGLVector( pRay->InitialDirection( ) );
pRayProps->v3ReceiverWaveFrontNormal = ARTtoOpenGLVector( pRay->LastWavefrontNormal( ) );
pRayProps->v3SourceWaveFrontNormal = pRay->InitialDirection( ); //ARTtoOpenGLVector( pRay->InitialDirection( ) );
pRayProps->v3ReceiverWaveFrontNormal = pRay->LastWavefrontNormal( ); // ARTtoOpenGLVector( pRay->LastWavefrontNormal( ) );
pRayProps->iReflectionOrder = pRay->ReflectionOrder( );
pRayProps->sID = std::to_string( pRayProps->iReflectionOrder );
ITAPropagationModels::Atmosphere::AirAttenuationSpectrum( pRayProps->oAirAttenuationSpectrum, *pRay, oStratifiedAtmosphere );
......@@ -299,7 +299,7 @@ void CVAAirTrafficNoiseRenderer::ATNSoundPath::ApplyAuralizationParameters( doub
CVAAirTrafficNoiseRenderer::ATNSoundPathWithHistories::ATNSoundPathWithHistories( const Config& oConf, CVARendererSource* pSource, CVARendererReceiver* pReceiver )
: ATNSoundPath( oConf, pSource, pReceiver )
, oDelayHistory( oConf.iAuralizationParameterHistorySize, CVAHistoryEstimationMethod::EMethod::Linear )
, oDelayHistory( oConf.iAuralizationParameterHistorySize, CVAHistoryEstimationMethod::EMethod::SampleAndHold)
, oSpreadingLossGainHistory( oConf.iAuralizationParameterHistorySize, CVAHistoryEstimationMethod::EMethod::SampleAndHold)
, oAirAttenuationHistory( oConf.iAuralizationParameterHistorySize, CVAHistoryEstimationMethod::EMethod::SampleAndHold )
, oSourceWFHistory( oConf.iAuralizationParameterHistorySize, CVAHistoryEstimationMethod::EMethod::SampleAndHold )
......
......@@ -78,8 +78,8 @@ public:
{
sVDLSwitchingAlgorithm = "cubicspline";
sFilterBankType = "iir_biquads_order10";
oSourceMotionModel.dWindowSize = 1.0;
oSourceMotionModel.dWindowDelay = 1.0;
oSourceMotionModel.dWindowSize = 0.5;
oSourceMotionModel.dWindowDelay = 0.5;
InitDependentParameters( );
};
/// Constructor parsing renderer ini-file parameters. Takes a given config for default values.
......
......@@ -3,21 +3,67 @@
#include <stdio.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <cmath>
#include <chrono>
#include <vector>
#include <numeric>
#include <algorithm>
#include <functional>
typedef struct Statistics
{
double mean;
double median;
double stdev;
} Statistics;
double calculateStdDev(const std::vector<double> vector, const double mean)
{
double tmp = 0;
for( double val : vector )
{
tmp += ( val - mean ) * ( val - mean );
}
double stdDev = sqrt( tmp / vector.size( ) );
return stdDev;
}
Statistics getStats( const std::vector<double> &i_vector )
{
Statistics stats;
std::vector<double> vector( i_vector );
std::sort( vector.begin( ), vector.end( ) );
double sumD = std::accumulate( vector.begin( ), vector.end( ), 0.0 );
stats.mean = sumD / double( vector.size( ) );
stats.stdev = calculateStdDev( vector, stats.mean );
stats.median = vector[std::floor( double( vector.size( ) ) / 2.0 )];
stats.stdev = std::sqrt( stats.stdev / vector.size( ) );
return stats;
}
void main( )
{
const int iInputSize = 1000000;
double dInputUpdateRate = 20;
const std::vector<int> viUpsamplingFactors = { 1, 2, 5, 10, 20, 50, 100 };
const int iBufferSize = 1000;
const int iOutputSize = iInputSize;
std::vector<double> vdWindowSize;
double dWindowDelay = 0;
int iDegree = 1;
int iBufferSize = 1000;
const int iArraySize = 1000000;
const int iNumCycles = 20;
Statistics datastats;
double dInputTimeStamp;
double dInputSample;
......@@ -25,26 +71,37 @@ void main( )
double dOutputTimeStamp;
double dOutputSample;
int identifier[] = {0, 1, 2, 3, 10, 11};
double dAccumtime[6][4] = { 0.0 };
double dTimePeriod = iInputSize/dInputUpdateRate;
const int identifier[] = { 0, 1, 2, 3, 10};
std::chrono::duration<double, std::micro> dTimeInterval;
std::ofstream file;
file.open( "D:\\HIWI\\work\\code\\base_data\\interpolationBenchmark.csv" );
std::cout << (double)std::chrono::steady_clock::period::num / std::chrono::steady_clock::period::den << std::endl;
for( size_t loopID = 0; loopID < iNumCycles; loopID++ )
for( int iUpsamplingID = 0; iUpsamplingID < viUpsamplingFactors.size(); iUpsamplingID++ )
{
std::cout << "\nLOOP #" << loopID + 1 << std::endl;
const int iUpsamplingFactor = viUpsamplingFactors[iUpsamplingID];
std::vector<double> vTimeIntervals( iOutputSize );
for( int i = 0; i < 6; i++ )
std::cout << "Upsampling factor: " << iUpsamplingFactor << std::endl;
for( int i = 0; i < 5; i++ )
{
CVAHistoryEstimationMethod::EMethod eMethod = static_cast<CVAHistoryEstimationMethod::EMethod>( identifier[i] );
std::cout << " -> " << CVAHistoryEstimationMethod( eMethod ).ToString( ) << std::endl;
if( eMethod < CVAHistoryEstimationMethod::EMethod::TriangularWindow )
if( eMethod == CVAHistoryEstimationMethod::EMethod::TriangularWindow )
{
vdWindowSize = { 1.0 };
vdWindowSize = { 5.0, 3.333, 2.5, 1.666, 1.0, 0.5, 0.3333, 0.25, 0.1666, 0.1 };
}
else
{
vdWindowSize = { 1.0, 0.5, 0.1, 0.05 };
vdWindowSize = { 1.0 };
}
......@@ -52,72 +109,55 @@ void main( )
{
CVADoubleHistoryModel oHistoryBuffer = CVADoubleHistoryModel( iBufferSize, eMethod, vdWindowSize[l], dWindowDelay, iDegree );
std::cout << " - " << vdWindowSize[l] << "s window" << std::endl;
// full buffer - pure interpolation
for( int i = 0; i < iBufferSize; i++ )
{
dInputTimeStamp = 20.0 * double( i ) / double( iBufferSize );
dInputSample = std::sin( dInputTimeStamp * 2 * ITAConstants::PI_D );
oHistoryBuffer.Push( dInputTimeStamp, std::make_unique<double>( dInputSample ) );
}
std::cout << " -> " << oHistoryBuffer.GetEstimationMethod( ).ToString( ) << ", " << vdWindowSize[l] << "s window size" << std::endl;
file << iUpsamplingFactor << "," << identifier[i] << "," << vdWindowSize[l] << ",";
auto ti = std::chrono::high_resolution_clock::now( );
for( int j = 0; j < iArraySize; j++ )
for( int j = 0; j < iOutputSize; j++ )
{
dOutputTimeStamp = 20.0 * double( j ) / double( iArraySize );
oHistoryBuffer.Update( dOutputTimeStamp ); // important to keep this here because it differs for sliding window
oHistoryBuffer.Estimate( dOutputSample, dOutputSample );
}
auto tf = std::chrono::high_resolution_clock::now( );
std::chrono::duration<double, std::milli> timeInterval = tf - ti;
dAccumtime[i][l] += timeInterval.count( );
}
}
}
std::cout << "\n\n\n";
dOutputTimeStamp = dTimePeriod * double( j ) / double( iInputSize * iUpsamplingFactor ) + 0.001;
if( j == 0 )
{
for( int i = 0; i < iBufferSize; i++ )
{
dInputTimeStamp = dTimePeriod * ( double( i ) / double( iInputSize ));
dInputSample = std::sin( dInputTimeStamp * 2 * ITAConstants::PI_D );
oHistoryBuffer.Push( dInputTimeStamp, std::make_unique<double>( dInputSample ) );
}
}
else if( ( j % ( iBufferSize * iUpsamplingFactor / 2) ) == 0 && (j != 0) )
{
for( int i = 1; i <= double(iBufferSize)/2; i++ )
{
dInputTimeStamp = dTimePeriod * ( 1.0 / double( iInputSize ) ) + oHistoryBuffer.GetLastPushedTimestamp( );
dInputSample = std::sin( dInputTimeStamp * 2 * ITAConstants::PI_D );
oHistoryBuffer.Push( dInputTimeStamp, std::make_unique<double>( dInputSample ) );
}
}
auto ti = std::chrono::steady_clock::now( );
oHistoryBuffer.Update( dOutputTimeStamp ); // important to keep this here because it differs for sliding window
oHistoryBuffer.Estimate( dOutputTimeStamp, dOutputSample );
std::ofstream file;
file.open( "D:\\HIWI\\work\\code\\base_data\\interpolationBenchmark.csv" );
auto tf = std::chrono::steady_clock::now( );
for( int i = 0; i < 6; i++ )
{
CVAHistoryEstimationMethod::EMethod eMethod = static_cast<CVAHistoryEstimationMethod::EMethod>( identifier[i] );
dTimeInterval = tf - ti;
if( eMethod < CVAHistoryEstimationMethod::EMethod::TriangularWindow )
{
vdWindowSize = { 1.0 };
}
else
{
vdWindowSize = { 1.0, 0.1, 0.01, 0.001 };
}
vTimeIntervals[j] = dTimeInterval.count( );
}
datastats = getStats( vTimeIntervals );
for( int l = 0; l < vdWindowSize.size( ); l++ )
{
std::cout << CVAHistoryEstimationMethod( eMethod ).ToString( ) << "(" << vdWindowSize[l] << "s window) runtime: " << dAccumtime[i][l] / iNumCycles << "ms"
<< std::endl;
if( eMethod < CVAHistoryEstimationMethod::EMethod::TriangularWindow )
{
file << identifier[i] << ", " << dAccumtime[i][l] / iNumCycles << std::endl;
}
else
{
file << identifier[i] << ", " << vdWindowSize[l] << ", " << dAccumtime[i][l] / iNumCycles << std::endl;
file << datastats.mean << "," << datastats.stdev << "," << datastats.median << std::endl;
std::cout << " " << datastats.mean << "," << datastats.stdev << "," << datastats.median << std::endl;
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment