88template <
typename T =
int16_t,
size_t N = 3>
123 float threshold_percent,
const char* name) {
135 size_t write(
const uint8_t* buf,
size_t size)
override {
141 if (fft_cfg.ref !=
this || fft_cfg.callback !=
fftResult) {
155 for (
size_t j = 0; j < N; j++) {
158 self->_recent_frames.push_back(frame);
160 if (self->_is_recording) {
164 if (self->_recent_frames.size() > self->_max_template_len)
165 self->_recent_frames.erase(self->_recent_frames.begin());
166 for (
size_t i = 0; i < self->_templates.size(); ++i) {
167 Template& tmpl = self->_templates[i];
168 if (self->_recent_frames.size() >= tmpl.
frames.size()) {
169 float percent = self->matchTemplate(tmpl);
171 if (self->_callback) self->_callback(tmpl.
name);
190 for (
size_t i = 0; i < tmpl.
frames.size(); ++i) {
191 size_t frame_matches = 0;
192 for (
size_t j = 0; j < N; ++j) {
193 if (tmpl.
frames[i].top_freqs[j] ==
197 if (frame_matches >= (N >= 2 ? N - 1 : 1))
200 float percent = (tmpl.
frames.size() > 0)
201 ? (100.0f * matches / tmpl.
frames.size())