24 #include "cheetah/sps/detail/RfiExcision.h" 31 template<
typename TimeFrequencyType,
typename RfiFlagDataType>
32 RfiExcision<TimeFrequencyType, RfiFlagDataType>::RfiExcision( RfiFlagDataType& data,
size_t offset,
float ideal_rms,
float threshold,
bool active)
33 : _flag_it(data.rfi_flags().begin() + offset)
34 , _tf_it(data.tf_data().begin() + offset)
36 , _ideal_rms(ideal_rms)
37 , _threshold(threshold)
39 , _tf_end_it(data.tf_data().cend())
41 assert(data.rfi_flags().data_size() == data.tf_data().data_size());
46 typedef typename RfiFlagDataType::Statistics Statistics;
47 auto channel_stats = data.channel_stats();
48 auto subband_nchans = channel_stats.size() / 8;
49 std::nth_element(channel_stats.begin() + 2*subband_nchans, channel_stats.begin() + (std::size_t)(2.5)*subband_nchans, channel_stats.begin() + 3*subband_nchans - 1,
50 [](Statistics
const& s1, Statistics
const& s2)
52 return s1.mean < s2.mean;
54 _replacement_value = channel_stats[(std::size_t)((2.5)*subband_nchans)].mean;
57 static std::random_device rd;
58 std::seed_seq seed { rd(), rd(), rd(), rd(), rd() };
59 auto e2 = std::mt19937( seed );
60 auto distribution = std::normal_distribution<float>(_replacement_value,_ideal_rms);
61 std::generate(_noise.begin(),_noise.end(), std::bind(distribution, e2));
65 template<
typename TimeFrequencyType,
typename RfiFlagDataType>
66 RfiExcision<TimeFrequencyType, RfiFlagDataType>::~RfiExcision()
70 template<
typename TimeFrequencyType,
typename RfiFlagDataType>
71 bool RfiExcision<TimeFrequencyType, RfiFlagDataType>::operator!=( RfiExcision<TimeFrequencyType, RfiFlagDataType>
const& iterator)
const 73 return this->_tf_it != iterator._tf_it;
76 template<
typename TimeFrequencyType,
typename RfiFlagDataType>
77 bool RfiExcision<TimeFrequencyType, RfiFlagDataType>::operator==( RfiExcision<TimeFrequencyType, RfiFlagDataType>
const& iterator)
const 79 return this->_tf_it == iterator._tf_it;
82 template<
typename TimeFrequencyType,
typename RfiFlagDataType>
83 RfiExcision<TimeFrequencyType, RfiFlagDataType>& RfiExcision<TimeFrequencyType, RfiFlagDataType>::operator++()
88 if(_tf_it!=_tf_end_it)
92 do_replacement = (*(_flag_it)) || (std::fabs((
float) *(_tf_it) - _replacement_value) >= _threshold *_ideal_rms);
94 do_replacement = (*(_flag_it));
98 if (_wrapindex >= _noise.size())
102 _value =
static_cast<NumericalRep
>(_noise[_wrapindex]);
111 template<
typename TimeFrequencyType,
typename RfiFlagDataType>
112 typename RfiExcision<TimeFrequencyType, RfiFlagDataType>::const_reference RfiExcision<TimeFrequencyType, RfiFlagDataType>::operator*()
const Some limits and constants for FLDO.