/*======================================================================*/
/* */
/* SOURCE_FILE: MMPNS.MXGC */
/* PACKAGE: PNS */
/* COMPONENT: METHMPF */
/* */
/* Copyright 1995: Philips Electronics N.V.. */
/* */
/*======================================================================*/
/*======================================================================*/
/* I N C L U D E S */
/*======================================================================*/
/* STANDARD INCLUDES */
#include <algorithm>
#include "infra/isyslib/math.h"
#include "infra/iosinterface/oslanguage.h" /* standard language extensions */
#include "infra/iosinterface/oscglo.h"
#include "infra/iosinterface/oslogglo.h"
#include "infra/iosinterface/ostrcglo.h"
#include "infra/iosinterface/osstrglo.h"
#include "infra/iosinterface/osmsgglo.h"
#include "infra/isuperglo/sgvecglo.h"
#include "infra/isuperglo/sgmath.h"
#include "infra/iaswglo/awdefglo.h"
#include "infra/idatamonitoring/extmon.h"
#include "METHGLO/inc/mggpars_mxgcglo.h" /*< GOAL_MODULE >*/
#include "METHGLO/inc/mggobjsglo.h" /*< GOAL_MODULE >*/
#include "mrmethods/igoalobj/maobjglo.h" /* object package handling */
#include "METACQGLO/inc/maobjsqrcd.gc" /*< GOAL_MODULE >*/
#include "METACQGLO/inc/maobjmcuircd.gc" /*< GOAL_MODULE >*/
#include "METACQGLO/inc/maobjfercd.gc" /*< GOAL_MODULE >*/
#include "METACQGLO/inc/maobjaqrcd.gc" /*< GOAL_MODULE >*/
#include "METACQGLO/inc/maobjlcarcd.gc" /*< GOAL_MODULE >*/
/*----------------------------------------------------------------------*/
/* include prototypes and definitions of OBJ and PARS packages */
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
/* G package */
/*----------------------------------------------------------------------*/
#include "METHGLO/inc/mgrclabrcd.h" /*< GOAL_MODULE >*/
#include "mrmethods/ighw/mgghwrcd.h" /*< GOAL_MODULE >*/
#include "METHMPF/inc/mmgglo.h"
/*----------------------------------------------------------------------*/
/* P package */
/*----------------------------------------------------------------------*/
#include "METHGLO/inc/mgpgnrcd.h" /*< GOAL_MODULE >*/
#include "METHGLO/inc/mgpnsrcd.h" /*< GOAL_MODULE >*/
#include "METHGLO/inc/mgpfrcrcd.h" /*< GOAL_MODULE >*/
#include "METHMPF/inc/mmpgnglo.h"
#include "METHMPF/inc/mmpnsglo.h"
#include "METHGLO/inc/mgurfercd.h" /*< GOAL_MODULE >*/
/*======================================================================*/
/* G L O B A L R E F E R E N C E S */
/*======================================================================*/
/*======================================================================*/
/* G L O B A L D E F I N I T I O N S */
/*======================================================================*/
/*======================================================================*/
/* L O C A L S Y M B O L D E F I N I T I O N S */
/*======================================================================*/
/*======================================================================*/
/* L O C A L D A T A D E F I N I T I O N S */
/*======================================================================*/
using namespace datamonitoring;
typedef struct {
double noise_level;
int subvector;
int channel;
} NOISE_DESC_STRUCT;
OSTRC_DEF( debug, "MMPNS", "debug");
OSTRC_DEF( data, "MMPNS", "data");
/*======================================================================*/
/* L O C A L F U N C T I O N P R O T O T Y P E S */
/*======================================================================*/
static void pns_check( const COMPLEX_INT raw_data[], int nr_samples, int nr_channels,
BIT_MASK act_channels, int stack,
BOOLEAN *opmessage_generated_ptr,
BOOLEAN *statlogging_generated_ptr,
int coil);
static bool pns_compare_cb( const NOISE_DESC_STRUCT &noise_1, const NOISE_DESC_STRUCT &noise_2);
static int pns_vector_to_channel( int subvector, BIT_MASK channels);
static double pns_calc_mean( const vector<NOISE_DESC_STRUCT> &noise_desc_arr, int begin, int end);
static float pns_rand();
static double sq( double val);
static double safe_divide( double a, double b);
/*MPF:::PNS::MMPNS.MXGC:MMPNS_scan======================================*/
/* */
/* FUNCTION NAME: MMPNS_scan */
/* PACKAGE: PNS */
/* SCOPE: METHMPF */
/* CALLING SEQUENCE: */
void MMPNS_scan(
int lca_id)
/*EMP===================================================================*/
{
int stack;
BOOLEAN opmessage_generated = FALSE;
BOOLEAN statlogging_generated = FALSE;
OSLOG_success( NULL, " NOISE: noise level determination" );
AQ`NS:rear_switch = OFF;
AQ`NS:dest = MGOBJAQ_DEST_RECON_DAS;
SQ`NS:enable = ON;
SQ`:begin();
for ( stack = 0; MGOBJ_IS_NOT_EMPTY( `MP_CPR_FRC_loc[ stack ] ); stack++)
{
int loc = `MP_CPR_FRC_loc[ stack ];
int fe_id = LCA`( lca_id ):[ loc ]:AQ_fe_object;
AQ`NS:freq_factor1 = LCA`( lca_id ):[ loc ]:m_freq_factor;
AQ`NS:data_class = ARRC_CTRL_FRC_NOISE_DATA;
AQ`NS:location = loc;
/*--------------------------------------------------------------*/
/* set SQ and AQ attributes */
/*--------------------------------------------------------------*/
AQ`NS:FE = fe_id;
OSLOG_success( NULL,
"NS: stack %c coil %2d, conn %d, gain (flt): %5.3f, gain_act: %5.3f",
stack + 'A', FE`( fe_id ):coil, FE`( fe_id ):connection,
AQ`NS:gain, AQ`NS:gain_act );
SQ`NS:perform();
SQ`:pause();
AQ`:get_responses( MMPGN_raw_data, 1, false);
int nr_samples = AQ`NS:samples_act;
int nr_channels = AQ`NS:nr_channels_enabled;
MAOBJ_ASSERT( nr_samples * nr_channels < MMPGN_RAW_DATA_SIZE);
const COMPLEX_INT *raw_data_aptr = REINTERPRET_CAST( COMPLEX_INT*, &MMPGN_raw_data[0]);
if ( AWASW_system_type() != AWASW_ST_SCANNER )
{
COMPLEX_INT *raw_data = const_cast<COMPLEX_INT *>(raw_data_aptr);
srand( 1234);
float amp = 10. * AQ`NS:gain_act;
int j = 0;
for (int ch = 0; ch < nr_channels; ch++)
{
for (int i = 0; i < nr_samples; i++)
{
float u = amp * pns_rand();
float v = amp * pns_rand();
COMPLEX_INT cval = { ROUND( u), ROUND( v)};
raw_data[ j++ ] = cval;
}
}
}
pns_check( raw_data_aptr,
nr_samples,
nr_channels,
AQ`NS:act_channels,
stack,
&opmessage_generated,
&statlogging_generated,
FE`( fe_id ):coil);
} /* stack loop */
SQ`:end();
`PR_NS_result = MGP_RESULT_SUCCESS;
}
/*======================================================================*/
/* pns_rand */
/*======================================================================*/
static float pns_rand()
{
float u = rand() / (double) RAND_MAX; // distribution uniform on [0:1]
float v = 2 * u - 1; // distribution uniform on [-1:1]
return v * (1 + 0.33333 * v * v); // distribution 1/(x*x + 1) on [-2:2]
}
/*======================================================================*/
/* pns_check */
/*======================================================================*/
static void pns_check(
const COMPLEX_INT raw_data[],
int nr_samples,
int nr_channels,
BIT_MASK act_channels,
int stack,
BOOLEAN *opmessage_generated_ptr,
BOOLEAN *statlogging_generated_ptr,
int coil)
{
MAOBJ_ASSERT( nr_samples * nr_channels > 0);