00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00138 #ifndef BPMWAVE_H_LOADED__
00139 #define BPMWAVE_H_LOADED__
00140
00141
00142
00143
00144 #include <math.h>
00145 #include <float.h>
00146 #include <stdio.h>
00147 #include <stdlib.h>
00148
00149 #include "bpm/bpm_defs.h"
00150 #include "bpm/bpm_units.h"
00151 #include "bpm/bpm_messages.h"
00152 #include "bpm/bpm_nr.h"
00153
00154
00155
00156
00157 #define WF_EPS 1.e-10
00158 #define MAX_ALLOWED_NS 262144
00160 #define WF_NEAREST 0x0000
00161 #define WF_LINEAR 0x0001
00162 #define WF_QUADRATIC 0x0002
00163 #define WF_SINC 0x0004
00164 #define WF_LANCZOS 0x0008
00166
00167
00168
00169 #ifdef __cplusplus
00170 extern "C" {
00171 #endif
00172
00174 typedef struct {
00175 int ns;
00176 double fs;
00177 double *wf;
00178 } doublewf_t;
00179
00181 typedef struct {
00182 int ns;
00183 double fs;
00184 int *wf;
00185 } intwf_t;
00186
00188 typedef struct {
00189 int ns;
00190 double fs;
00191 complex_t *wf;
00192 } complexwf_t;
00193
00194
00196 typedef struct {
00197 int imax;
00198 int imin;
00199 double max;
00200 double min;
00201 double mean;
00202 double rms;
00203 } wfstat_t;
00204
00205
00206
00207
00208
00209
00210
00214 EXTERN int wfstat_reset( wfstat_t *s );
00215
00216
00221 EXTERN void wfstat_print( FILE *of, wfstat_t *s );
00222
00223
00224
00225
00230 EXTERN doublewf_t* doublewf( int ns, double fs );
00231
00232
00238 EXTERN doublewf_t* doublewf_time_series( int ns, double fs );
00239
00240
00246 EXTERN doublewf_t* doublewf_sample_series( int ns, double fs );
00247
00248
00254 EXTERN doublewf_t* doublewf_frequency_series( int ns, double fs );
00255
00256
00263 EXTERN int doublewf_setvalues( doublewf_t *w, double *x );
00264
00265
00276 EXTERN int doublewf_setfunction( doublewf_t *w,
00277 double (*wffun)( double t, int, double* ),
00278 int npars, double *par );
00279
00280
00288 EXTERN int doublewf_copy( doublewf_t *copy, doublewf_t *src );
00289
00290
00294 EXTERN doublewf_t* doublewf_copy_new( doublewf_t *w );
00295
00296
00306 EXTERN int doublewf_subset( doublewf_t *sub, doublewf_t *w, int i1, int i2 );
00307
00308
00312 EXTERN int doublewf_reset( doublewf_t *w );
00313
00314
00318 EXTERN void doublewf_delete( doublewf_t *w );
00319
00320
00327 EXTERN intwf_t* intwf_cast_new( doublewf_t *w );
00328
00329
00335 EXTERN int intwf_cast( intwf_t *iw, doublewf_t *w );
00336
00337
00345 EXTERN int doublewf_compat( doublewf_t *w1, doublewf_t *w2 );
00346
00347
00353 EXTERN int doublewf_add( doublewf_t *w1, doublewf_t *w2 );
00354
00355
00361 EXTERN int doublewf_subtract( doublewf_t *w1, doublewf_t *w2 );
00362
00363
00369 EXTERN int doublewf_multiply( doublewf_t *w1, doublewf_t *w2 );
00370
00371
00378 EXTERN int doublewf_divide( doublewf_t *w1, doublewf_t *w2 );
00379
00380
00386 EXTERN int doublewf_scale( double f, doublewf_t *w );
00387
00388
00394 EXTERN int doublewf_bias( double c, doublewf_t *w );
00395
00396
00405 EXTERN int doublewf_add_cwtone( doublewf_t *w, double amp, double phase, double freq,
00406 double phasenoise );
00407
00408
00422 EXTERN int doublewf_add_dcywave( doublewf_t *w, double amp, double phase, double freq,
00423 double ttrig, double tdcy, double phasenoise );
00424
00425
00430 EXTERN int doublewf_add_ampnoise( doublewf_t *w, double sigma );
00431
00432
00433
00441 EXTERN int doublewf_basic_stats( doublewf_t *w, int s0, int s1, wfstat_t *stats );
00442
00443
00447 EXTERN int doublewf_derive( doublewf_t *w );
00448
00452 EXTERN int doublewf_integrate( doublewf_t *w );
00453
00454
00460 EXTERN void doublewf_print( FILE *of, doublewf_t *w );
00461
00462
00470 EXTERN double doublewf_getvalue( doublewf_t *w, double t, unsigned int mode );
00471
00472
00485 EXTERN int doublewf_resample( doublewf_t *w2, double fs, doublewf_t *w1, unsigned int mode );
00486
00487
00488
00489
00490
00491
00496 EXTERN intwf_t* intwf( int ns, double fs );
00497
00503 EXTERN intwf_t* intwf_sample_series( int ns, double fs );
00504
00505
00512 EXTERN int intwf_setvalues( intwf_t *w, int *x );
00513
00514
00525 EXTERN int intwf_setfunction( intwf_t *w,
00526 int (*wffun)( double t, int, double* ),
00527 int npars, double *par );
00528
00529
00537 EXTERN int intwf_copy( intwf_t *copy, intwf_t *src );
00538
00539
00543 EXTERN intwf_t* intwf_copy_new( intwf_t *w );
00544
00545
00555 EXTERN int intwf_subset( intwf_t *sub, intwf_t *w, int i1, int i2 );
00556
00557
00561 EXTERN int intwf_reset( intwf_t *w );
00562
00563
00567 EXTERN void intwf_delete( intwf_t *w );
00568
00569
00576 EXTERN doublewf_t* doublewf_cast_new( intwf_t *w );
00577
00578
00584 EXTERN int doublewf_cast( doublewf_t *w, intwf_t *iw );
00585
00586
00594 EXTERN int intwf_compat( intwf_t *w1, intwf_t *w2 );
00595
00596
00602 EXTERN int intwf_add( intwf_t *w1, intwf_t *w2 );
00603
00604
00610 EXTERN int intwf_subtract( intwf_t *w1, intwf_t *w2 );
00611
00612
00618 EXTERN int intwf_multiply( intwf_t *w1, intwf_t *w2 );
00619
00620
00627 EXTERN int intwf_divide( intwf_t *w1, intwf_t *w2 );
00628
00629
00635 EXTERN int intwf_scale( int f, intwf_t *w );
00636
00637
00643 EXTERN int intwf_bias( int c, intwf_t *w );
00644
00645
00654 EXTERN int intwf_add_cwtone( intwf_t *w, double amp, double phase, double freq,
00655 double phasenoise );
00656
00657
00671 EXTERN int intwf_add_dcywave( intwf_t *w, double amp, double phase, double freq,
00672 double ttrig, double tdcy, double phasenoise );
00673
00674
00679 EXTERN int intwf_add_ampnoise( intwf_t *w, double sigma );
00680
00681
00682
00690 EXTERN int intwf_basic_stats( intwf_t *w, int s0, int s1, wfstat_t *stats );
00691
00692
00696 EXTERN int intwf_derive( intwf_t *w );
00697
00701 EXTERN int intwf_integrate( intwf_t *w );
00702
00703
00709 EXTERN void intwf_print( FILE *of, intwf_t *w );
00710
00711
00719 EXTERN int intwf_getvalue( intwf_t *w, double t, unsigned int mode );
00720
00721
00734 EXTERN int intwf_resample( intwf_t *w2, double fs, intwf_t *w1, unsigned int mode );
00735
00736
00737
00738
00739
00744 EXTERN complexwf_t* complexwf( int ns, double fs );
00745
00749 EXTERN complexwf_t* complexwf_copy_new( complexwf_t *w );
00750
00758 EXTERN int complexwf_copy( complexwf_t *copy, complexwf_t *src );
00759
00769 EXTERN int complexwf_subset( complexwf_t *sub, complexwf_t *w, int i1, int i2 );
00770
00771
00778 EXTERN int complexwf_setvalues( complexwf_t *w, complex_t *x );
00779
00790 EXTERN int complexwf_setfunction( complexwf_t *w,
00791 complex_t (*wffun)( double, int, double* ),
00792 int npars, double *par );
00793
00797 EXTERN int complexwf_reset( complexwf_t *w );
00798
00802 EXTERN void complexwf_delete( complexwf_t *w );
00803
00811 EXTERN int complexwf_compat( complexwf_t *w1, complexwf_t *w2 );
00812
00818 EXTERN int complexwf_add( complexwf_t *w1, complexwf_t *w2 );
00819
00825 EXTERN int complexwf_subtract( complexwf_t *w1, complexwf_t *w2 );
00826
00832 EXTERN int complexwf_multiply( complexwf_t *w1, complexwf_t *w2 );
00833
00834
00840 EXTERN int complexwf_divide( complexwf_t *w1, complexwf_t *w2 );
00841
00842
00848 EXTERN int complexwf_scale( complex_t f, complexwf_t *w );
00849
00850
00856 EXTERN int complexwf_bias( complex_t c, complexwf_t *w );
00857
00858
00869 EXTERN int complexwf_add_cwtone( complexwf_t *w, double amp, double phase, double freq,
00870 double phasenoise );
00871
00872
00889 EXTERN int complexwf_add_dcywave( complexwf_t *w, double amp, double phase, double freq,
00890 double ttrig, double tdcy, double phasenoise );
00891
00897 EXTERN int complexwf_add_noise( complexwf_t *w, double sigma );
00898
00899
00905 EXTERN int complexwf_add_ampnoise( complexwf_t *w, double sigma );
00906
00907
00913 EXTERN int complexwf_add_phasenoise( complexwf_t *w, double sigma );
00914
00915
00921 EXTERN void complexwf_print( FILE *of, complexwf_t *w );
00922
00930 EXTERN int complexwf_getreal( doublewf_t *re, complexwf_t *z );
00931
00939 EXTERN int complexwf_getimag( doublewf_t *im, complexwf_t *z );
00940
00948 EXTERN int complexwf_getamp( doublewf_t *r, complexwf_t *z );
00949
00957 EXTERN int complexwf_getphase( doublewf_t *theta, complexwf_t *z );
00958
00965 EXTERN doublewf_t* complexwf_getreal_new( complexwf_t *z );
00966
00973 EXTERN doublewf_t* complexwf_getimag_new( complexwf_t *z );
00974
00981 EXTERN doublewf_t* complexwf_getamp_new( complexwf_t *z );
00982
00989 EXTERN doublewf_t* complexwf_getphase_new( complexwf_t *z );
00990
00998 EXTERN int complexwf_setreal( complexwf_t *z, doublewf_t *re );
00999
01007 EXTERN int complexwf_setimag( complexwf_t *z, doublewf_t *im );
01008
01009
01010 #ifdef __cplusplus
01011 }
01012 #endif
01013
01014 #endif
01015
01016