16class ThresholdDetector {
20 uint32_t waveform_size;
27 explicit ThresholdDetector(
const Config &config)
28 : config_(config), buffer_(config.waveform_size), last_spike_time_(0),
29 collecting_spike_(false), samples_after_threshold_(0),
30 pending_spike_(nullptr),
31 sample_period_ns_(static_cast<uint64_t>(1e9 / config.sample_rate_hz)),
34 void setup(
const Config &config) {
36 buffer_.resize(config.waveform_size);
37 sample_period_ns_ =
static_cast<uint64_t
>(1e9 / config.sample_rate_hz);
41 SpikeEvent *detect(
const float sample,
const uint64_t frame_timestamp,
42 const uint32_t channel_id) {
45 uint64_t sample_timestamp =
46 frame_timestamp + (sample_count_ * sample_period_ns_);
50 buffer_.push_back({sample, sample_timestamp});
53 if (collecting_spike_) {
54 samples_after_threshold_++;
57 const uint32_t samples_after_needed = config_.waveform_size / 2;
58 if (samples_after_threshold_ >= samples_after_needed) {
59 collecting_spike_ =
false;
62 pending_spike_->waveform.reserve(buffer_.size());
63 for (
const auto &sample_data : buffer_) {
64 pending_spike_->waveform.push_back(sample_data.value);
67 SpikeEvent *
event = pending_spike_;
68 pending_spike_ =
nullptr;
76 const bool threshold_crossed = sample <= -std::abs(config_.threshold);
79 if (threshold_crossed &&
80 (sample_timestamp - last_spike_time_ >= config_.refractory_period)) {
81 last_spike_time_ = sample_timestamp;
82 collecting_spike_ =
true;
83 samples_after_threshold_ = 0;
86 pending_spike_ =
new SpikeEvent();
89 pending_spike_->timestamp = sample_timestamp;
90 pending_spike_->channel_id = channel_id;
91 pending_spike_->waveform.reserve(buffer_.size());
101 for (
size_t i = 0; i < buffer_.size(); i++) {
102 buffer_.push_back({0.0f, 0});
105 collecting_spike_ =
false;
106 samples_after_threshold_ = 0;
107 last_spike_time_ = 0;
110 if (pending_spike_) {
111 delete pending_spike_;
112 pending_spike_ =
nullptr;
124 std::deque<SampleData> buffer_;
125 uint64_t last_spike_time_;
126 bool collecting_spike_;
128 samples_after_threshold_;
129 SpikeEvent *pending_spike_;
130 uint64_t sample_period_ns_;