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_out = &io;
206 p_io = &io;
207 };
208
211 void setOutput(Print& out) override { p_out = &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_out->write(data, len);
274 }
275
278 int availableForWrite() override { return p_out->availableForWrite(); }
279
280 void flush() override {
281 if (p_out != nullptr) p_out->flush();
282 }
283
288 size_t readBytes(uint8_t* data, size_t len) override {
289 size_t result = 0;
290 if (p_io != nullptr) {
291 result = p_io->readBytes(data, len);
292 filterSamples(data, len);
293 }
294 return result;
295 }
296
299 int available() override {
300 return p_io != nullptr ? p_io->available() : 0;
301 }
302
303 protected:
304 bool is_active = false;
307 const T vsa = EqDenormalGuard<T>::value();
308 Print* p_out = nullptr;
309 Stream* p_io = nullptr;
311
313 struct EQSTATE {
314 // Filter #1 (Low band) - 4-pole low-pass filter
315 T lf;
320
321 // Filter #2 (High band) - 4-pole high-pass filter
322 T hf;
327
328 // Sample history buffer for filter calculations
332
333 }* state = nullptr;
334
338 void filterSamples(const uint8_t* data, size_t len) {
339 // no filter if not active
340 if (!is_active) return;
341
342 // process samples
343 switch (p_cfg->bits_per_sample) {
344 case 16: {
345 int16_t* p_dataT = (int16_t*)data;
346 size_t sample_count = len / sizeof(int16_t);
347 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
348 for (int ch = 0; ch < p_cfg->channels; ch++) {
349 p_dataT[j + ch] = EqSampleConverter<int16_t, T>::fromEqType(
350 sample(state[ch], EqSampleConverter<int16_t, T>::toEqType(
351 p_dataT[j + ch], 16)),
352 16);
353 }
354 }
355 } break;
356 case 24: {
357 int24_t* p_dataT = (int24_t*)data;
358 size_t sample_count = len / sizeof(int24_t);
359 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
360 for (int ch = 0; ch < p_cfg->channels; ch++) {
361 p_dataT[j + ch] = EqSampleConverter<int24_t, T>::fromEqType(
362 sample(state[ch], EqSampleConverter<int24_t, T>::toEqType(
363 p_dataT[j + ch], 24)),
364 24);
365 }
366 }
367 } break;
368 case 32: {
369 int32_t* p_dataT = (int32_t*)data;
370 size_t sample_count = len / sizeof(int32_t);
371 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
372 for (int ch = 0; ch < p_cfg->channels; ch++) {
373 p_dataT[j + ch] = EqSampleConverter<int32_t, T>::fromEqType(
374 sample(state[ch], EqSampleConverter<int32_t, T>::toEqType(
375 p_dataT[j + ch], 32)),
376 32);
377 }
378 }
379 } break;
380
381 default:
382 LOGE("Only 16 bits supported: %d", p_cfg->bits_per_sample);
383 break;
384 }
385 }
386
392 // Locals
393 T l, m, h; // Low / Mid / High - Sample Values
394 // Filter #1 (lowpass)
395 es.f1p0 += (es.lf * (sample - es.f1p0)) + vsa;
396 es.f1p1 += (es.lf * (es.f1p0 - es.f1p1));
397 es.f1p2 += (es.lf * (es.f1p1 - es.f1p2));
398 es.f1p3 += (es.lf * (es.f1p2 - es.f1p3));
399
400 l = es.f1p3;
401
402 // Filter #2 (highpass)
403 es.f2p0 += (es.hf * (sample - es.f2p0)) + vsa;
404 es.f2p1 += (es.hf * (es.f2p0 - es.f2p1));
405 es.f2p2 += (es.hf * (es.f2p1 - es.f2p2));
406 es.f2p3 += (es.hf * (es.f2p2 - es.f2p3));
407
408 h = es.sdm3 - es.f2p3;
409 // Calculate midrange (signal - (low + high))
410 m = es.sdm3 - (h + l);
411 // Scale, Combine and store
412 l = l * p_cfg->gain_low;
413 m = m * p_cfg->gain_medium;
414 h = h * p_cfg->gain_high;
415
416 // Shuffle history buffer
417 es.sdm3 = es.sdm2;
418 es.sdm2 = es.sdm1;
419 es.sdm1 = sample;
420
421 // Return result
422 return (l + m + h);
423 }
424};
425
430
443template <typename T = float>
445 public:
449
453
461
466 setStream(stream);
467 stream.addNotifyAudioChange(*this);
468 }
469
471 if (state != nullptr) delete[] state;
472 }
473
475 void setStream(Stream& io) override {
476 p_out = &io;
477 p_io = &io;
478 };
479
481 void setOutput(Print& out) override { p_out = &out; }
482
484
486
491 p_cfg = &config;
492 return begin();
493 }
494
497 bool begin() {
499 // Ensure per-channel arrays are allocated
501
502 // Ensure that EQSTATE is allocated
504 if (state != nullptr) delete[] state;
505 state = new EQSTATE[p_cfg->channels];
507 }
508
509 // Setup state for each channel with its own parameters
510 for (int j = 0; j < p_cfg->channels; j++) {
511 state[j] = EQSTATE();
512
513 // Calculate filter cutoff frequencies per channel
514 state[j].lf = eqAssignCoeff<T>(
515 2 * sin((float)PI *
516 ((float)freq_low[j] / (float)p_cfg->sample_rate)),
517 "lf");
518 state[j].hf = eqAssignCoeff<T>(
519 2 * sin((float)PI *
520 ((float)freq_high[j] / (float)p_cfg->sample_rate)),
521 "hf");
522 }
523 is_active = true;
524 return true;
525 }
526
527 void end() override { is_active = false; }
528
535
540 void setChannelFrequencies(int channel, int freq_low_val, int freq_high_val) {
542 if (channel >= 0 && channel < p_cfg->channels && !freq_low.empty()) {
543 freq_low[channel] = freq_low_val;
544 freq_high[channel] = freq_high_val;
545
546 // Recalculate filter coefficients for this channel
547 if (state != nullptr) {
548 state[channel].lf = eqAssignCoeff<T>(
549 2 * sin((float)PI *
550 ((float)freq_low_val / (float)p_cfg->sample_rate)),
551 "lf");
552 state[channel].hf = eqAssignCoeff<T>(
553 2 * sin((float)PI *
554 ((float)freq_high_val / (float)p_cfg->sample_rate)),
555 "hf");
556 }
557 }
558 }
559
565 void setChannelGains(int channel, float gain_low_val, float gain_medium_val,
566 float gain_high_val) {
568 if (channel >= 0 && channel < p_cfg->channels && !gain_low.empty()) {
569 gain_low[channel] = gain_low_val;
570 gain_medium[channel] = gain_medium_val;
571 gain_high[channel] = gain_high_val;
572 }
573 }
574
580 bool getChannelFrequencies(int channel, int& freq_low_val,
581 int& freq_high_val) {
582 if (channel >= 0 && channel < p_cfg->channels && !freq_low.empty()) {
583 freq_low_val = freq_low[channel];
584 freq_high_val = freq_high[channel];
585 return true;
586 }
587 return false;
588 }
589
596 bool getChannelGains(int channel, float& gain_low_val, float& gain_medium_val,
597 float& gain_high_val) {
598 if (channel >= 0 && channel < p_cfg->channels && !gain_low.empty()) {
599 gain_low_val = gain_low[channel];
600 gain_medium_val = gain_medium[channel];
601 gain_high_val = gain_high[channel];
602 return true;
603 }
604 return false;
605 }
606
611 size_t write(const uint8_t* data, size_t len) override {
612 filterSamples(data, len);
613 return p_out->write(data, len);
614 }
615
618 int availableForWrite() override { return p_out->availableForWrite(); }
619
620 void flush() override {
621 if (p_out != nullptr) p_out->flush();
622 }
623
628 size_t readBytes(uint8_t* data, size_t len) override {
629 size_t result = 0;
630 if (p_io != nullptr) {
631 result = p_io->readBytes(data, len);
632 filterSamples(data, len);
633 }
634 return result;
635 }
636
639 int available() override {
640 return p_io != nullptr ? p_io->available() : 0;
641 }
642
643 protected:
644 bool is_active = false;
647 const T vsa = EqDenormalGuard<T>::value();
648 Print* p_out = nullptr;
649 Stream* p_io = nullptr;
651
652 // Per-channel frequency and gain settings using Vector containers
658
659 struct EQSTATE {
660 // Filter #1 (Low band)
661 T lf; // Frequency
662 T f1p0; // Poles ...
666
667 // Filter #2 (High band)
668 T hf; // Frequency
669 T f2p0; // Poles ...
673
674 // Sample history buffer
675 T sdm1; // Sample data minus 1
676 T sdm2; // 2
677 T sdm3; // 3
678
679 }* state = nullptr;
680
687
690 void allocateChannelArrays(int num_channels) {
691 // Resize all vectors to accommodate the number of channels
692 freq_low.resize(num_channels);
693 freq_high.resize(num_channels);
694 gain_low.resize(num_channels);
695 gain_medium.resize(num_channels);
696 gain_high.resize(num_channels);
697
698 // Initialize with config default values
699 for (int i = 0; i < num_channels; i++) {
700 freq_low[i] = p_cfg->freq_low;
702 gain_low[i] = p_cfg->gain_low;
705 }
706 }
707
711 void filterSamples(const uint8_t* data, size_t len) {
712 if (!is_active) return;
713 switch (p_cfg->bits_per_sample) {
714 case 16: {
715 int16_t* p_dataT = (int16_t*)data;
716 size_t sample_count = len / sizeof(int16_t);
717 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
718 for (int ch = 0; ch < p_cfg->channels; ch++) {
719 p_dataT[j + ch] = EqSampleConverter<int16_t, T>::fromEqType(
720 sample(ch, EqSampleConverter<int16_t, T>::toEqType(
721 p_dataT[j + ch], 16)),
722 16);
723 }
724 }
725 } break;
726 case 24: {
727 int24_t* p_dataT = (int24_t*)data;
728 size_t sample_count = len / sizeof(int24_t);
729 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
730 for (int ch = 0; ch < p_cfg->channels; ch++) {
731 p_dataT[j + ch] = EqSampleConverter<int24_t, T>::fromEqType(
732 sample(ch, EqSampleConverter<int24_t, T>::toEqType(
733 p_dataT[j + ch], 24)),
734 24);
735 }
736 }
737 } break;
738 case 32: {
739 int32_t* p_dataT = (int32_t*)data;
740 size_t sample_count = len / sizeof(int32_t);
741 for (size_t j = 0; j < sample_count; j += p_cfg->channels) {
742 for (int ch = 0; ch < p_cfg->channels; ch++) {
743 p_dataT[j + ch] = EqSampleConverter<int32_t, T>::fromEqType(
744 sample(ch, EqSampleConverter<int32_t, T>::toEqType(
745 p_dataT[j + ch], 32)),
746 32);
747 }
748 }
749 } break;
750
751 default:
752 LOGE("Only 16 bits supported: %d", p_cfg->bits_per_sample);
753 break;
754 }
755 }
756
762 T sample(int channel, T sample_val) {
763 EQSTATE& es = state[channel];
764
765 // Locals
766 T l, m, h; // Low / Mid / High - Sample Values
767
768 // Filter #1 (lowpass)
769 es.f1p0 += (es.lf * (sample_val - es.f1p0)) + vsa;
770 es.f1p1 += (es.lf * (es.f1p0 - es.f1p1));
771 es.f1p2 += (es.lf * (es.f1p1 - es.f1p2));
772 es.f1p3 += (es.lf * (es.f1p2 - es.f1p3));
773
774 l = es.f1p3;
775
776 // Filter #2 (highpass)
777 es.f2p0 += (es.hf * (sample_val - es.f2p0)) + vsa;
778 es.f2p1 += (es.hf * (es.f2p0 - es.f2p1));
779 es.f2p2 += (es.hf * (es.f2p1 - es.f2p2));
780 es.f2p3 += (es.hf * (es.f2p2 - es.f2p3));
781
782 h = es.sdm3 - es.f2p3;
783
784 // Calculate midrange (signal - (low + high))
785 m = es.sdm3 - (h + l);
786
787 // Scale with per-channel gains
788 l = l * gain_low[channel];
789 m = m * gain_medium[channel];
790 h = h * gain_high[channel];
791
792 // Shuffle history buffer
793 es.sdm3 = es.sdm2;
794 es.sdm2 = es.sdm1;
795 es.sdm1 = sample_val;
796
797 // Return result
798 return (l + m + h);
799 }
800};
801
807
808} // 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
virtual void flush()
Definition Arduino.h:130
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:150
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:444
int max_state_count
Maximum number of allocated channel states.
Definition Equalizer3Bands.h:650
void flush() override
Definition Equalizer3Bands.h:620
void setOutput(Print &out) override
Defines/Changes the output target.
Definition Equalizer3Bands.h:481
bool getChannelGains(int channel, float &gain_low_val, float &gain_medium_val, float &gain_high_val)
Definition Equalizer3Bands.h:596
bool getChannelFrequencies(int channel, int &freq_low_val, int &freq_high_val)
Definition Equalizer3Bands.h:580
void allocateChannelArrays(int num_channels)
Definition Equalizer3Bands.h:690
Equalizer3BandsPerChannelT(AudioStream &stream)
Definition Equalizer3Bands.h:465
void filterSamples(const uint8_t *data, size_t len)
Definition Equalizer3Bands.h:711
bool is_active
Definition Equalizer3Bands.h:644
T sample(int channel, T sample_val)
Definition Equalizer3Bands.h:762
size_t readBytes(uint8_t *data, size_t len) override
Definition Equalizer3Bands.h:628
Equalizer3BandsPerChannelT(Stream &in)
Definition Equalizer3Bands.h:452
Vector< int > freq_high
High frequency cutoffs per channel (Hz)
Definition Equalizer3Bands.h:654
bool begin()
Definition Equalizer3Bands.h:497
void end() override
Definition Equalizer3Bands.h:527
bool begin(ConfigEqualizer3Bands &config)
Definition Equalizer3Bands.h:490
int available() override
Definition Equalizer3Bands.h:639
struct audio_tools::Equalizer3BandsPerChannelT::EQSTATE * state
size_t write(const uint8_t *data, size_t len) override
Definition Equalizer3Bands.h:611
ConfigEqualizer3Bands * p_cfg
Pointer to active configuration.
Definition Equalizer3Bands.h:646
ConfigEqualizer3Bands defaultConfig()
Definition Equalizer3Bands.h:485
int availableForWrite() override
Definition Equalizer3Bands.h:618
Vector< float > gain_high
High frequency gains per channel.
Definition Equalizer3Bands.h:657
Vector< float > gain_medium
Medium frequency gains per channel.
Definition Equalizer3Bands.h:656
Equalizer3BandsPerChannelT(Print &out)
Definition Equalizer3Bands.h:448
Vector< float > gain_low
Low frequency gains per channel.
Definition Equalizer3Bands.h:655
void setChannelFrequencies(int channel, int freq_low_val, int freq_high_val)
Definition Equalizer3Bands.h:540
Print * p_out
Output stream for write operations.
Definition Equalizer3Bands.h:648
const T vsa
Denormal-avoidance offset.
Definition Equalizer3Bands.h:647
virtual void setAudioInfo(AudioInfo info) override
Defines the input AudioInfo.
Definition Equalizer3Bands.h:529
void ensureChannelArraysAllocated()
Ensures that per-channel arrays are allocated and properly sized.
Definition Equalizer3Bands.h:682
~Equalizer3BandsPerChannelT()
Definition Equalizer3Bands.h:470
Vector< int > freq_low
Low frequency cutoffs per channel (Hz)
Definition Equalizer3Bands.h:653
void setStream(Stream &io) override
Defines/Changes the input & output.
Definition Equalizer3Bands.h:475
ConfigEqualizer3Bands cfg
Default configuration instance.
Definition Equalizer3Bands.h:645
void setChannelGains(int channel, float gain_low_val, float gain_medium_val, float gain_high_val)
Definition Equalizer3Bands.h:565
Equalizer3BandsPerChannelT(AudioOutput &out)
Definition Equalizer3Bands.h:457
ConfigEqualizer3Bands & config()
Definition Equalizer3Bands.h:483
Stream * p_io
Input/output stream for read operations.
Definition Equalizer3Bands.h:649
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:310
void flush() override
Definition Equalizer3Bands.h:280
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:338
bool is_active
Indicates if the equalizer is active.
Definition Equalizer3Bands.h:304
size_t readBytes(uint8_t *data, size_t len) override
Definition Equalizer3Bands.h:288
bool begin()
Definition Equalizer3Bands.h:229
bool begin(ConfigEqualizer3Bands &config)
Definition Equalizer3Bands.h:224
int available() override
Definition Equalizer3Bands.h:299
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:306
ConfigEqualizer3Bands defaultConfig()
Definition Equalizer3Bands.h:219
int availableForWrite() override
Definition Equalizer3Bands.h:278
struct audio_tools::Equalizer3BandsT::EQSTATE * state
Print * p_out
Output stream for write operations.
Definition Equalizer3Bands.h:308
const T vsa
Denormal-avoidance offset.
Definition Equalizer3Bands.h:307
virtual void setAudioInfo(AudioInfo info) override
Definition Equalizer3Bands.h:260
void end()
Definition Equalizer3Bands.h:256
~Equalizer3BandsT()
Definition Equalizer3Bands.h:198
void setStream(Stream &io) override
Definition Equalizer3Bands.h:204
Equalizer3BandsT(Print &out)
Definition Equalizer3Bands.h:176
ConfigEqualizer3Bands cfg
Default configuration instance.
Definition Equalizer3Bands.h:305
T sample(EQSTATE &es, T sample)
Definition Equalizer3Bands.h:391
ConfigEqualizer3Bands & config()
Definition Equalizer3Bands.h:215
Stream * p_io
Input/output stream for read operations.
Definition Equalizer3Bands.h:309
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:659
T f2p0
Definition Equalizer3Bands.h:669
T hf
Definition Equalizer3Bands.h:668
T f2p2
Definition Equalizer3Bands.h:671
T sdm1
Definition Equalizer3Bands.h:675
T f1p3
Definition Equalizer3Bands.h:665
T f1p2
Definition Equalizer3Bands.h:664
T f1p0
Definition Equalizer3Bands.h:662
T f2p1
Definition Equalizer3Bands.h:670
T sdm2
Definition Equalizer3Bands.h:676
T f1p1
Definition Equalizer3Bands.h:663
T lf
Definition Equalizer3Bands.h:661
T sdm3
Definition Equalizer3Bands.h:677
T f2p3
Definition Equalizer3Bands.h:672
Filter state for each channel.
Definition Equalizer3Bands.h:313
T f2p0
Filter pole 0.
Definition Equalizer3Bands.h:323
T hf
High frequency cutoff coefficient.
Definition Equalizer3Bands.h:322
T f2p2
Filter pole 2.
Definition Equalizer3Bands.h:325
T sdm1
Sample data minus 1 (previous sample)
Definition Equalizer3Bands.h:329
T f1p3
Filter pole 3.
Definition Equalizer3Bands.h:319
T f1p2
Filter pole 2.
Definition Equalizer3Bands.h:318
T f1p0
Filter pole 0.
Definition Equalizer3Bands.h:316
T f2p1
Filter pole 1.
Definition Equalizer3Bands.h:324
T sdm2
Sample data minus 2.
Definition Equalizer3Bands.h:330
T f1p1
Filter pole 1.
Definition Equalizer3Bands.h:317
T lf
Low frequency cutoff coefficient.
Definition Equalizer3Bands.h:315
T sdm3
Sample data minus 3.
Definition Equalizer3Bands.h:331
T f2p3
Filter pole 3.
Definition Equalizer3Bands.h:326