// lasp_ppm.h // // Author: J.A. de Jong - ASCEE // // Description: Peak Programme Meter #pragma once #include "lasp_filter.h" #include "lasp_mathtypes.h" #include "lasp_threadedindatahandler.h" /** * \addtogroup dsp * @{ * * \addtogroup rt * @{ */ /** * @brief Digital Peak Programme Meter (PPM). Let the latest maximum flow away * with a certain amount of dB/s. If a new peak is found, it goes up again. * Also detects clipping. * */ class PPMHandler : public ThreadedInDataHandler { /** * @brief Assuming full scale of a signal is +/- 1.0. If a value is found */ static inline const d clip_point = 0.98; /** * @brief How long it takes in [s] after a clip event has happened, that we * are actually still in 'clip' mode. */ static inline const d clip_indication_time = 3.0; const d _decay_dBps; /** * @brief Inverse of block sampling frequency [s]: (framesPerBlock/fs) */ d _dt; /** * @brief 1st order low_pass value of levels, based on _decay_dBps; */ d _alpha; mutable std::mutex _mtx; /** * @brief Current maximum values */ vd _cur_max; /** * @brief How long ago the last clip has happened. Negative in case no clip * has happened. */ vd _clip_time; /** * @brief Storage for maximum values */ vd _max_range; public: /** * @brief Constructs Peak Programme Meter * * @param mgr Stream Mgr to install callbacks for * @param decay_dBps The level decay in units dB/s, after a peak has been * hit. */ PPMHandler(SmgrHandle mgr,const d decay_dBps = 20.0); ~PPMHandler(); /** * @brief Get the current values of the PPM. Returns an array of levels in dB * and a vector of True's. * * @return Current levels in [dB], clipping indication */ std::tuple getCurrentValue() const; /** * @brief Implements callback on thread * * @param d DaqData to work with * * @return true when stream should continue. */ void inCallback(const DaqData& d); void reset(const Daq*); }; /** @} */ /** @} */