arduino-audio-tools
Loading...
Searching...
No Matches
Equalizer3Bands.h
Go to the documentation of this file.
1#pragma once
2#include <math.h>
3
4#include "AudioToolsConfig.h"
10
17namespace audio_tools {
18
41 channels = 2;
42 bits_per_sample = 16;
43 sample_rate = 44100;
44 }
45
48 int freq_low = 880;
49
52 int freq_high = 5000;
53
55 float gain_low = 1.0;
56
58 float gain_medium = 1.0;
59
61 float gain_high = 1.0;
62};
63
65
74template <typename T>
75T eqAssignCoeff(float value, const char* name) {
76 T t = value;
77 float roundtrip = (float)t;
78 if (fabs(roundtrip - value) > fabs(value) * 0.01f + 1e-4f) {
79 LOGE(
80 "Equalizer coefficient %s=%f does not fit in the range of T (stored "
81 "as %f) - the equalizer will be inaccurate",
82 name, value, roundtrip);
83 }
84 return t;
85}
86
95template <typename T>
96struct EqDenormalGuard {
97 static T value() { return T(0); }
98};
99template <>
100struct EqDenormalGuard<float> {
101 static float value() { return 1.0f / 4294967295.0f; }
102};
103template <>
104struct EqDenormalGuard<double> {
105 static double value() { return 1.0 / 4294967295.0; }
106};
107
117template <typename IntT, typename T>
118struct EqSampleConverter {
119 static T toEqType(IntT sample, int bits) {
120 return FilterSampleConverter<IntT, T>::toFilterType(sample);
121 }
122 static IntT fromEqType(T value, int bits) {
123 return FilterSampleConverter<IntT, T>::fromFilterType(value);
124 }
125};
126template <typename IntT>
127struct EqSampleConverter<IntT, float> {
128 static float toEqType(IntT sample, int bits) {
129 return NumberConverter::toFloat((int32_t)sample, bits);
130 }
131 static IntT fromEqType(float value, int bits) {
132 return (IntT)NumberConverter::fromFloat(value, bits);
133 }
134};
135
137
171template <typename T = float>
173 public:
177
181
189
194 setStream(stream);
195 addNotifyAudioChange(stream);
196 }
197
199 if (state != nullptr) delete[] state;
200 }
201
204 void setStream(Stream& io) override {
205 p_print = &io;
206 p_stream = &io;
207 };
208
211 void setOutput(Print& out) override { p_print = &out; }
212
216
220
225 p_cfg = &config;
226 return begin();
227 }
228
229 bool begin() {
231
233 if (state != nullptr) delete[] state;
234 state = new EQSTATE[p_cfg->channels];
236 }
237
238 // Setup state
239 for (int j = 0; j < max_state_count; j++) {
240 state[j] = EQSTATE();
241
242 // Calculate filter cutoff frequencies
243 state[j].lf = eqAssignCoeff<T>(
244 2 * sin((float)PI * ((float)p_cfg->freq_low /
245 (float)p_cfg->sample_rate)),
246 "lf");
247 state[j].hf = eqAssignCoeff<T>(
248 2 * sin((float)PI * ((float)p_cfg->freq_high /
249 (float)p_cfg->sample_rate)),
250 "hf");
251 }
252 is_active = true;
253 return true;
254 }
255
256 void end() { is_active = false; }
257
266
271 size_t write(const uint8_t* data, size_t len) override {
272 filterSamples(data, len);
273 return p_print->write(data, len);
274 }
275
278 int availableForWrite() override { return p_print->availableForWrite(); }
279
284 size_t readBytes(uint8_t* data, size_t len) override {
285 size_t result = 0;
286 if (p_stream != nullptr) {
287 result = p_stream->readBytes(data, len);
288 filterSamples(data, len);
289 }
290 return result;
291 }
292
295 int available() override {
296 return p_stream != nullptr ? p_stream->available() : 0;
297 }
298
299 protected:
300 bool is_active = false;
303 const T vsa = EqDenormalGuard<T>::value();
304 Print* p_print = nullptr;
305 Stream* p_stream = nullptr;
307
309 struct EQSTATE {
310 // Filter #1 (Low band) - 4-pole low-pass filter
311 T lf;
316
317 // Filter #2 (High band) - 4-pole high-pass filter
318 T hf;
323
324 // Sample history buffer for filter calculations
328
329 }* state = nullptr;
330
334 void filterSamples(const uint8_t* data, size_t len) {
335 // no filter if not active
336 if (!is_active) return;
337
338 // process samples
339 switch (p_cfg->bits_per_sample) {
340 case 16: {
341 int16_t* p_dataT = (int16_t*)data;
342 size_t sample_count = len / sizeof(int16_t);
343 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
344 for (int ch = 0; ch < p_cfg->channels; ch++) {
345 p_dataT[j + ch] = EqSampleConverter<int16_t, T>::fromEqType(
346 sample(state[ch], EqSampleConverter<int16_t, T>::toEqType(
347 p_dataT[j + ch], 16)),
348 16);
349 }
350 }
351 } break;
352 case 24: {
353 int24_t* p_dataT = (int24_t*)data;
354 size_t sample_count = len / sizeof(int24_t);
355 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
356 for (int ch = 0; ch < p_cfg->channels; ch++) {
357 p_dataT[j + ch] = EqSampleConverter<int24_t, T>::fromEqType(
358 sample(state[ch], EqSampleConverter<int24_t, T>::toEqType(
359 p_dataT[j + ch], 24)),
360 24);
361 }
362 }
363 } break;
364 case 32: {
365 int32_t* p_dataT = (int32_t*)data;
366 size_t sample_count = len / sizeof(int32_t);
367 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
368 for (int ch = 0; ch < p_cfg->channels; ch++) {
369 p_dataT[j + ch] = EqSampleConverter<int32_t, T>::fromEqType(
370 sample(state[ch], EqSampleConverter<int32_t, T>::toEqType(
371 p_dataT[j + ch], 32)),
372 32);
373 }
374 }
375 } break;
376
377 default:
378 LOGE("Only 16 bits supported: %d", p_cfg->bits_per_sample);
379 break;
380 }
381 }
382
388 // Locals
389 T l, m, h; // Low / Mid / High - Sample Values
390 // Filter #1 (lowpass)
391 es.f1p0 += (es.lf * (sample - es.f1p0)) + vsa;
392 es.f1p1 += (es.lf * (es.f1p0 - es.f1p1));
393 es.f1p2 += (es.lf * (es.f1p1 - es.f1p2));
394 es.f1p3 += (es.lf * (es.f1p2 - es.f1p3));
395
396 l = es.f1p3;
397
398 // Filter #2 (highpass)
399 es.f2p0 += (es.hf * (sample - es.f2p0)) + vsa;
400 es.f2p1 += (es.hf * (es.f2p0 - es.f2p1));
401 es.f2p2 += (es.hf * (es.f2p1 - es.f2p2));
402 es.f2p3 += (es.hf * (es.f2p2 - es.f2p3));
403
404 h = es.sdm3 - es.f2p3;
405 // Calculate midrange (signal - (low + high))
406 m = es.sdm3 - (h + l);
407 // Scale, Combine and store
408 l = l * p_cfg->gain_low;
409 m = m * p_cfg->gain_medium;
410 h = h * p_cfg->gain_high;
411
412 // Shuffle history buffer
413 es.sdm3 = es.sdm2;
414 es.sdm2 = es.sdm1;
415 es.sdm1 = sample;
416
417 // Return result
418 return (l + m + h);
419 }
420};
421
426
439template <typename T = float>
441 public:
445
449
457
462 setStream(stream);
463 stream.addNotifyAudioChange(*this);
464 }
465
467 if (state != nullptr) delete[] state;
468 }
469
471 void setStream(Stream& io) override {
472 p_print = &io;
473 p_stream = &io;
474 };
475
477 void setOutput(Print& out) override { p_print = &out; }
478
480
482
487 p_cfg = &config;
488 return begin();
489 }
490
493 bool begin() {
495 // Ensure per-channel arrays are allocated
497
498 // Ensure that EQSTATE is allocated
500 if (state != nullptr) delete[] state;
501 state = new EQSTATE[p_cfg->channels];
503 }
504
505 // Setup state for each channel with its own parameters
506 for (int j = 0; j < p_cfg->channels; j++) {
507 state[j] = EQSTATE();
508
509 // Calculate filter cutoff frequencies per channel
510 state[j].lf = eqAssignCoeff<T>(
511 2 * sin((float)PI *
512 ((float)freq_low[j] / (float)p_cfg->sample_rate)),
513 "lf");
514 state[j].hf = eqAssignCoeff<T>(
515 2 * sin((float)PI *
516 ((float)freq_high[j] / (float)p_cfg->sample_rate)),
517 "hf");
518 }
519 is_active = true;
520 return true;
521 }
522
523 void end() override { is_active = false; }
524
531
536 void setChannelFrequencies(int channel, int freq_low_val, int freq_high_val) {
538 if (channel >= 0 && channel < p_cfg->channels && !freq_low.empty()) {
539 freq_low[channel] = freq_low_val;
540 freq_high[channel] = freq_high_val;
541
542 // Recalculate filter coefficients for this channel
543 if (state != nullptr) {
544 state[channel].lf = eqAssignCoeff<T>(
545 2 * sin((float)PI *
546 ((float)freq_low_val / (float)p_cfg->sample_rate)),
547 "lf");
548 state[channel].hf = eqAssignCoeff<T>(
549 2 * sin((float)PI *
550 ((float)freq_high_val / (float)p_cfg->sample_rate)),
551 "hf");
552 }
553 }
554 }
555
561 void setChannelGains(int channel, float gain_low_val, float gain_medium_val,
562 float gain_high_val) {
564 if (channel >= 0 && channel < p_cfg->channels && !gain_low.empty()) {
565 gain_low[channel] = gain_low_val;
566 gain_medium[channel] = gain_medium_val;
567 gain_high[channel] = gain_high_val;
568 }
569 }
570
576 bool getChannelFrequencies(int channel, int& freq_low_val,
577 int& freq_high_val) {
578 if (channel >= 0 && channel < p_cfg->channels && !freq_low.empty()) {
579 freq_low_val = freq_low[channel];
580 freq_high_val = freq_high[channel];
581 return true;
582 }
583 return false;
584 }
585
592 bool getChannelGains(int channel, float& gain_low_val, float& gain_medium_val,
593 float& gain_high_val) {
594 if (channel >= 0 && channel < p_cfg->channels && !gain_low.empty()) {
595 gain_low_val = gain_low[channel];
596 gain_medium_val = gain_medium[channel];
597 gain_high_val = gain_high[channel];
598 return true;
599 }
600 return false;
601 }
602
607 size_t write(const uint8_t* data, size_t len) override {
608 filterSamples(data, len);
609 return p_print->write(data, len);
610 }
611
614 int availableForWrite() override { return p_print->availableForWrite(); }
615
620 size_t readBytes(uint8_t* data, size_t len) override {
621 size_t result = 0;
622 if (p_stream != nullptr) {
623 result = p_stream->readBytes(data, len);
624 filterSamples(data, len);
625 }
626 return result;
627 }
628
631 int available() override {
632 return p_stream != nullptr ? p_stream->available() : 0;
633 }
634
635 protected:
636 bool is_active = false;
639 const T vsa = EqDenormalGuard<T>::value();
640 Print* p_print = nullptr;
641 Stream* p_stream = nullptr;
643
644 // Per-channel frequency and gain settings using Vector containers
650
651 struct EQSTATE {
652 // Filter #1 (Low band)
653 T lf; // Frequency
654 T f1p0; // Poles ...
658
659 // Filter #2 (High band)
660 T hf; // Frequency
661 T f2p0; // Poles ...
665
666 // Sample history buffer
667 T sdm1; // Sample data minus 1
668 T sdm2; // 2
669 T sdm3; // 3
670
671 }* state = nullptr;
672
679
682 void allocateChannelArrays(int num_channels) {
683 // Resize all vectors to accommodate the number of channels
684 freq_low.resize(num_channels);
685 freq_high.resize(num_channels);
686 gain_low.resize(num_channels);
687 gain_medium.resize(num_channels);
688 gain_high.resize(num_channels);
689
690 // Initialize with config default values
691 for (int i = 0; i < num_channels; i++) {
692 freq_low[i] = p_cfg->freq_low;
694 gain_low[i] = p_cfg->gain_low;
697 }
698 }
699
703 void filterSamples(const uint8_t* data, size_t len) {
704 if (!is_active) return;
705 switch (p_cfg->bits_per_sample) {
706 case 16: {
707 int16_t* p_dataT = (int16_t*)data;
708 size_t sample_count = len / sizeof(int16_t);
709 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
710 for (int ch = 0; ch < p_cfg->channels; ch++) {
711 p_dataT[j + ch] = EqSampleConverter<int16_t, T>::fromEqType(
712 sample(ch, EqSampleConverter<int16_t, T>::toEqType(
713 p_dataT[j + ch], 16)),
714 16);
715 }
716 }
717 } break;
718 case 24: {
719 int24_t* p_dataT = (int24_t*)data;
720 size_t sample_count = len / sizeof(int24_t);
721 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
722 for (int ch = 0; ch < p_cfg->channels; ch++) {
723 p_dataT[j + ch] = EqSampleConverter<int24_t, T>::fromEqType(
724 sample(ch, EqSampleConverter<int24_t, T>::toEqType(
725 p_dataT[j + ch], 24)),
726 24);
727 }
728 }
729 } break;
730 case 32: {
731 int32_t* p_dataT = (int32_t*)data;
732 size_t sample_count = len / sizeof(int32_t);
733 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
734 for (int ch = 0; ch < p_cfg->channels; ch++) {
735 p_dataT[j + ch] = EqSampleConverter<int32_t, T>::fromEqType(
736 sample(ch, EqSampleConverter<int32_t, T>::toEqType(
737 p_dataT[j + ch], 32)),
738 32);
739 }
740 }
741 } break;
742
743 default:
744 LOGE("Only 16 bits supported: %d", p_cfg->bits_per_sample);
745 break;
746 }
747 }
748
754 T sample(int channel, T sample_val) {
755 EQSTATE& es = state[channel];
756
757 // Locals
758 T l, m, h; // Low / Mid / High - Sample Values
759
760 // Filter #1 (lowpass)
761 es.f1p0 += (es.lf * (sample_val - es.f1p0)) + vsa;
762 es.f1p1 += (es.lf * (es.f1p0 - es.f1p1));
763 es.f1p2 += (es.lf * (es.f1p1 - es.f1p2));
764 es.f1p3 += (es.lf * (es.f1p2 - es.f1p3));
765
766 l = es.f1p3;
767
768 // Filter #2 (highpass)
769 es.f2p0 += (es.hf * (sample_val - es.f2p0)) + vsa;
770 es.f2p1 += (es.hf * (es.f2p0 - es.f2p1));
771 es.f2p2 += (es.hf * (es.f2p1 - es.f2p2));
772 es.f2p3 += (es.hf * (es.f2p2 - es.f2p3));
773
774 h = es.sdm3 - es.f2p3;
775
776 // Calculate midrange (signal - (low + high))
777 m = es.sdm3 - (h + l);
778
779 // Scale with per-channel gains
780 l = l * gain_low[channel];
781 m = m * gain_medium[channel];
782 h = h * gain_high[channel];
783
784 // Shuffle history buffer
785 es.sdm3 = es.sdm2;
786 es.sdm2 = es.sdm1;
787 es.sdm1 = sample_val;
788
789 // Return result
790 return (l + m + h);
791 }
792};
793
799
800} // namespace audio_tools
#define PI
Definition AudioEffectsSuite.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
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
virtual void addNotifyAudioChange(AudioInfoSupport &bi)
Adds target to be notified about audio changes.
Definition AudioTypes.h:149
virtual void setAudioInfo(AudioInfo info)=0
Defines the input AudioInfo.
Abstract Audio Ouptut class.
Definition AudioOutput.h:25
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
3 Band Equalizer with per-channel frequency and gain control Allows independent frequency and gain se...
Definition Equalizer3Bands.h:440
int max_state_count
Maximum number of allocated channel states.
Definition Equalizer3Bands.h:642
void setOutput(Print &out) override
Defines/Changes the output target.
Definition Equalizer3Bands.h:477
bool getChannelGains(int channel, float &gain_low_val, float &gain_medium_val, float &gain_high_val)
Definition Equalizer3Bands.h:592
bool getChannelFrequencies(int channel, int &freq_low_val, int &freq_high_val)
Definition Equalizer3Bands.h:576
void allocateChannelArrays(int num_channels)
Definition Equalizer3Bands.h:682
Equalizer3BandsPerChannelT(AudioStream &stream)
Definition Equalizer3Bands.h:461
void filterSamples(const uint8_t *data, size_t len)
Definition Equalizer3Bands.h:703
bool is_active
Definition Equalizer3Bands.h:636
T sample(int channel, T sample_val)
Definition Equalizer3Bands.h:754
size_t readBytes(uint8_t *data, size_t len) override
Definition Equalizer3Bands.h:620
Equalizer3BandsPerChannelT(Stream &in)
Definition Equalizer3Bands.h:448
Vector< int > freq_high
High frequency cutoffs per channel (Hz)
Definition Equalizer3Bands.h:646
bool begin()
Definition Equalizer3Bands.h:493
void end() override
Definition Equalizer3Bands.h:523
bool begin(ConfigEqualizer3Bands &config)
Definition Equalizer3Bands.h:486
int available() override
Definition Equalizer3Bands.h:631
struct audio_tools::Equalizer3BandsPerChannelT::EQSTATE * state
size_t write(const uint8_t *data, size_t len) override
Definition Equalizer3Bands.h:607
ConfigEqualizer3Bands * p_cfg
Pointer to active configuration.
Definition Equalizer3Bands.h:638
ConfigEqualizer3Bands defaultConfig()
Definition Equalizer3Bands.h:481
Stream * p_stream
Input/output stream for read operations.
Definition Equalizer3Bands.h:641
int availableForWrite() override
Definition Equalizer3Bands.h:614
Vector< float > gain_high
High frequency gains per channel.
Definition Equalizer3Bands.h:649
Vector< float > gain_medium
Medium frequency gains per channel.
Definition Equalizer3Bands.h:648
Equalizer3BandsPerChannelT(Print &out)
Definition Equalizer3Bands.h:444
Vector< float > gain_low
Low frequency gains per channel.
Definition Equalizer3Bands.h:647
void setChannelFrequencies(int channel, int freq_low_val, int freq_high_val)
Definition Equalizer3Bands.h:536
const T vsa
Denormal-avoidance offset.
Definition Equalizer3Bands.h:639
virtual void setAudioInfo(AudioInfo info) override
Defines the input AudioInfo.
Definition Equalizer3Bands.h:525
void ensureChannelArraysAllocated()
Ensures that per-channel arrays are allocated and properly sized.
Definition Equalizer3Bands.h:674
~Equalizer3BandsPerChannelT()
Definition Equalizer3Bands.h:466
Print * p_print
Output stream for write operations.
Definition Equalizer3Bands.h:640
Vector< int > freq_low
Low frequency cutoffs per channel (Hz)
Definition Equalizer3Bands.h:645
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition Equalizer3Bands.h:471
ConfigEqualizer3Bands cfg
Default configuration instance.
Definition Equalizer3Bands.h:637
void setChannelGains(int channel, float gain_low_val, float gain_medium_val, float gain_high_val)
Definition Equalizer3Bands.h:561
Equalizer3BandsPerChannelT(AudioOutput &out)
Definition Equalizer3Bands.h:453
ConfigEqualizer3Bands & config()
Definition Equalizer3Bands.h:479
3 Band Equalizer with identical settings for all channels
Definition Equalizer3Bands.h:172
int max_state_count
Maximum number of allocated channel states.
Definition Equalizer3Bands.h:306
void setOutput(Print &out) override
Definition Equalizer3Bands.h:211
Equalizer3BandsT(Stream &in)
Definition Equalizer3Bands.h:180
void filterSamples(const uint8_t *data, size_t len)
Definition Equalizer3Bands.h:334
bool is_active
Indicates if the equalizer is active.
Definition Equalizer3Bands.h:300
size_t readBytes(uint8_t *data, size_t len) override
Definition Equalizer3Bands.h:284
bool begin()
Definition Equalizer3Bands.h:229
bool begin(ConfigEqualizer3Bands &config)
Definition Equalizer3Bands.h:224
int available() override
Definition Equalizer3Bands.h:295
Equalizer3BandsT(AudioOutput &out)
Definition Equalizer3Bands.h:185
Equalizer3BandsT(AudioStream &stream)
Definition Equalizer3Bands.h:193
size_t write(const uint8_t *data, size_t len) override
Definition Equalizer3Bands.h:271
ConfigEqualizer3Bands * p_cfg
Pointer to active configuration.
Definition Equalizer3Bands.h:302
ConfigEqualizer3Bands defaultConfig()
Definition Equalizer3Bands.h:219
Stream * p_stream
Input/output stream for read operations.
Definition Equalizer3Bands.h:305
int availableForWrite() override
Definition Equalizer3Bands.h:278
struct audio_tools::Equalizer3BandsT::EQSTATE * state
const T vsa
Denormal-avoidance offset.
Definition Equalizer3Bands.h:303
virtual void setAudioInfo(AudioInfo info) override
Definition Equalizer3Bands.h:260
void end()
Definition Equalizer3Bands.h:256
~Equalizer3BandsT()
Definition Equalizer3Bands.h:198
Print * p_print
Output stream for write operations.
Definition Equalizer3Bands.h:304
void setStream(Stream &io) override
Definition Equalizer3Bands.h:204
Equalizer3BandsT(Print &out)
Definition Equalizer3Bands.h:176
ConfigEqualizer3Bands cfg
Default configuration instance.
Definition Equalizer3Bands.h:301
T sample(EQSTATE &es, T sample)
Definition Equalizer3Bands.h:387
ConfigEqualizer3Bands & config()
Definition Equalizer3Bands.h:215
Abstract class: Objects can be put into a pipleline.
Definition AudioStreams.h:68
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
bool empty()
Definition Vector.h:180
bool resize(size_t newSize, T value)
Definition Vector.h:266
int size()
Definition Vector.h:178
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
int24_4bytes_t int24_t
Definition int24_t.h:12
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
Configuration for 3 Band Equalizer.
Definition Equalizer3Bands.h:39
int freq_high
Definition Equalizer3Bands.h:52
int freq_low
Definition Equalizer3Bands.h:48
float gain_low
Gain multiplier for low frequencies (0.0-2.0, where 1.0 = unity gain)
Definition Equalizer3Bands.h:55
float gain_medium
Gain multiplier for medium frequencies (0.0-2.0, where 1.0 = unity gain)
Definition Equalizer3Bands.h:58
ConfigEqualizer3Bands()
Definition Equalizer3Bands.h:40
float gain_high
Gain multiplier for high frequencies (0.0-2.0, where 1.0 = unity gain)
Definition Equalizer3Bands.h:61
Definition Equalizer3Bands.h:651
T f2p0
Definition Equalizer3Bands.h:661
T hf
Definition Equalizer3Bands.h:660
T f2p2
Definition Equalizer3Bands.h:663
T sdm1
Definition Equalizer3Bands.h:667
T f1p3
Definition Equalizer3Bands.h:657
T f1p2
Definition Equalizer3Bands.h:656
T f1p0
Definition Equalizer3Bands.h:654
T f2p1
Definition Equalizer3Bands.h:662
T sdm2
Definition Equalizer3Bands.h:668
T f1p1
Definition Equalizer3Bands.h:655
T lf
Definition Equalizer3Bands.h:653
T sdm3
Definition Equalizer3Bands.h:669
T f2p3
Definition Equalizer3Bands.h:664
Filter state for each channel.
Definition Equalizer3Bands.h:309
T f2p0
Filter pole 0.
Definition Equalizer3Bands.h:319
T hf
High frequency cutoff coefficient.
Definition Equalizer3Bands.h:318
T f2p2
Filter pole 2.
Definition Equalizer3Bands.h:321
T sdm1
Sample data minus 1 (previous sample)
Definition Equalizer3Bands.h:325
T f1p3
Filter pole 3.
Definition Equalizer3Bands.h:315
T f1p2
Filter pole 2.
Definition Equalizer3Bands.h:314
T f1p0
Filter pole 0.
Definition Equalizer3Bands.h:312
T f2p1
Filter pole 1.
Definition Equalizer3Bands.h:320
T sdm2
Sample data minus 2.
Definition Equalizer3Bands.h:326
T f1p1
Filter pole 1.
Definition Equalizer3Bands.h:313
T lf
Low frequency cutoff coefficient.
Definition Equalizer3Bands.h:311
T sdm3
Sample data minus 3.
Definition Equalizer3Bands.h:327
T f2p3
Filter pole 3.
Definition Equalizer3Bands.h:322