#ifndef cwVectOps_h #define cwVectOps_h namespace cw { namespace vop { //================================================================================================================== // Input / Output // template< typename T0 > void print( const T0* v0, unsigned n, const char* fmt, const char* label=nullptr, unsigned colN=0 ) { bool newline_fl = false; if( label != nullptr ) { printf("%s : ",label); if( colN && n > colN ) { printf("\n"); newline_fl = true; } } if( colN == 0 ) colN = n; for(unsigned i=0; i void copy( T0* v0, const T1* v1, unsigned n ) { for(unsigned i=0; i void fill( T0* v, unsigned n, const T1& value=0 ) { for(unsigned i=0; i void zero( T* v, unsigned n ) { fill(v,n,0); } //================================================================================================================== // Compare // template< typename T0, typename T1 > bool is_equal( const T0* v0, const T1* v1, unsigned n ) { for(unsigned i=0; i unsigned arg_max( const T* v, unsigned n ) { if( n == 0 ) return kInvalidIdx; unsigned mi = 0; for(unsigned i=1; i v[mi]) mi = i; return mi; } template< typename T > unsigned arg_min( const T* v, unsigned n ) { if( n == 0 ) return kInvalidIdx; unsigned mi = 0; for(unsigned i=1; i const T max( const T* v, unsigned n ) { unsigned mi; if((mi = arg_max(v,n)) == kInvalidIdx ) return std::numeric_limits::max(); return v[mi]; } template< typename T > const T min( const T* v, unsigned n ) { unsigned mi; if((mi = arg_min(v,n)) == kInvalidIdx ) return std::numeric_limits::max(); return v[mi]; } template< typename T0, typename T1 > T0 mac( const T0* v0, const T1* v1, unsigned n ) { T0 acc = 0; for(unsigned i=0; i void mul( T0* v0, const T1* v1, unsigned n ) { for(unsigned i=0; i void mul( T0* y0, const T0* v0, const T1* v1, unsigned n ) { for(unsigned i=0; i void mul( T0* v0, const T1& scalar, unsigned n ) { for(unsigned i=0; i void mul( T0* y0, const T0* v0, const T1& scalar, unsigned n ) { for(unsigned i=0; i void add( T0* v0, const T1* v1, unsigned n ) { for(unsigned i=0; i void add( T0* y0, const T0* v0, const T1* v1, unsigned n ) { for(unsigned i=0; i void add( T0* v0, const T1& scalar, unsigned n ) { for(unsigned i=0; i void add( T0* y0, const T0* v0, const T1& scalar, unsigned n ) { for(unsigned i=0; i void div( T0* v0, const T1* v1, unsigned n ) { for(unsigned i=0; i void div( T0* y0, const T0* v0, const T1* v1, unsigned n ) { for(unsigned i=0; i void div( T0* v0, const T1& denom, unsigned n ) { for(unsigned i=0; i void div( T0* y0, const T0* v0, const T1& denom, unsigned n ) { for(unsigned i=0; i void sub( T0* v0, const T1* v1, unsigned n ) { for(unsigned i=0; i void sub( T0* y0, const T0* v0, const T1* v1, unsigned n ) { for(unsigned i=0; i void sub( T0* v0, const T1& scalar, unsigned n ) { for(unsigned i=0; i void sub( T0* y0, const T0* v0, const T1& scalar, unsigned n ) { for(unsigned i=0; i void seq( T* y, unsigned n, const T& beg, const T& cnt, const T& step ) { if( cnt < n ) n = cnt; T v = beg; for(unsigned i=0; i T* linspace( T* y, unsigned yN, T base, T limit ) { unsigned i = 0; for(; i T seq( T* dbp, unsigned dn, const T& beg, const T& incr ) { const T* dep = dbp + dn; unsigned i = 0; for(; dbp T sum( const T* v, unsigned n ) { T y = 0; for(unsigned i=0; i T prod( const T* v, unsigned n ) { T y = 1; for(unsigned i=0; i T0 sum_sq_diff( const T0* v0, const T1* v1, unsigned n ) { T0 sum = 0; for(unsigned i=0; i T mean( const T* v, unsigned n ) { if( n == 0 ) return 0; return sum(v,n)/n; } //================================================================================================================== // Signal Processing // template< typename T > unsigned phasor( T* y, unsigned n, T srate, T hz, unsigned init_idx=0 ) { for(unsigned i=init_idx; i unsigned sine( T* y, unsigned n, T srate, T hz, unsigned init_idx=0 ) { init_idx = phasor(y,n,srate,hz,init_idx); for(unsigned i=0; i T* ampl_to_db( T* dbp, const T* sbp, unsigned dn, T minDb=-1000 ) { T minVal = pow(10.0,minDb/20.0); T* dp = dbp; T* ep = dp + dn; for(; dp T* db_to_ampl( T* dbp, const T* sbp, unsigned dn, T minDb=-1000 ) { T* dp = dbp; T* ep = dp + dn; for(; dp T rms( const T* x, unsigned xN ) { T rms = 0; if( xN > 0 ) { T x0[ xN ]; mul(x0,x,x,xN); rms = std::sqrt(sum(x0,xN)/(T)xN); } return rms; } } } #endif