60#ifndef R8BBASE_INCLUDED
61#define R8BBASE_INCLUDED
75#if defined( __SSE4_2__ ) || defined( __SSE4_1__ ) || \
76 defined( __SSSE3__ ) || defined( __SSE3__ ) || defined( __SSE2__ ) || \
77 defined( __x86_64__ ) || defined( __amd64 ) || defined( _M_X64 ) || \
78 defined( _M_AMD64 ) || ( defined( _M_IX86_FP ) && _M_IX86_FP == 2 )
80 #if defined( _MSC_VER )
83 #include <emmintrin.h>
89#elif defined( __aarch64__ ) || defined( __arm64 )
95 #if !defined( __APPLE__ )
113#define R8B_VERSION "6.5"
119#define R8B_PI 3.14159265358979324
126#define R8B_2PI 6.28318530717958648
133#define R8B_3PI 9.42477796076937972
140#define R8B_PId2 1.57079632679489662
154#define R8BNOCTOR( ClassName ) \
156 ClassName( const ClassName& ) { } \
157 ClassName& operator = ( const ClassName& ) { return( *this ); }
174 void*
operator new(
const size_t,
void*
const p )
184 void*
operator new(
const size_t n )
186 return( :: malloc( n ));
194 void*
operator new[](
const size_t n )
196 return( :: malloc( n ));
205 void operator delete(
void*
const p )
216 void operator delete[](
void*
const p )
240 return( :: malloc( Size ));
253 return( :: realloc( p, Size ));
278template<
typename T >
279inline T*
alignptr( T*
const ptr,
const uintptr_t align )
281 return( (T*) (( (uintptr_t) ptr + align - 1 ) & ~( align - 1 )));
302template<
typename T >
323 R8BASSERT( Capacity > 0 || Capacity == 0 );
325 Data0 = allocmem( Capacity *
sizeof( T ) + Alignment );
326 Data = (T*)
alignptr( Data0, Alignment );
328 R8BASSERT( Data0 != NULL || Capacity == 0 );
345 R8BASSERT( Capacity > 0 || Capacity == 0 );
348 Data0 = allocmem( Capacity *
sizeof( T ) + Alignment );
349 Data = (T*)
alignptr( Data0, Alignment );
351 R8BASSERT( Data0 != NULL || Capacity == 0 );
363 void realloc(
const int PrevCapacity,
const int NewCapacity )
368 void*
const NewData0 = allocmem( NewCapacity *
sizeof( T ) +
371 T*
const NewData = (T*)
alignptr( NewData0, Alignment );
372 const size_t CopySize = ( PrevCapacity > NewCapacity ?
373 NewCapacity : PrevCapacity ) *
sizeof( T );
377 memcpy( NewData, Data, CopySize );
384 R8BASSERT( Data0 != NULL || NewCapacity == 0 );
409 static const size_t Alignment = 64;
426template<
typename T >
444 template<
typename T2 >
463 template<
typename T2 >
506 T ResObject = Object;
532 #if defined( _WIN32 )
533 InitializeCriticalSectionAndSpinCount( &CritSec, 2000 );
535 pthread_mutexattr_t MutexAttrs;
536 pthread_mutexattr_init( &MutexAttrs );
537 pthread_mutexattr_settype( &MutexAttrs, PTHREAD_MUTEX_RECURSIVE );
538 pthread_mutex_init( &Mutex, &MutexAttrs );
539 pthread_mutexattr_destroy( &MutexAttrs );
545 #if defined( _WIN32 )
546 DeleteCriticalSection( &CritSec );
548 pthread_mutex_destroy( &Mutex );
559 #if defined( _WIN32 )
560 EnterCriticalSection( &CritSec );
562 pthread_mutex_lock( &Mutex );
573 #if defined( _WIN32 )
574 LeaveCriticalSection( &CritSec );
576 pthread_mutex_unlock( &Mutex );
581 #if defined( _WIN32 )
582 CRITICAL_SECTION CritSec;
585 pthread_mutex_t Mutex;
615 : SyncObj( aSyncObj )
617 if( SyncObj != NULL )
619 SyncObj -> acquire();
629 : SyncObj( &aSyncObj )
631 SyncObj -> acquire();
636 if( SyncObj != NULL )
638 SyncObj -> release();
643 CSyncObject* SyncObj;
660#define R8BSYNC( SyncObject ) R8BSYNC_( SyncObject, __LINE__ )
661#define R8BSYNC_( SyncObject, id ) R8BSYNC__( SyncObject, id )
662#define R8BSYNC__( SyncObject, id ) CSyncKeeper SyncKeeper##id( SyncObject )
686 : svalue1( sin( ph ))
687 , svalue2( sin( ph - si ))
688 , sincr( 2.0 * cos( si ))
701 CSineGen(
const double si,
const double ph,
const double g )
702 : svalue1( sin( ph ) * g )
703 , svalue2( sin( ph - si ) * g )
704 , sincr( 2.0 * cos( si ))
716 void init(
const double si,
const double ph )
719 svalue2 = sin( ph - si );
720 sincr = 2.0 * cos( si );
732 void init(
const double si,
const double ph,
const double g )
734 svalue1 = sin( ph ) * g;
735 svalue2 = sin( ph - si ) * g;
736 sincr = 2.0 * cos( si );
745 const double res = svalue1;
747 svalue1 = sincr * res - svalue2;
768 static const uint8_t OccupancyTable[] =
770 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
771 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
772 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
773 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
774 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
775 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
776 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
777 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
778 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
779 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
780 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
781 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
782 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
783 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
784 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
785 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
788 const int tt = v >> 16;
792 const int t = v >> 24;
794 return( t != 0 ? 24 + OccupancyTable[ t & 0xFF ] :
795 16 + OccupancyTable[ tt ]);
799 const int t = v >> 8;
801 return( t != 0 ? 8 + OccupancyTable[ t ] : OccupancyTable[ v ]);
818 const double th,
double& re0,
double& im0,
const int fltlat = 0 )
820 const double sincr = 2.0 * cos( th );
831 cvalue1 = cos( -fltlat * th );
832 svalue1 = sin( -fltlat * th );
835 double cvalue2 = cos( -( fltlat + 1 ) * th );
836 double svalue2 = sin( -( fltlat + 1 ) * th );
843 re += cvalue1 * flt[ 0 ];
844 im += svalue1 * flt[ 0 ];
848 double tmp = cvalue1;
849 cvalue1 = sincr * cvalue1 - cvalue2;
853 svalue1 = sincr * svalue1 - svalue2;
873 const int fltlen,
const double th )
876 const double thd2 = 1e-9;
877 double ths[ Count ] = { th - thd2, th + thd2 };
892 for( i = 0; i < Count; i++ )
898 ph1[ i ] = atan2( im1, re1 );
901 if( fabs( ph1[ 1 ] - ph1[ 0 ]) >
R8B_PI )
903 if( ph1[ 1 ] > ph1[ 0 ])
913 const double thd = ths[ 1 ] - ths[ 0 ];
915 return(( ph1[ 1 ] - ph1[ 0 ]) / thd );
929 const double DCGain,
const int pstep = 1 )
973 const double xm2,
const double xm1,
const double x0,
const double x1,
974 const double x2,
const double x3,
const double x4 )
977 c[ 1 ] = ( 61.0 * ( x1 - xm1 ) + 16.0 * ( xm2 - x2 ) +
978 3.0 * ( x3 - xm3 )) * 1.31578947368421052e-2;
980 c[ 2 ] = ( 106.0 * ( xm1 + x1 ) + 10.0 * x3 + 6.0 * xm3 - 3.0 * x4 -
981 29.0 * ( xm2 + x2 ) - 167.0 * x0 ) * 1.31578947368421052e-2;
983 c[ 3 ] = ( 91.0 * ( x0 - x1 ) + 45.0 * ( x2 - xm1 ) +
984 13.0 * ( xm2 - x3 ) + 3.0 * ( x4 - xm3 )) * 1.31578947368421052e-2;
1005 const double xm2,
const double xm1,
const double x0,
const double x1,
1006 const double x2,
const double x3,
const double x4 )
1009 c[ 1 ] = ( 61.0 * ( x1 - xm1 ) + 16.0 * ( xm2 - x2 ) +
1010 3.0 * ( x3 - xm3 )) * 1.31578947368421052e-2;
1012 c[ 2 ] = ( 106.0 * ( xm1 + x1 ) + 10.0 * x3 + 6.0 * xm3 - 3.0 * x4 -
1013 29.0 * ( xm2 + x2 ) - 167.0 * x0 ) * 1.31578947368421052e-2;
1028 c[ 1 ] = 0.5 * ( y[ 2 ] - y[ 0 ]);
1029 c[ 2 ] = y[ 0 ] - 2.5 * y[ 1 ] + y[ 2 ] + y[ 2 ] - 0.5 * y[ 3 ];
1030 c[ 3 ] = 0.5 * ( y[ 3 ] - y[ 0 ] ) + 1.5 * ( y[ 1 ] - y[ 2 ]);
1045 c[ 1 ] = ( 11.0 * ( y[ 3 ] - y[ 1 ]) + 2.0 * ( y[ 0 ] - y[ 4 ])) / 14.0;
1046 c[ 2 ] = ( 20.0 * ( y[ 1 ] + y[ 3 ]) + 2.0 * y[ 5 ] - 4.0 * y[ 0 ] -
1047 7.0 * y[ 4 ] - 31.0 * y[ 2 ]) / 14.0;
1049 c[ 3 ] = ( 17.0 * ( y[ 2 ] - y[ 3 ]) + 9.0 * ( y[ 4 ] - y[ 1 ]) +
1050 2.0 * ( y[ 0 ] - y[ 5 ])) / 14.0;
1062template<
typename T >
1063inline T
min(
const T& v1,
const T& v2 )
1065 return( v1 < v2 ? v1 : v2 );
1079template<
typename T >
1080inline T
max(
const T& v1,
const T& v2 )
1082 return( v1 > v2 ? v1 : v2 );
1097inline double clampr(
const double Value,
const double minv,
1120inline double sqr(
const double x )
1132inline double pow_a(
const double v,
const double p )
1134 return( exp( p * log( fabs( v ) + 1e-300 )));
1144 return( exp( -( v * v )));
1154 return( log( v + sqrt( v * v + 1.0 )));
1166 const double ax = fabs( x );
1174 return( 1.0 + y * ( 3.5156229 + y * ( 3.0899424 + y * ( 1.2067492 +
1175 y * ( 0.2659732 + y * ( 0.360768e-1 + y * 0.45813e-2 ))))));
1180 return( exp( ax ) / sqrt( ax ) * ( 0.39894228 + y * ( 0.1328592e-1 +
1181 y * ( 0.225319e-2 + y * ( -0.157565e-2 + y * ( 0.916281e-2 +
1182 y * ( -0.2057706e-1 + y * ( 0.2635537e-1 + y * ( -0.1647633e-1 +
1183 y * 0.392377e-2 )))))))));
#define R8B_PI
Definition: r8bbase.h:119
#define R8B_2PI
Definition: r8bbase.h:126
#define R8BNOCTOR(ClassName)
Definition: r8bbase.h:154
The "configuration" inclusion file you can modify.
#define R8BASSERT(e)
Definition: r8bconf.h:27
#define R8B_MEMALLOCCLASS
Definition: r8bconf.h:63
The "r8brain-free-src" library namespace.
Definition: CDSPBlockConvolver.h:21
T * alignptr(T *const ptr, const uintptr_t align)
Definition: r8bbase.h:279
double calcFIRFilterGroupDelay(const double *const flt, const int fltlen, const double th)
Definition: r8bbase.h:872
void calcSpline3p4Coeffs(double *const c, const double *const y)
Definition: r8bbase.h:1025
double pow_a(const double v, const double p)
Definition: r8bbase.h:1132
void calcFIRFilterResponse(const double *flt, int fltlen, const double th, double &re0, double &im0, const int fltlat=0)
Definition: r8bbase.h:817
void calcSpline3p6Coeffs(double *const c, const double *const y)
Definition: r8bbase.h:1042
T min(const T &v1, const T &v2)
Definition: r8bbase.h:1063
void calcSpline3p8Coeffs(double *const c, const double xm3, const double xm2, const double xm1, const double x0, const double x1, const double x2, const double x3, const double x4)
Definition: r8bbase.h:972
int getBitOccupancy(const int v)
Definition: r8bbase.h:766
double asinh(const double v)
Definition: r8bbase.h:1152
T max(const T &v1, const T &v2)
Definition: r8bbase.h:1080
double clampr(const double Value, const double minv, const double maxv)
Definition: r8bbase.h:1097
void calcSpline2p8Coeffs(double *const c, const double xm3, const double xm2, const double xm1, const double x0, const double x1, const double x2, const double x3, const double x4)
Definition: r8bbase.h:1004
double gauss(const double v)
Definition: r8bbase.h:1142
double besselI0(const double x)
Definition: r8bbase.h:1164
void normalizeFIRFilter(double *const p, const int l, const double DCGain, const int pstep=1)
Definition: r8bbase.h:928
double sqr(const double x)
Definition: r8bbase.h:1120
The default base class for objects created on heap.
Definition: r8bbase.h:167
The default base class for objects that allocate blocks of memory.
Definition: r8bbase.h:229
static void * reallocmem(void *const p, const size_t Size)
Definition: r8bbase.h:251
static void * allocmem(const size_t Size)
Definition: r8bbase.h:238
static void freemem(void *const p)
Definition: r8bbase.h:262
Templated memory buffer class for element buffers of fixed capacity.
Definition: r8bbase.h:304
void alloc(const int Capacity)
Definition: r8bbase.h:343
void free()
Definition: r8bbase.h:391
CFixedBuffer(const int Capacity)
Definition: r8bbase.h:321
void realloc(const int PrevCapacity, const int NewCapacity)
Definition: r8bbase.h:363
Pointer-to-object "keeper" class with automatic deletion.
Definition: r8bbase.h:428
void operator=(T2 const aObject)
Definition: r8bbase.h:464
CPtrKeeper(T2 const aObject)
Definition: r8bbase.h:445
void reset()
Definition: r8bbase.h:492
T operator->() const
Definition: r8bbase.h:474
T unkeep()
Definition: r8bbase.h:504
Multi-threaded synchronization object class.
Definition: r8bbase.h:526
void acquire()
Definition: r8bbase.h:557
void release()
Definition: r8bbase.h:571
A "keeper" class for CSyncObject-based synchronization.
Definition: r8bbase.h:600
CSyncKeeper(CSyncObject &aSyncObj)
Definition: r8bbase.h:628
CSyncKeeper(CSyncObject *const aSyncObj)
Definition: r8bbase.h:614
Sine signal generator class.
Definition: r8bbase.h:671
CSineGen(const double si, const double ph)
Definition: r8bbase.h:685
CSineGen(const double si, const double ph, const double g)
Definition: r8bbase.h:701
void init(const double si, const double ph, const double g)
Definition: r8bbase.h:732
void init(const double si, const double ph)
Definition: r8bbase.h:716
double generate()
Definition: r8bbase.h:743