ITANumericUtils.h 16.8 KB
 Jonas Stienen committed May 10, 2016 1 ``````/* `````` Dipl.-Ing. Jonas Stienen committed Jan 05, 2017 2 3 4 5 `````` * ---------------------------------------------------------------- * * ITA core libs * (c) Copyright Institute of Technical Acoustics (ITA) `````` Philipp Schäfer committed Feb 15, 2021 6 `````` * RWTH Aachen University, Germany, 2015-2021 `````` Dipl.-Ing. Jonas Stienen committed Jan 05, 2017 7 8 9 10 11 12 13 14 15 16 17 `````` * * ---------------------------------------------------------------- * ____ __________ _______ * // / //__ ___/ // _ | * // / // / // /_| | * // / // / // ___ | * //__/ //__/ //__/ |__| * * ---------------------------------------------------------------- * */ `````` Jonas Stienen committed May 10, 2016 18 19 20 21 22 23 24 25 26 27 28 `````` #ifndef INCLUDE_WATCHER_ITA_NUMERIC_UTILS #define INCLUDE_WATCHER_ITA_NUMERIC_UTILS #include #include #include #include #include `````` Sebastian Riebeling committed Aug 22, 2019 29 30 31 32 33 ``````#include #include #include `````` Jonas Stienen committed May 10, 2016 34 35 36 37 38 39 40 41 42 43 ``````// Ein Makro für die Berechnung von Prozentsätzen (Wieviel Prozent p sind P von G?) // Wichtiges Feature: Behandlung des Falles G = 0. Rückgabewert in diesem Fall 0. #define PERCENT_OF(P, G) (G == 0 ? 0 : 100*(double) P/(double) G) //! Zweierexponent einer natürlichen Zahl ermitteln /** * Ermittelt die natürliche Zahl k, welche 2^k = x erfüllt. * Existiert keine solche, d.h. ist x keine Zweierpotenz, so * gibt die Funktion -1 zurück. */ `````` Jonas Stienen committed May 10, 2017 44 ``````ITA_BASE_API int getExp2( unsigned int x ); `````` Jonas Stienen committed May 10, 2016 45 46 `````` //! Test auf Zweierpotenz `````` Jonas Stienen committed May 10, 2017 47 ``````ITA_BASE_API bool isPow2( unsigned int x ); `````` Jonas Stienen committed May 10, 2016 48 49 `````` //! Nächstgrößeres Zweierpotenz zurückgeben `````` Jonas Stienen committed May 10, 2017 50 ``````ITA_BASE_API unsigned int nextPow2( unsigned int x ); `````` Jonas Stienen committed May 10, 2016 51 52 53 54 55 56 57 58 59 60 61 `````` //! Nächstkleineres Vielfaches von mul zu einer Zahl x zurückgeben /** * Beispiele: lwrmul(10, 5) = 10 * lwrmul(10, 6) = 6 * lwrmul(-10, 5) = -10 * lwrmul(-10, -6) = -12 (Kleiner!) * lwrmul(-10, 6) = -12 * lwrmul(10, -6) = 12 */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 62 ``````ITA_BASE_API int lwrmul( const int x, const int mul ); `````` Jonas Stienen committed May 10, 2016 63 64 65 66 67 68 69 70 71 72 `````` //! Nächstgrößeres Vielfaches von mul zu einer Zahl x zurückgeben /** * Beispiele: uprmul(10, 5) = 10 * uprmul(10, 6) = 12 * uprmul(-10, 5) = -10 * uprmul(-10, -6) = -6 (Größer!) * uprmul(-10, 6) = -6 * uprmul(10, -6) = 12 */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 73 ``````ITA_BASE_API int uprmul( const int x, const int mul ); `````` Jonas Stienen committed May 10, 2016 74 75 76 77 78 79 `````` //! Nächstkleineres Vielfaches von mul zu einer Zahl x zurückgeben /** * Beispiele: lwrmulu(10, 5) = 10 * lwrmulu(10, 6) = 6 */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 80 ``````ITA_BASE_API unsigned int lwrmulu( const unsigned int x, const unsigned int mul ); `````` Jonas Stienen committed May 10, 2016 81 82 83 84 85 86 `````` //! Nächstgrößeres Vielfaches von mul zu einer Zahl x zurückgeben /** * Beispiele: uprmulu(10, 5) = 10 * uprmulu(10, 6) = 12 */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 87 ``````ITA_BASE_API unsigned int uprmulu( const unsigned int x, const unsigned int mul ); `````` Jonas Stienen committed May 10, 2016 88 89 90 91 92 93 94 `````` //! Aufrundende Ganzzahl-Division /** * Fährt die Ganzzahl-Division c=a/b durch. Falls b nicht a teil * (d.h. es bleibt ein Rest a mod b != 0 übrig), so wird c um * eins inkrementiert. Danach gibt die Funktion c zurück * `````` Jonas Stienen committed May 10, 2017 95 `````` * Anwendungen: Wieviele Blöcke der Länge b sind erforderlich `````` Jonas Stienen committed May 10, 2016 96 97 `````` * um ein Signal der Länge l zu beschreiben: uprdiv(l, b) */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 98 ``````ITA_BASE_API int uprdiv( const int a, const int b ); `````` Jonas Stienen committed May 10, 2016 99 100 101 102 103 `````` //! Aufrundende Ganzzahl-Division /** * Variante von uprdiv für vorzeichenlose Ganzzahlen. */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 104 ``````ITA_BASE_API unsigned int uprdivu( const unsigned int a, const unsigned int b ); `````` Jonas Stienen committed May 10, 2016 105 106 107 108 109 110 111 `````` //! Einen (beliebigen) Winkel ins Interval (-180,180] abbilden /** * Beispiel: correctAngle(380°) = 20° * \note Der exakte Wert -180 wird durch die Funktion erhalten * und nicht auf +180 abgebildet (Ästethik :-)) */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 112 ``````ITA_BASE_API float correctAngle180( const float fPhiDeg ); `````` Jonas Stienen committed May 10, 2016 113 114 115 116 117 `````` //! Einen (beliebigen) Winkel ins Interval [0,360) abbilden /** * Beispiel: correctAngle(380°) = 20° */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 118 ``````ITA_BASE_API float correctAngle360( const float fPhiDeg ); `````` Jonas Stienen committed May 10, 2016 119 120 121 122 123 124 125 126 127 `````` //! Verhältnis in Dezibel (Energie) (im 10er-Logarithmus) umrechnen /** * \param db Dezibel (Wertebereich: -Unendlich..+Unendlich) * \return Verhältnis (Wertebereich: 0..+Unendlich) * * \note Für die symbolische Konstante DECIBEL_MINUS_INFINITY gibt die * Funktion den Wert 0 zurück. */ `````` Jonas Stienen committed May 10, 2017 128 ``````ITA_BASE_API double db10_to_ratio( const double db ); `````` Jonas Stienen committed May 10, 2016 129 130 131 132 133 134 135 136 137 138 139 140 `````` //! Dezibel (Energie) (im 10er-Logarithmus) in Verhältnis umrechnen /** * \param Verhältnis (Wertebereich: 0..+Unendlich) * \return db Dezibel (Wertebereich: -Unendlich..+Unendlich) * * \note Für den Wert 0 gibt die Funktion die die symbolische Konstante * DECIBEL_MINUS_INFINITY zurück. * * \important Negative Verhältnisse sind nicht erlaubt. In diesem * Falle wird eine ITAException (INVALID_PARAMETER) ausgelöst! */ `````` Jonas Stienen committed May 10, 2017 141 ``````ITA_BASE_API double ratio_to_db10( const double r ); `````` Jonas Stienen committed May 10, 2016 142 143 144 145 146 147 148 149 150 151 `````` //! Verhältnis in Dezibel (Spannung) (im 10er-Logarithmus) umrechnen /** * \param db Dezibel (Wertebereich: -Unendlich..+Unendlich) * \return Verhältnis (Wertebereich: 0..+Unendlich) * * \note Für die symbolische Konstante DECIBEL_MINUS_INFINITY gibt die * Funktion den Wert 0 zurück. */ `````` Jonas Stienen committed May 10, 2017 152 ``````ITA_BASE_API double db20_to_ratio( const double db ); `````` Jonas Stienen committed May 10, 2016 153 154 155 156 157 158 159 160 161 162 163 164 `````` //! Dezibel (Spannung) (im 10er-Logarithmus) in Verhältnis umrechnen /** * \param Verhältnis (Wertebereich: 0..+Unendlich) * \return db Dezibel (Wertebereich: -Unendlich..+Unendlich) * * \note Für den Wert 0 gibt die Funktion die die symbolische Konstante * DECIBEL_MINUS_INFINITY zurück. * * \important Negative Verhältnisse sind nicht erlaubt. In diesem * Falle wird eine ITAException (INVALID_PARAMETER) ausgelöst! */ `````` Jonas Stienen committed May 10, 2017 165 ``````ITA_BASE_API double ratio_to_db20( const double r ); `````` Jonas Stienen committed May 10, 2016 166 167 168 169 170 171 172 173 `````` /* +------------------------------------+ | | | Funktionen für komplexe Zahlen | | | +------------------------------------+ */ //! Betrag einer komplexen Zahl berechnen `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 174 175 176 177 178 ``````/** * @param[in] fReal Real part * @param[in] fImag Imaginary part */ ITA_BASE_API float cabsf( const float fReal, const float fImag ); `````` Jonas Stienen committed May 10, 2016 179 180 `````` //! Phase einer komplexen Zahl berechnen `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 181 ``````ITA_BASE_API float canglef( const float fReal, const float fImag ); `````` Jonas Stienen committed May 10, 2016 182 183 `````` //! Betrag einer komplexen Zahl setzen, deren Phase aber erhalten (auch in-place) `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 184 ``````ITA_BASE_API void csabsparg( const float fInReal, const float fInImag, const float fTargetAbs, float& fOutReal, float& fOutImag ); `````` Jonas Stienen committed May 10, 2016 185 186 `````` //! Winkel einer komplexen Zahl setzen, deren Betrag aber erhalten (auch in-place) `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 187 ``````ITA_BASE_API void csargpabs( const float fInReal, const float fInImag, const float fTargetAbs, float& fOutReal, float& fOutImag ); `````` Jonas Stienen committed May 10, 2016 188 189 `````` //! Winkel im Bogenmaß in Grad [°] umrechnen `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 190 ``````ITA_BASE_API float rad2gradf( const float fPhiRad ); `````` Jonas Stienen committed May 10, 2016 191 192 `````` //! Winkel im Bogenmaß in Grad [°] umrechnen `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 193 ``````ITA_BASE_API double rad2grad( const double dPhiRad ); `````` Jonas Stienen committed May 10, 2016 194 195 `````` //! Winkel in Grad [°] ins Bogenmaß umrechnen `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 196 ``````ITA_BASE_API float grad2radf( const float fPhiDeg ); `````` Jonas Stienen committed May 10, 2016 197 198 `````` //! Winkel im Bogenmaß in Grad [°] umrechnen `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 199 ``````ITA_BASE_API double grad2rad( const double dPhiDeg ); `````` Jonas Stienen committed May 10, 2016 200 201 202 203 204 205 206 `````` /* ---------- RAD ----------- */ //! Einen Winkel (rad) in das Intervall [0, 2PI) projezieren /** * Projeziert einen Winkel in Rad [rad] (nicht Grad) in das Intervall [0,2*PI) und `````` Jonas Stienen committed May 10, 2017 207 `````` * setzt somit negative Winkel (gegen den UZS) in positive (im UZS) um und entfernt `````` Jonas Stienen committed May 10, 2016 208 209 210 211 `````` * Mehrfachumdrehungen. * * Beispiele: 0->0, 2*PI->0, (-2*PI)->0, (2*PI+0.1)->0.1, (-0.1)->(2*PI-0.1) */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 212 ``````ITA_BASE_API float anglef_proj_0_2PI( const float fAlphaRad ); `````` Jonas Stienen committed May 10, 2016 213 214 215 216 217 218 219 220 221 222 `````` //! Einen Winkel (rad) in das Intervall (-PI, PI] projezieren /** * Projeziert einen Winkel in Rad [rad] (nicht Grad) in das Intervall (-PI,PI] und * setzt somit negative Winkel über -PI (gegen den UZS) in positive (im UZS) um sowie * positive Winkel über PI (im UZS) in negative (gegen UZS) und entfernt Mehrfachumdrehungen. * Bemerkung: -PI wird auf PI abgebildet. * * Beispiele: 0->0, 2*PI->0, (-2*PI)->0, (PI+0.1)->(-PI+0.1), (-PI-0.1)->(PI-0.1) */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 223 ``````ITA_BASE_API float anglef_proj_NPI_PI( const float fAlphaRad ); `````` Jonas Stienen committed May 10, 2016 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 `````` //! (Gerichtete) minimale Winkeldifferenz für zwei Winkel [rad] (nicht Grad) im Intervall [0,2PI) /** * Für zwei gegebene Winkel 0<=alpha, beta<2*PI im Interval [0,2*PI) berechnet * die Funktion den betragskleinsten Winkel gamma, um den der Winkel alpha (weiter)gedreht * werden muss, um den Wert des Winkels beta zu erreichen. Dies kann durch Linksdrehung * (im UZS, positiver Drehwinkel gamma) oder Rechtsdrehung (gegen UZS, negativer Drehwinkel gamma) * geschehen. Die Funktion berechnet den betragskleinsten Drehwinkel (im UZS oder gegen den UZS) * und gibt ihn zurück. Das Ergebnis ist also die Drehung um den geringstmöglichen Winkel um * alpha in beta zu überführen. * * \return Minimaler Differenzwinkel (negatives Vorzeichen = Linksdrehung, positives Vorzeichen = Rechtsdrehung) * * \note Im Gegensatz zur Funktion anglef_mindiff_abs_0_2PI gibt hier das Vorzeichen die * Drehrichtung an. * * \note Die Funktion ist nicht kommutativ: f(a,b) != f(b,a) * * Beispiele: (0,PI/2) -> PI/2, (PI/5,PI/4) -> PI/20, (PI/3,PI/4) -> -PI/12, (0,2*PI-0.1) -> -0.1 */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 244 ``````ITA_BASE_API float anglef_mindiff_0_2PI( const float alpha, const float beta ); `````` Jonas Stienen committed May 10, 2016 245 246 247 248 249 250 251 252 253 254 255 256 257 `````` //! Absolute minimale Winkeldifferenz für zwei Winkel [rad] im Intervall [0,2PI) /** * Für zwei gegebene Winkel 0<=alpha, beta<2*PI im Interval [0,2*PI) berechnet * die Funktion den minimalen Differenzwinkel. Dieser Winkel ist der kleinste Winkel * um den einer der beiden Winkel rotiert werden muss, um den Wert des anderen Winkels * zu erreichen. Hierbei wird keine Drehrichtung beachtet und der Rückgabewert ist * stets positiv. * * \note Die Funktion ist kommutativ: f(a,b) = f(b,a) * * Beispiele: (0,PI/2) -> PI/2, (PI/2,PI/3) -> PI/6, (PI/3,PI/2) -> PI/6, (0,2*PI-0.1) -> 0.1 */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 258 ``````ITA_BASE_API float anglef_mindiff_abs_0_2PI( const float alpha, const float beta ); `````` Jonas Stienen committed May 10, 2016 259 260 261 262 263 264 `````` /* ---------- GRAD ---------- */ //! Einen Winkel [°] in das Intervall [0°,360°) projezieren /** * Projeziert einen Winkel in Grad [°] (nicht Bogenmaß) in das Intervall [0°,360°) und `````` Jonas Stienen committed May 10, 2017 265 `````` * setzt somit negative Winkel (gegen den UZS) in positive (im UZS) um und entfernt `````` Jonas Stienen committed May 10, 2016 266 267 268 269 `````` * Mehrfachumdrehungen. * * Beispiele: 0°->0°, 360°->0°, -360°->0°, 361°->1°, -1°->359° */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 270 ``````ITA_BASE_API float anglef_proj_0_360_DEG( const float alpha ); `````` Jonas Stienen committed May 10, 2016 271 272 273 274 275 276 277 278 279 280 `````` //! Einen Winkel (°) in das Intervall (-180°, 180°] projezieren /** * Projeziert einen Winkel in Grad [°] (nicht Bogenmaß) in das Intervall (-180°,180°] und * setzt somit negative Winkel über -PI (gegen den UZS) in positive (im UZS) um sowie * positive Winkel über PI (im UZS) in negative (gegen UZS) und entfernt Mehrfachumdrehungen. * Bemerkung: -180° wird auf 180° abgebildet. * * Beispiele: 0°->0°, 360°->0°, -360°->0°, 181°->-179°, -181°->179° */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 281 ``````ITA_BASE_API float anglef_proj_N180_180_DEG( const float alpha ); `````` Jonas Stienen committed May 10, 2016 282 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 07, 2017 283 284 285 ``````//! Project an angle into interval of -90 and 90 degree ITA_BASE_API float anglef_proj_N90_90_DEG( const float alpha ); `````` Jonas Stienen committed May 10, 2016 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 ``````//! (Gerichtete) minimale Winkeldifferenz für zwei Winkel [°] im Intervall [0°,360°) /** * Für zwei gegebene Winkel 0°<= alpha, beta < 360° im Interval [0°,360°) berechnet * die Funktion den betragskleinsten Winkel gamma, um den der Winkel alpha (weiter)gedreht * werden muss, um den Wert des Winkels beta zu erreichen. Dies kann durch Linksdrehung * (im UZS, positiver Drehwinkel gamma) oder Rechtsdrehung (gegen UZS, negativer Drehwinkel gamma) * geschehen. Die Funktion berechnet den betragskleinsten Drehwinkel (im UZS oder gegen den UZS) * und gibt ihn zurück. Das Ergebnis ist also die Drehung um den geringstmöglichen Winkel um * alpha in beta zu überführen. * * \return Minimaler Differenzwinkel (negatives Vorzeichen = Linksdrehung, positives Vorzeichen = Rechtsdrehung) * * \note Im Gegensatz zur Funktion anglef_mindiff_abs_0_360_DEG gibt hier das Vorzeichen die * Drehrichtung an. * * \note Die Funktion ist nicht kommutativ: f(a,b) != f(b,a) * * Beispiele: (0°,90°) -> 90°, (45°,70°) -> 25°, (70°,45°) -> -25°, (0°,359°) -> -1° */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 305 ``````ITA_BASE_API float anglef_mindiff_0_360_DEG( const float alpha, const float beta ); `````` Jonas Stienen committed May 10, 2016 306 307 308 309 310 311 312 313 314 315 316 317 318 `````` //! Absolute minimale Winkeldifferenz für zwei Winkel [°] im Intervall [0°,360°) /** * Für zwei gegebene Winkel 0°<= alpha, beta < 360° im Interval [0°,360°) berechnet * die Funktion den minimalen Differenzwinkel. Dieser Winkel ist der kleinste Winkel * um den einer der beiden Winkel rotiert werden muss, um den Wert des anderen Winkels * zu erreichen. Hierbei wird keine Drehrichtung beachtet und der Rückgabewert ist * stets positiv. * * \note Die Funktion ist kommutativ: f(a,b) = f(b,a) * * Beispiele: (0°,90°) -> 90°, (45°,70°) -> 25°, (70°,45°) -> 25°, (0°,359°) -> 1° */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 319 ``````ITA_BASE_API float anglef_mindiff_abs_0_360_DEG( const float alpha, const float beta ); `````` Jonas Stienen committed May 10, 2016 320 321 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 322 323 ``````//! Orientierung in Yaw-Pitch-Roll Winkeln in View-Up-Vektor umrechnen (Alle Winkel in Bogenmaß) ITA_BASE_API void convertYPR2VU( const double yaw, const double pitch, const double roll, double& vx, double& vy, double& vz, double& ux, double& uy, double& uz ); `````` Jonas Stienen committed May 10, 2016 324 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 325 326 ``````//! Orientierung in Yaw-Pitch-Roll Winkeln in View-Up-Vektor umrechnen (Alle Winkel in Bogenmaß) ITA_BASE_API void convertYPR2VU( const float yaw, const float pitch, const float roll, float& vx, float& vy, float& vz, float& ux, float& uy, float& uz ); `````` Jonas Stienen committed May 10, 2016 327 328 `````` // Orientierung in View-Up-Vektor in Yaw-Pitch-Roll Winkeln umrechnen (Alle Winkel in Bogenmaß) `````` Jonas Stienen committed May 10, 2017 329 ``````ITA_BASE_API void convertVU2YPR( const double vx, const double vy, const double vz, `````` Jonas Stienen committed May 10, 2016 330 `````` const double ux, const double uy, const double uz, `````` Jonas Stienen committed May 10, 2017 331 `````` double& yaw, double& pitch, double& roll ); `````` Jonas Stienen committed May 10, 2016 332 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 333 334 ``````//! Orientierung in View-Up-Vektor in Yaw-Pitch-Roll Winkeln umrechnen (Alle Winkel in Bogenmaß) ITA_BASE_API void convertVU2YPR( const float vx, const float vy, const float vz, const float ux, const float uy, const float uz, float& yaw, float& pitch, float& roll ); `````` Jonas Stienen committed May 10, 2016 335 `````` `````` Sebastian Riebeling committed Aug 22, 2019 336 337 338 339 340 `````` //! Orientation in Quaternion: calculate Yaw-Pitch-Roll angles (all angles in radian) ITA_BASE_API void calculateYPRAnglesFromQuaternion(VistaQuaternion q, double& dRoll, double& dPitch, double& dYaw); `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 341 ``````//! Datenklasse für Fehlerwerte `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 342 343 344 ``````template< typename T > class ITA_BASE_API ErrorValues { `````` Jonas Stienen committed May 10, 2016 345 346 347 348 349 350 351 ``````public: T minAbsError; T avgAbsError; T maxAbsError; int indexMaxAbsError; // Index of element where max abs error `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 352 353 354 355 356 357 `````` inline ErrorValues() : minAbsError( 0 ) , avgAbsError( 0 ) , maxAbsError( 0 ) , indexMaxAbsError( 0 ) {}; `````` Jonas Stienen committed May 10, 2016 358 359 ``````}; `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 360 ``````//! Fehler zwischen zwei Vektoren berechnen `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 361 362 ``````template< typename Tc, typename Ta, typename Tb > inline ErrorValues computeErrorValues( const Ta* A, const Tb* B, const int size ) `````` Jonas Stienen committed May 10, 2016 363 364 ``````{ ErrorValues v; `````` Jonas Stienen committed May 10, 2017 365 `````` if( size == 0 ) return v; `````` Jonas Stienen committed May 10, 2016 366 `````` `````` Jonas Stienen committed May 10, 2017 367 `````` Tb absErr = std::abs( ( Tc ) A[ 0 ] - ( Tc ) B[ 0 ] ); `````` Jonas Stienen committed May 10, 2016 368 369 `````` v.minAbsError = v.avgAbsError = v.maxAbsError = absErr; `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 370 371 `````` for( int i = 1; i < size; ++i ) { `````` Jonas Stienen committed May 10, 2017 372 373 374 `````` absErr = std::abs( ( Tc ) A[ i ] - ( Tc ) B[ i ] ); v.minAbsError = std::min( v.minAbsError, absErr ); `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 375 376 `````` if( absErr > v.maxAbsError ) { `````` Jonas Stienen committed May 10, 2016 377 378 379 380 381 382 383 384 385 386 387 388 `````` v.maxAbsError = absErr; v.indexMaxAbsError = i; } v.avgAbsError += absErr; } v.avgAbsError /= size; return v; }; `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 389 ``````//! Fills a vector with numbers dest = { a+n*s < b | n in N } `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 390 391 ``````template< typename T > inline void linspace( std::vector< T >& dest, T a, T b, T s = 1 ) { `````` Jonas Stienen committed May 10, 2016 392 `````` dest.clear(); `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 393 394 `````` if( s == 0 ) { `````` Jonas Stienen committed May 10, 2017 395 `````` dest.push_back( a ); `````` Jonas Stienen committed May 10, 2016 396 397 398 `````` return; } `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 399 400 401 402 `````` if( s < 0 ) { if( a < b ) return; // No elements contained `````` Jonas Stienen committed May 10, 2017 403 `````` dest.reserve( ( a - b ) / s + 1 ); `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 404 405 `````` for( T x = a; x >= b; x += s ) dest.push_back( x ); `````` Jonas Stienen committed May 10, 2017 406 `````` } `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 407 408 409 410 `````` else { if( a > b ) return; // No elements contained `````` Jonas Stienen committed May 10, 2017 411 `````` dest.reserve( ( b - a ) / s + 1 ); `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 412 413 `````` for( T x = a; x <= b; x += s ) dest.push_back( x ); `````` Jonas Stienen committed May 10, 2016 414 415 416 `````` } }; `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 417 418 419 420 ``````//! Fills a vector with powers of two in the range a=2^i <= 2^j <= 2^k=b /** * @note a and b must be powers of two, otherwise an exception is thrown) */ `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 421 ``````ITA_BASE_API void pow2space( std::vector< int >& dest, const int a, const int b ); `````` Jonas Stienen committed May 10, 2016 422 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 423 424 ``````//! Returns the elevation angle (0 = frontal direction) in radians from a polar angle theta (0 = above) ITA_BASE_API double theta2elevation( const double dThetaRAD ); `````` 425 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 426 427 ``````//! returns the polar angle theta (0 = above) in radians from a given elevation angle (0 = frontal direction) ITA_BASE_API double elevation2theta( const double dElevationRAD ); `````` 428 `````` `````` Jonas Stienen committed May 10, 2016 429 ``````// Calculates the factorial of an positive integer m `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 430 ``````ITA_BASE_API int factorial( const int m ); `````` Jonas Stienen committed May 10, 2016 431 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 432 ``````//! Calculates the normalizing constant for SHRealvaluedBasefunctions `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 433 ``````ITA_BASE_API double SHNormalizeConst( const int m, const int n ); `````` Jonas Stienen committed May 10, 2016 434 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 435 ``````//! Calculates the Kronecker delta `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 436 ``````ITA_BASE_API int SHKronecker( const int m ); `````` Jonas Stienen committed May 10, 2016 437 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 438 ``````//! Returns the linear index of a basefunction with degree m and order n, linear indexing starts with 0 `````` Dipl.-Ing. Jonas Stienen committed Jun 16, 2017 439 ``````ITA_BASE_API int SHDegreeOrder2Linear( const int m, const int n ); `````` Jonas Stienen committed May 10, 2016 440 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 441 442 ``````//! Returns degree and order of a basefunctions from a linear index, linear indexing starts with 0 ITA_BASE_API void SHLinear2DegreeOrder( const int iLinear, int &m, int &n ); `````` 443 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 444 445 ``````//! Calculates the remax weightings up to a given order ITA_BASE_API std::vector< double > HOARemaxWeights( int iTruncationOrder ); `````` 446 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 447 448 ``````//! Calculates the realvalued Basefunctions of SH for e.g. Ambisonics ITA_BASE_API std::vector< double > SHRealvaluedBasefunctions( const double thetaRAD, const double azimuthRAD, const int maxOrder ); `````` Jonas Stienen committed May 10, 2016 449 `````` `````` Dipl.-Ing. Jonas Stienen committed Dec 06, 2017 450 451 ``````//! Calculates the associated legendre polynomials ITA_BASE_API std::vector< double > SHAssociatedLegendre( const int N, const double mu ); `````` Jonas Stienen committed May 10, 2016 452 453 `````` #endif // INCLUDE_WATCHER_ITA_NUMERIC_UTILS``````