Introduced fd_real_t to allow fbuf_t internal data vectors to be type double.

This commit is contained in:
kevin 2023-01-05 07:22:37 -05:00
parent c9e4745d3e
commit b9e01aa288
5 changed files with 110 additions and 83 deletions

View File

@ -260,4 +260,21 @@ namespace cw
return kOkRC;
}
}
/*
namespace spec_dist
{
rc_t _test_one( const object_t* arg, )
{
}
rc_t create( struct obj_str<T0,T1>*& p, unsigned binN, bool bypassFl=false, T1 ceiling=30, T1 expo=2, T1 thresh=60, T1 uprSlope=0, T1 lwrSlope=2, T1 mix=0 )
rc_t test( const object_t* args )
{
}
}
*/
}

View File

@ -538,17 +538,17 @@ namespace cw
kCalcHzPvaFl = 0x01,
};
template< typename T >
template< typename T0, typename T1 >
struct obj_str
{
struct shift_buf::obj_str<T>* sb;
struct fft::obj_str<T>* ft;
struct wnd_func::obj_str<T>* wf;
struct phs_to_frq::obj_str<T>* pf;
struct shift_buf::obj_str<T0>* sb;
struct wnd_func::obj_str<T0>* wf;
struct fft::obj_str<T1>* ft;
struct phs_to_frq::obj_str<T1>* pf;
unsigned flags;
unsigned procSmpCnt;
T srate;
T1 srate;
unsigned maxWndSmpCnt;
unsigned maxBinCnt;
@ -557,21 +557,21 @@ namespace cw
unsigned hopSmpCnt;
unsigned binCnt;
const T* magV; // amplitude NOT power - alias to ft->magV
const T* phsV; // alias to ft->phsV
const T* hzV;
const T1* magV; // amplitude NOT power - alias to ft->magV
const T1* phsV; // alias to ft->phsV
const T1* hzV;
};
typedef obj_str< float > fobj_t;
typedef obj_str< double> dobj_t;
typedef obj_str< float, float > fobj_t;
typedef obj_str< double, double> dobj_t;
template< typename T >
rc_t create( struct obj_str<T>*& p, unsigned procSmpCnt, const T& srate, unsigned maxWndSmpCnt, unsigned wndSmpCnt, unsigned hopSmpCnt, unsigned flags )
template< typename T0, typename T1 >
rc_t create( struct obj_str<T0,T1>*& p, unsigned procSmpCnt, const T1& srate, unsigned maxWndSmpCnt, unsigned wndSmpCnt, unsigned hopSmpCnt, unsigned flags )
{
rc_t rc = kOkRC;
p = mem::allocZ< struct obj_str<T> >();
p = mem::allocZ< struct obj_str<T0,T1> >();
shift_buf::create( p->sb, procSmpCnt, maxWndSmpCnt, wndSmpCnt, hopSmpCnt );
wnd_func::create( p->wf, wnd_func::kHannWndId | wnd_func::kNormByLengthWndFl, maxWndSmpCnt, wndSmpCnt, 0 );
@ -593,8 +593,8 @@ namespace cw
return rc;
}
template< typename T >
rc_t destroy( struct obj_str<T>*& p )
template< typename T0, typename T1 >
rc_t destroy( struct obj_str<T0,T1>*& p )
{
if( p != nullptr )
{
@ -607,15 +607,19 @@ namespace cw
return kOkRC;
}
template< typename T >
bool exec( struct obj_str<T>* p, const T* x, unsigned xN )
template< typename T0, typename T1 >
bool exec( struct obj_str<T0,T1>* p, const T0* x, unsigned xN )
{
bool fl = false;
while( shift_buf::exec(p->sb,x,xN) )
{
wnd_func::exec(p->wf, p->sb->outV, p->sb->wndSmpCnt );
fft::exec(p->ft, p->wf->outV, p->wf->wndN);
// convert float to double
T1 cvtV[ p->wf->wndN ];
vop::copy(cvtV, p->wf->outV, p->wf->wndN );
fft::exec(p->ft, cvtV, p->wf->wndN);
if( cwIsFlag(p->flags,kCalcHzPvaFl) )
phs_to_frq::exec(p->pf,p->phsV);
@ -627,8 +631,8 @@ namespace cw
}
template< typename T >
rc_t set_window_length( struct obj_str<T>* p, unsigned wndSmpCnt )
template< typename T0, typename T1 >
rc_t set_window_length( struct obj_str<T0,T1>* p, unsigned wndSmpCnt )
{
rc_t rc;
@ -645,20 +649,20 @@ namespace cw
namespace pv_syn
{
template< typename T >
template< typename T0, typename T1 >
struct obj_str
{
ifft::obj_str<T>* ft;
wnd_func::obj_str<T>* wf;
ola::obj_str<T>* ola;
ifft::obj_str<T1>* ft;
wnd_func::obj_str<T0>* wf;
ola::obj_str<T0>* ola;
T* minRphV;
T* maxRphV;
T* itrV;
T* phs0V;
T* mag0V;
T* phsV;
T* magV;
T1* minRphV;
T1* maxRphV;
T1* itrV;
T1* phs0V;
T1* mag0V;
T1* phsV;
T1* magV;
double outSrate;
unsigned procSmpCnt;
@ -668,15 +672,15 @@ namespace cw
};
typedef obj_str< float > fobj_t;
typedef obj_str< double> dobj_t;
typedef obj_str< float, float > fobj_t;
typedef obj_str< double, double > dobj_t;
template< typename T >
rc_t create( struct obj_str<T>*& p, unsigned procSmpCnt, const T& outSrate, unsigned wndSmpCnt, unsigned hopSmpCnt, unsigned wndTypeId=wnd_func::kHannWndId )
template< typename T0, typename T1 >
rc_t create( struct obj_str<T0,T1>*& p, unsigned procSmpCnt, const T1& outSrate, unsigned wndSmpCnt, unsigned hopSmpCnt, unsigned wndTypeId=wnd_func::kHannWndId )
{
rc_t rc = kOkRC;
p = mem::allocZ< struct obj_str<T> >();
p = mem::allocZ< struct obj_str<T0,T1> >();
int k;
double twoPi = 2.0 * M_PI;
@ -689,13 +693,13 @@ namespace cw
p->hopSmpCnt = hopSmpCnt;
p->binCnt = wndSmpCnt / 2 + 1;
p->minRphV = mem::allocZ<T>( p->binCnt );
p->maxRphV = mem::allocZ<T>( p->binCnt );
p->itrV = mem::allocZ<T>( p->binCnt );
p->phs0V = mem::allocZ<T>( p->binCnt );
p->phsV = mem::allocZ<T>( p->binCnt );
p->mag0V = mem::allocZ<T>( p->binCnt );
p->magV = mem::allocZ<T>( p->binCnt );
p->minRphV = mem::allocZ<T1>( p->binCnt );
p->maxRphV = mem::allocZ<T1>( p->binCnt );
p->itrV = mem::allocZ<T1>( p->binCnt );
p->phs0V = mem::allocZ<T1>( p->binCnt );
p->phsV = mem::allocZ<T1>( p->binCnt );
p->mag0V = mem::allocZ<T1>( p->binCnt );
p->magV = mem::allocZ<T1>( p->binCnt );
wnd_func::create( p->wf, wndTypeId, wndSmpCnt, wndSmpCnt, 0);
@ -707,8 +711,8 @@ namespace cw
// complete revolutions per hop in radians
p->itrV[k] = twoPi * floor((double)k * hopSmpCnt / wndSmpCnt );
p->minRphV[k] = ((T)(k-m)) * hopSmpCnt * twoPi / wndSmpCnt;
p->maxRphV[k] = ((T)(k+m)) * hopSmpCnt * twoPi / wndSmpCnt;
p->minRphV[k] = ((T1)(k-m)) * hopSmpCnt * twoPi / wndSmpCnt;
p->maxRphV[k] = ((T1)(k+m)) * hopSmpCnt * twoPi / wndSmpCnt;
//printf("%f %f %f\n",p->itrV[k],p->minRphV[k],p->maxRphV[k]);
}
@ -716,8 +720,8 @@ namespace cw
return rc;
}
template< typename T >
rc_t destroy( struct obj_str<T>*& p )
template< typename T0, typename T1 >
rc_t destroy( struct obj_str<T0,T1>*& p )
{
if( p != nullptr )
{
@ -738,8 +742,8 @@ namespace cw
return kOkRC;
}
template< typename T >
rc_t exec( struct obj_str<T>* p, const T* magV, const T* phsV )
template< typename T0, typename T1 >
rc_t exec( struct obj_str<T0,T1>* p, const T1* magV, const T1* phsV )
{
double twoPi = 2.0 * M_PI;
@ -748,7 +752,7 @@ namespace cw
for(k=0; k<p->binCnt; ++k)
{
// phase dist between cur and prv frame
T dp = phsV[k] - p->phs0V[k];
T1 dp = phsV[k] - p->phs0V[k];
// dist must be positive (accum phase always increases)
if( dp < -0.00001 )
@ -775,7 +779,11 @@ namespace cw
ifft::exec_polar( p->ft, magV, phsV );
ola::exec( p->ola, p->ft->outV, p->ft->outN );
// convert double to float
T0 v[ p->ft->outN ];
vop::copy( v, p->ft->outV, p->ft->outN );
ola::exec( p->ola, v, p->ft->outN );
//printf("%i %i\n",p->binCnt,p->ft.binCnt );
@ -978,7 +986,8 @@ namespace cw
// get the mean output magnitude spectra
double u1 = vop::mean(X1m,binN);
if( p->mix > 0 )
//if( p->mix > 0 )
if(1)
{
if( idb > -150.0 )
{
@ -998,8 +1007,8 @@ namespace cw
if( p->bypassFl )
vop::copy( p->outMagV, magV, binN );
else
vop::mul( p->outMagV, X1m, std::min((T1)4.0,p->ogain), binN);
//vop::mul( p->outMagV, X1m, p->ogain, binN);
//vop::mul( p->outMagV, X1m, std::min((T1)4.0,p->ogain), binN);
vop::mul( p->outMagV, X1m, p->ogain, binN);
vop::copy( p->outPhsV, phsV, binN);
@ -1225,7 +1234,6 @@ namespace cw
}
rc_t test( const cw::object_t* args );
} // dsp

View File

@ -6,8 +6,9 @@ namespace cw
namespace dsp
{
typedef float real_t;
typedef real_t sample_t;
typedef real_t srate_t;
typedef float sample_t;
typedef double fd_real_t;
typedef double srate_t;
}
}
#endif

View File

@ -903,7 +903,7 @@ const cw::flow::sample_t* cw::flow::abuf_get_channel( abuf_t* abuf, unsigned c
return abuf->buf + (chIdx*abuf->frameN);
}
cw::flow::fbuf_t* cw::flow::fbuf_create( srate_t srate, unsigned chN, const unsigned* maxBinN_V, const unsigned* binN_V, const unsigned* hopSmpN_V, const sample_t** magV, const sample_t** phsV, const sample_t** hzV )
cw::flow::fbuf_t* cw::flow::fbuf_create( srate_t srate, unsigned chN, const unsigned* maxBinN_V, const unsigned* binN_V, const unsigned* hopSmpN_V, const fd_real_t** magV, const fd_real_t** phsV, const fd_real_t** hzV )
{
for(unsigned i=0; i<chN; ++i)
if( binN_V[i] > maxBinN_V[i] )
@ -919,9 +919,9 @@ cw::flow::fbuf_t* cw::flow::fbuf_create( srate_t srate, unsigned chN, const unsi
f->maxBinN_V = mem::allocZ<unsigned>(chN);
f->binN_V = mem::allocZ<unsigned>(chN);
f->hopSmpN_V = mem::allocZ<unsigned>(chN);
f->magV = mem::allocZ<sample_t*>(chN);
f->phsV = mem::allocZ<sample_t*>(chN);
f->hzV = mem::allocZ<sample_t*>(chN);
f->magV = mem::allocZ<fd_real_t*>(chN);
f->phsV = mem::allocZ<fd_real_t*>(chN);
f->hzV = mem::allocZ<fd_real_t*>(chN);
f->readyFlV = mem::allocZ<bool>(chN);
vop::copy( f->binN_V, binN_V, chN );
@ -932,17 +932,17 @@ cw::flow::fbuf_t* cw::flow::fbuf_create( srate_t srate, unsigned chN, const unsi
{
for(unsigned chIdx=0; chIdx<chN; ++chIdx)
{
f->magV[ chIdx ] = (sample_t*)magV[chIdx];
f->phsV[ chIdx ] = (sample_t*)phsV[chIdx];
f->hzV[ chIdx ] = (sample_t*)hzV[chIdx];
f->magV[ chIdx ] = (fd_real_t*)magV[chIdx];
f->phsV[ chIdx ] = (fd_real_t*)phsV[chIdx];
f->hzV[ chIdx ] = (fd_real_t*)hzV[chIdx];
}
}
else
{
unsigned maxTotalBinsN = vop::sum( maxBinN_V, chN );
sample_t* buf = mem::allocZ<sample_t>( kFbufVectN * maxTotalBinsN );
sample_t* m = buf;
fd_real_t* buf = mem::allocZ<fd_real_t>( kFbufVectN * maxTotalBinsN );
fd_real_t* m = buf;
for(unsigned chIdx=0; chIdx<chN; ++chIdx)
{
f->magV[chIdx] = m + 0 * f->binN_V[chIdx];
@ -960,7 +960,7 @@ cw::flow::fbuf_t* cw::flow::fbuf_create( srate_t srate, unsigned chN, const unsi
}
cw::flow::fbuf_t* cw::flow::fbuf_create( srate_t srate, unsigned chN, unsigned maxBinN, unsigned binN, unsigned hopSmpN, const sample_t** magV, const sample_t** phsV, const sample_t** hzV )
cw::flow::fbuf_t* cw::flow::fbuf_create( srate_t srate, unsigned chN, unsigned maxBinN, unsigned binN, unsigned hopSmpN, const fd_real_t** magV, const fd_real_t** phsV, const fd_real_t** hzV )
{
unsigned maxBinN_V[ chN ];
unsigned binN_V[ chN ];
@ -1367,7 +1367,7 @@ cw::rc_t cw::flow::var_register_and_set( instance_t* inst, const char* va
return rc;
}
cw::rc_t cw::flow::var_register_and_set( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, srate_t srate, unsigned chN, const unsigned* maxBinN_V, const unsigned* binN_V, const unsigned* hopSmpN_V, const sample_t** magV, const sample_t** phsV, const sample_t** hzV )
cw::rc_t cw::flow::var_register_and_set( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, srate_t srate, unsigned chN, const unsigned* maxBinN_V, const unsigned* binN_V, const unsigned* hopSmpN_V, const fd_real_t** magV, const fd_real_t** phsV, const fd_real_t** hzV )
{
rc_t rc = kOkRC;
fbuf_t* fbuf;
@ -1380,7 +1380,7 @@ cw::rc_t cw::flow::var_register_and_set( instance_t* inst, const char* var_label
return rc;
}
cw::rc_t cw::flow::var_register_and_set( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, srate_t srate, unsigned chN, unsigned maxBinN, unsigned binN, unsigned hopSmpN, const sample_t** magV, const sample_t** phsV, const sample_t** hzV )
cw::rc_t cw::flow::var_register_and_set( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, srate_t srate, unsigned chN, unsigned maxBinN, unsigned binN, unsigned hopSmpN, const fd_real_t** magV, const fd_real_t** phsV, const fd_real_t** hzV )
{
unsigned maxBinN_V[ chN ];
unsigned binN_V[ chN ];

View File

@ -6,6 +6,7 @@ namespace cw
#define kRealTFl kFloatTFl
typedef dsp::real_t real_t;
typedef dsp::sample_t sample_t;
typedef dsp::fd_real_t fd_real_t;
typedef dsp::srate_t srate_t;
typedef unsigned uint_t;
typedef int int_t;
@ -38,11 +39,11 @@ namespace cw
unsigned* maxBinN_V; // max value that binN_V[i] is allowed to take
unsigned* binN_V; // binN_V[ chN ] count of sample frames per channel
unsigned* hopSmpN_V; // hopSmpN_V[ chN ] hop sample count
sample_t** magV; // magV[ chN ][ binN ]
sample_t** phsV; // phsV[ chN ][ binN ]
sample_t** hzV; // hzV[ chN ][ binN ]
fd_real_t** magV; // magV[ chN ][ binN ]
fd_real_t** phsV; // phsV[ chN ][ binN ]
fd_real_t** hzV; // hzV[ chN ][ binN ]
bool* readyFlV; // readyFlV[chN] true if this channel is ready to be processed (used to sync. fbuf rate to abuf rate)
sample_t* buf; // memory used by this buffer (or NULL if magV,phsV,hzV point are proxied to another buffer)
fd_real_t* buf; // memory used by this buffer (or NULL if magV,phsV,hzV point are proxied to another buffer)
} fbuf_t;
enum
@ -191,12 +192,12 @@ namespace cw
void* userPtr; // instance state
variable_t* varL; // list of all variables on this instance
variable_t* varL; // linked list of all variables on this instance
unsigned varMapChN; // max count of channels among all variables
unsigned varMapIdN;
unsigned varMapN; // varMapN
variable_t** varMapA; // varMapA[ varMapN ]
unsigned varMapChN; // max count of channels (max 'chIdx' + 2) among all variables on this instance, (2=kAnyChIdx+index to count)
unsigned varMapIdN; // max 'vid' among all variables on this instance
unsigned varMapN; // varMapN = varMapIdN * varMapChN
variable_t** varMapA; // varMapA[ varMapN ] = allows fast lookup from ('vid','chIdx) to variable
struct instance_str* link;
} instance_t;
@ -234,8 +235,8 @@ namespace cw
rc_t abuf_set_channel( abuf_t* buf, unsigned chIdx, const sample_t* v, unsigned vN );
const sample_t* abuf_get_channel( abuf_t* buf, unsigned chIdx );
fbuf_t* fbuf_create( srate_t srate, unsigned chN, const unsigned* maxBinN_V, const unsigned* binN_V, const unsigned* hopSmpN_V, const sample_t** magV=nullptr, const sample_t** phsV=nullptr, const sample_t** hzV=nullptr );
fbuf_t* fbuf_create( srate_t srate, unsigned chN, unsigned maxBinN, unsigned binN, unsigned hopSmpN, const sample_t** magV=nullptr, const sample_t** phsV=nullptr, const sample_t** hzV=nullptr );
fbuf_t* fbuf_create( srate_t srate, unsigned chN, const unsigned* maxBinN_V, const unsigned* binN_V, const unsigned* hopSmpN_V, const fd_real_t** magV=nullptr, const fd_real_t** phsV=nullptr, const fd_real_t** hzV=nullptr );
fbuf_t* fbuf_create( srate_t srate, unsigned chN, unsigned maxBinN, unsigned binN, unsigned hopSmpN, const fd_real_t** magV=nullptr, const fd_real_t** phsV=nullptr, const fd_real_t** hzV=nullptr );
void fbuf_destroy( fbuf_t*& buf );
fbuf_t* fbuf_duplicate( const fbuf_t* src );
@ -370,8 +371,8 @@ namespace cw
rc_t var_register_and_set( instance_t* inst, const char* label, unsigned vid, unsigned chIdx, variable_t*& varRef );
rc_t var_register_and_set( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, srate_t srate, unsigned chN, unsigned frameN );
rc_t var_register_and_set( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, srate_t srate, unsigned chN, const unsigned* maxBinN_V, const unsigned* binN_V, const unsigned* hopSmpN_V, const sample_t** magV=nullptr, const sample_t** phsV=nullptr, const sample_t** hzV=nullptr );
rc_t var_register_and_set( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, srate_t srate, unsigned chN, unsigned maxBinN, unsigned binN, unsigned hopSmpN, const sample_t** magV=nullptr, const sample_t** phsV=nullptr, const sample_t** hzV=nullptr );
rc_t var_register_and_set( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, srate_t srate, unsigned chN, const unsigned* maxBinN_V, const unsigned* binN_V, const unsigned* hopSmpN_V, const fd_real_t** magV=nullptr, const fd_real_t** phsV=nullptr, const fd_real_t** hzV=nullptr );
rc_t var_register_and_set( instance_t* inst, const char* var_label, unsigned vid, unsigned chIdx, srate_t srate, unsigned chN, unsigned maxBinN, unsigned binN, unsigned hopSmpN, const fd_real_t** magV=nullptr, const fd_real_t** phsV=nullptr, const fd_real_t** hzV=nullptr );
inline rc_t _var_register_and_set(cw::flow::instance_t*, unsigned int ) { return kOkRC; }