arduino-audio-tools
Loading...
Searching...
No Matches
FrequencyDetectorZeroCrossing.h
Go to the documentation of this file.
1#pragma once
2
5
6namespace audio_tools {
7
21 public:
26
32
38 p_out = ∈
39 p_in = ∈
40 };
41
49 return AudioStream::begin();
50 }
51
55 int available() override {
56 if (p_in) return p_in->available();
57 return 0;
58 }
59
63 int availableForWrite() override {
64 if (p_out) return p_out->availableForWrite();
66 }
67
74 size_t readBytes(uint8_t* data, size_t len) override {
75 size_t result = p_in->readBytes(data, len);
76 switch (info.bits_per_sample) {
77 case 16:
78 detect<int16_t>((int16_t*)data, len / sizeof(int16_t));
79 break;
80 case 24:
81 detect<int24_t>((int24_t*)data, len / sizeof(int24_t));
82 break;
83 case 32:
84 detect<int32_t>((int32_t*)data, len / sizeof(int32_t));
85 break;
86 }
87 return result;
88 }
89
96 virtual size_t write(const uint8_t* data, size_t len) override {
97 switch (info.bits_per_sample) {
98 case 16:
99 detect<int16_t>((int16_t*)data, len / sizeof(int16_t));
100 break;
101 case 24:
102 detect<int24_t>((int24_t*)data, len / sizeof(int24_t));
103 break;
104 case 32:
105 detect<int32_t>((int32_t*)data, len / sizeof(int32_t));
106 break;
107 }
108
109 size_t result = len;
110 if (p_out != nullptr) result = p_out->write(data, len);
111 return result;
112 }
113
119 float frequency(int channel) {
120 if (channel >= info.channels) {
121 LOGE("Invalid channel: %d", channel);
122 return 0;
123 }
124 return states[channel].freq;
125 }
126
131 void setFrequencyCallback(void (*callback)(int channel, float freq)) {
132 freq_callback = callback;
133 }
134
135 protected:
140 int count = 0;
141 bool active = false;
142 float freq = 0.0f;
143 };
145 Print* p_out = nullptr;
146 Stream* p_in = nullptr;
147 int count = 0;
148 bool active = false;
149 void (*freq_callback)(int channel, float freq);
150
157 template <class T>
158 void detect(T* samples, size_t len) {
159 states.resize(info.channels);
160 for (int ch = 0; ch < info.channels; ch++) {
161 detectChannel(ch, samples, len);
162 }
163 }
164
172 template <class T>
173 void detectChannel(int channel, T* samples, size_t len) {
174 ChannelState& state = states[channel];
175 for (int i = channel; i < (int)(len - info.channels); i += info.channels) {
176 if (state.active) state.count++;
177 // Detect upward zero crossing (negative to positive)
178 if (samples[i] <= 0 && samples[i + info.channels] > 0) {
179 if (state.count > 0) {
180 state.freq = (1.0f * info.sample_rate) / state.count;
181 if (freq_callback) freq_callback(channel, state.freq);
182 }
183 state.count = 0;
184 state.active = true;
185 }
186 }
187 }
188};
189
190} // namespace audio_tools
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
Definition Arduino.h:56
virtual int availableForWrite()
Definition Arduino.h:128
virtual size_t write(const uint8_t *data, size_t len)
Definition Arduino.h:120
Definition Arduino.h:136
virtual size_t readBytes(uint8_t *data, size_t len)
Definition Arduino.h:140
virtual int available()
Definition Arduino.h:139
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:120
AudioInfo info
Definition BaseStream.h:171
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition BaseStream.h:128
virtual bool begin()
Definition BaseStream.h:40
Detects frequency using upward zero crossings in audio samples.
Definition FrequencyDetectorZeroCrossing.h:20
Vector< ChannelState > states
State for each channel.
Definition FrequencyDetectorZeroCrossing.h:144
virtual size_t write(const uint8_t *data, size_t len) override
Writes bytes to the output stream and processes them for frequency detection.
Definition FrequencyDetectorZeroCrossing.h:96
bool active
Counting active flag (unused, kept for compatibility)
Definition FrequencyDetectorZeroCrossing.h:148
void detect(T *samples, size_t len)
Detects frequency for all channels using zero crossing method.
Definition FrequencyDetectorZeroCrossing.h:158
Stream * p_in
Input stream pointer.
Definition FrequencyDetectorZeroCrossing.h:146
void setFrequencyCallback(void(*callback)(int channel, float freq))
Sets a callback function to be called when a new frequency is detected.
Definition FrequencyDetectorZeroCrossing.h:131
size_t readBytes(uint8_t *data, size_t len) override
Reads bytes from the input stream and processes them for frequency detection.
Definition FrequencyDetectorZeroCrossing.h:74
int available() override
Returns the number of bytes available for reading.
Definition FrequencyDetectorZeroCrossing.h:55
FrequencyDetectorZeroCrossing(Stream &in)
Construct with input stream.
Definition FrequencyDetectorZeroCrossing.h:37
int availableForWrite() override
Returns the number of bytes available for writing.
Definition FrequencyDetectorZeroCrossing.h:63
Print * p_out
Output stream pointer.
Definition FrequencyDetectorZeroCrossing.h:145
FrequencyDetectorZeroCrossing(Print &out)
Construct with output stream.
Definition FrequencyDetectorZeroCrossing.h:31
void(* freq_callback)(int channel, float freq)
Frequency callback function.
Definition FrequencyDetectorZeroCrossing.h:149
void detectChannel(int channel, T *samples, size_t len)
Detects frequency for a single channel by counting upward zero crossings.
Definition FrequencyDetectorZeroCrossing.h:173
FrequencyDetectorZeroCrossing()=default
Default constructor.
int count
Sample count (unused, kept for compatibility)
Definition FrequencyDetectorZeroCrossing.h:147
float frequency(int channel)
Returns the last detected frequency for the given channel.
Definition FrequencyDetectorZeroCrossing.h:119
bool begin(AudioInfo info)
Initialize with audio configuration.
Definition FrequencyDetectorZeroCrossing.h:47
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
24bit integer which is used for I2S sound processing. The values are represented as int32_t,...
Definition int24_4bytes_t.h:22
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:51
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:53
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:55
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:57
Holds state for each channel during zero crossing detection.
Definition FrequencyDetectorZeroCrossing.h:139
bool active
True if counting is active.
Definition FrequencyDetectorZeroCrossing.h:141
float freq
Last detected frequency.
Definition FrequencyDetectorZeroCrossing.h:142
int count
Sample count since last zero crossing.
Definition FrequencyDetectorZeroCrossing.h:140