arduino-audio-tools
Loading...
Searching...
No Matches
MDFEchoCancellationStream.h
1#pragma once
2
3#include "AudioTools/CoreAudio/AudioStreams.h"
4#include "AudioTools/CoreAudio/Buffers.h"
5#include "MDFEchoCancellation.h"
6
7namespace audio_tools {
8
20template <typename Allocator = std::allocator<uint8_t>>
22 public:
30 MDFEchoCancellationStream(Stream& in, int filterLength,
31 AudioFFTBase& fftDriver,
32 const Allocator& alloc = Allocator())
33 : p_io(&in),
34 p_fft(&fftDriver),
35 canceller(getFrameSize(), filterLength, fftDriver, alloc) {}
36
46 MDFEchoCancellationStream(Stream& in, int filterLength,
47 AudioFFTBase& fftDriver,
48 const Allocator& alloc = Allocator())
49 : p_io(&in),
50 p_fft(&fftDriver),
51 canceller(getFrameSize(), filterLength, fftDriver,
52 alloc) {}
53
60 size_t write(const uint8_t* buf, size_t len) override {
61 return canceller.write(buf, len);
62 }
63
70 size_t readBytes(uint8_t* buf, size_t len) override {
71 size_t read = p_io->readBytes(buf, len);
72 size_t samples = read / sizeof(echo_int16_t);
73 int frame_size = getFrameSize();
74
75 if (samples >= (size_t)frame_size) {
76 canceller.capture((const echo_int16_t*)buf, (echo_int16_t*)buf);
77 return frame_size * sizeof(echo_int16_t);
78 }
79 return read;
80 }
81
82 void setAudioInfo(AudioInfo info) override {
84 canceller.setSamplingRate(info.sample_rate);
85 canceller.setMicChannels(info.channels);
86 canceller.setSpeakerChannels(info.channels);
87 }
88
93 void setFilterLen(int len) { canceller.setFilterLen(len); }
94
99 int getFilterLen() { return canceller.getFilterLen(); }
100
104 void reset() { canceller.reset(); }
105
111
112 protected:
113 Stream* p_io = nullptr;
114 AudioFFTBase* p_fft = nullptr;
116
122 if (p_fft) {
123 return p_fft->config().length;
124 }
125 return 512; // default fallback
126 }
127};
128
129} // namespace audio_tools
Memory allocateator which uses malloc.
Definition Allocator.h:23
Executes FFT using audio data privded by write() and/or an inverse FFT where the samples are made ava...
Definition AudioFFT.h:191
AudioFFTConfig & config()
Provides the actual configuration.
Definition AudioFFT.h:639
Base class for all Audio Streams. It support the boolean operator to test if the object is ready with...
Definition BaseStream.h:122
virtual void setAudioInfo(AudioInfo newInfo) override
Defines the input AudioInfo.
Definition BaseStream.h:130
Acoustic echo canceller using MDF algorithm.
Definition MDFEchoCancellation.h:508
MDF (Multi-Delay block Frequency) echo cancellation with stream API.
Definition MDFEchoCancellationStream.h:21
int getFilterLen()
Get filter length.
Definition MDFEchoCancellationStream.h:99
size_t readBytes(uint8_t *buf, size_t len) override
Read input and remove echo (using buffered playback)
Definition MDFEchoCancellationStream.h:70
int getFrameSize()
Get frame size from FFT configuration.
Definition MDFEchoCancellationStream.h:121
void setAudioInfo(AudioInfo info) override
Defines the input AudioInfo.
Definition MDFEchoCancellationStream.h:82
void reset()
Reset echo canceller state.
Definition MDFEchoCancellationStream.h:104
size_t write(const uint8_t *buf, size_t len) override
Store the output signal (sent to speaker)
Definition MDFEchoCancellationStream.h:60
MDFEchoCancellationStream(Stream &in, int filterLength, AudioFFTBase &fftDriver, const Allocator &alloc=Allocator())
Constructor (single channel)
Definition MDFEchoCancellationStream.h:30
void setFilterLen(int len)
Set filter length (number of filter blocks)
Definition MDFEchoCancellationStream.h:93
MDFEchoCancellation< Allocator > & getEchoCanceller()
Get underlying MDF echo canceller instance.
Definition MDFEchoCancellationStream.h:110
Definition NoArduino.h:142
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:55
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:57
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:59