arduino-audio-tools
Loading...
Searching...
No Matches
EchoCancellation.h
1#pragma once
2
3#include "AudioTools/CoreAudio/AudioStreams.h"
4#include "AudioTools/CoreAudio/Buffers.h"
5
6namespace audio_tools {
15template <typename T = int16_t>
17 public:
25 EchoCancellation(Stream& in, size_t lag_samples = 0, size_t buffer_size = 512,
26 size_t filter_len = 32, float mu = 0.001f)
27 : lag(lag_samples),
28 buffer_size(buffer_size),
29 filter_len(filter_len),
30 adaptation_rate(mu) {
31 p_io = &in;
32 filter.resize(filter_len, 0.0f);
33 reset();
34 }
35
42 size_t write(const uint8_t* buf, size_t len) override {
43 // Store output signal in queue for echo estimation
44 return ring_buffer.writeArray((T*)buf, len / sizeof(T)) *
45 sizeof(T);
46 }
47
54 size_t readBytes(uint8_t* buf, size_t len) override {
55 size_t read = p_io->readBytes(buf, len);
56 size_t actual_samples = read / sizeof(T);
57 T* data = (T*)buf;
58 Vector<T> ref_vec(filter_len, 0);
59 ring_buffer.peekArray(ref_vec.data(), filter_len);
60 for (size_t i = 0; i < actual_samples; ++i) {
61 // Build the reference vector for the adaptive filter
62 float echo_est = 0.0f;
63 for (size_t k = 0; k < filter_len; ++k) {
64 echo_est += filter[k] * ref_vec[k];
65 }
66 float mic = (float)data[i];
67 float error = mic - echo_est;
68 data[i] = (T)error;
69 // LMS update
70 for (size_t k = 0; k < filter_len; ++k) {
71 filter[k] += adaptation_rate * error * ref_vec[k];
72 }
73 T dummy;
74 ring_buffer.read(dummy); // Advance the queue
75 // Shift ref_vec left and append dummy
76 for (size_t k = 0; k < filter_len - 1; ++k) {
77 ref_vec[k] = ref_vec[k + 1];
78 }
79 ref_vec[filter_len - 1] = dummy;
80 }
81 return read;
82 }
83
88 void setLag(size_t lag_samples) { lag = lag_samples; }
89
94 void setMu(float mu) { adaptation_rate = mu; }
95
100 void setFilterLen(size_t len) {
101 filter_len = len;
102 filter.resize(filter_len, 0.0f);
103 }
104
108 void reset() {
109 ring_buffer.resize(buffer_size + lag);
110 for (size_t j = 0; j < lag; j++) {
111 ring_buffer.write(0);
112 }
113 filter.assign(filter_len, 0.0f);
114 }
115
116 protected:
117 Stream* p_io = nullptr;
118 RingBuffer<T> ring_buffer{0};
119 size_t buffer_size;
120 size_t lag; // lag in samples
121 // Adaptive filter
122 size_t filter_len;
123 float adaptation_rate = 0.01f;
124 Vector<float> filter;
125};
126
127} // namespace audio_tools
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:122
virtual int writeArray(const T data[], int len)
Fills the buffer data.
Definition Buffers.h:55
Echo cancellation with adaptive LMS filtering for microcontrollers.
Definition EchoCancellation.h:16
void setFilterLen(size_t len)
Set the filter length for the adaptive filter.
Definition EchoCancellation.h:100
void setLag(size_t lag_samples)
Set the lag (delay) in samples for echo cancellation.
Definition EchoCancellation.h:88
size_t readBytes(uint8_t *buf, size_t len) override
Read input and remove echo (subtract output signal with lag)
Definition EchoCancellation.h:54
void reset()
Reset the internal buffer and lag state.
Definition EchoCancellation.h:108
size_t write(const uint8_t *buf, size_t len) override
Store the output signal (sent to speaker)
Definition EchoCancellation.h:42
void setMu(float mu)
Set the adaptation rate (mu) for the LMS algorithm.
Definition EchoCancellation.h:94
EchoCancellation(Stream &in, size_t lag_samples=0, size_t buffer_size=512, size_t filter_len=32, float mu=0.001f)
Constructor.
Definition EchoCancellation.h:25
Implements a typed Ringbuffer.
Definition Buffers.h:341
bool read(T &result) override
reads a single value
Definition Buffers.h:348
virtual bool write(T data) override
write add an entry to the buffer
Definition Buffers.h:391
virtual bool resize(int len)
Resizes the buffer if supported: returns false if not supported.
Definition Buffers.h:418
Definition NoArduino.h:142
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10