Files
klubhaus-doorbell/libraries/audio-tools/examples/examples-audiokit/streams-audiokit-goertzel/streams-audiokit-goertzel.ino
2026-02-12 21:00:02 -08:00

87 lines
2.4 KiB
C++

// Example for DTMF detection using Goertzel algorithm
// Uses AudioKit and I2S microphones as input
#include "AudioTools.h"
#include "AudioTools/AudioLibs/AudioBoardStream.h"
AudioInfo info(44100, 2, 16); // 8kHz, mono, 16 bits
AudioBoardStream kit(AudioKitEs8388V1); // Access I2S as stream
//CsvOutput<int16_t> out(Serial, 1);
GoertzelStream goertzel; //(out);
StreamCopy copier(goertzel, kit); // copy kit to georzel
// represent DTMF keys
class DTMF {
public:
enum Dimension { Row, Col };
DTMF() = default;
DTMF(Dimension d, int i) {
if (d == Row)
row = i;
else
col = i;
}
void clear() {
row = -1;
col = -1;
}
char getChar() {
if (row == -1 || col == -1) return '?';
return keys[row][col];
}
int row = -1;
int col = -1;
const char* keys[4] = {"123A", "456B", "789C", "*0#D"};
} actual_dtmf;
// combine row and col information
void GoetzelCallback(float frequency, float magnitude, void* ref) {
DTMF* dtmf = (DTMF*)ref;
LOGW("Time: %lu - Hz: %f Mag: %f", millis(), frequency, magnitude);
// we get either row or col information
if (dtmf->row != -1) {
actual_dtmf.row = dtmf->row;
} else {
actual_dtmf.col = dtmf->col;
// print detected key
Serial.println(actual_dtmf.getChar());
actual_dtmf.clear();
}
}
void setup() {
Serial.begin(115200);
AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning);
// start audio input from microphones
auto cfg = kit.defaultConfig(RX_MODE);
cfg.copyFrom(info);
cfg.sd_active = false;
cfg.input_device = ADC_INPUT_LINE2;
cfg.use_apll = false;
kit.begin(cfg);
// lower frequencies - with keys
goertzel.addFrequency(697, new DTMF(DTMF::Row, 0));
goertzel.addFrequency(770, new DTMF(DTMF::Row, 1));
goertzel.addFrequency(852, new DTMF(DTMF::Row, 2));
goertzel.addFrequency(941, new DTMF(DTMF::Row, 3));
// higher frequencies with idx
goertzel.addFrequency(1209, new DTMF(DTMF::Col, 0));
goertzel.addFrequency(1336, new DTMF(DTMF::Col, 1));
goertzel.addFrequency(1477, new DTMF(DTMF::Col, 2));
goertzel.addFrequency(1633, new DTMF(DTMF::Col, 3));
// define callback
goertzel.setFrequencyDetectionCallback(GoetzelCallback);
// start goertzel
auto gcfg = goertzel.defaultConfig();
gcfg.copyFrom(info);
gcfg.threshold = 5.0;
gcfg.block_size = 1024;
goertzel.begin(gcfg);
}
void loop() { copier.copy(); }