105 LOGE(
"Could not resize data");
108 for (
int j = 0; j <
data.
size(); j++) {
116 float add_value = value;
117 if (window_function !=
nullptr) {
118 add_value = value * window_function->
factor(pos);
121 data[pos] += add_value;
126 for (
int j = 0; j < stride; j++) {
130 for (
int j = 0; j < stride; j++) {
133 if (result[j] > maxResult) {
134 result[j] = maxResult;
136 if (result[j] < -maxResult) {
137 result[j] = -maxResult;
141 for (
int j = 0; j <
len - stride; j++) {
145 for (
int j =
len - stride; j <
len; j++) {
185 virtual bool setBin(
int idx,
float real,
float img) {
return false; }
211 info.rxtx_mode = mode;
237 LOGE(
"Not enough memory");
248 bool is_valid_rxtx =
false;
252 is_valid_rxtx =
true;
258 is_valid_rxtx =
true;
261 if (!is_valid_rxtx) {
262 LOGE(
"Invalid rxtx_mode");
281 operator bool()
override {
303 size_t write(
const uint8_t *data,
size_t len)
override {
309 processSamples<int8_t>(data, len);
312 processSamples<int16_t>(data, len / 2);
315 processSamples<int24_t>(data, len / 3);
318 processSamples<int32_t>(data, len / 4);
375 for (
int j = 0; j <
size(); j++) {
390 for (
int j = 0; j < N; j++) {
395 for (
int j = 0; j <
size(); j++) {
399 insertSorted<N>(
result, act);
404 float *
toMEL(
int n_bins,
float min_freq = 0.0f,
float max_freq = 0.0f) {
406 if (n_bins <= 0) n_bins =
size();
407 if (min_freq <= 0.0f) min_freq =
frequency(0);
412 float min_mel = 2595.0f * log10(1.0f + (min_freq / 700.0f));
413 float max_mel = 2595.0f * log10(1.0f + (max_freq / 700.0f));
417 mel_points.
resize(n_bins + 2);
419 float mel_step = (max_mel - min_mel) / (n_bins + 1);
420 for (
int i = 0; i < n_bins + 2; i++) {
421 mel_points[i] = min_mel + i * mel_step;
426 freq_points.
resize(n_bins + 2);
427 for (
int i = 0; i < n_bins + 2; i++) {
428 freq_points[i] = 700.0f * (pow(10.0f, mel_points[i] / 2595.0f) - 1.0f);
433 bin_indices.
resize(n_bins + 2);
434 for (
int i = 0; i < n_bins + 2; i++) {
437 if (bin_indices[i] >=
bins) bin_indices[i] =
bins - 1;
438 if (bin_indices[i] < 0) bin_indices[i] = 0;
442 for (
int i = 0; i < n_bins; i++) {
443 float mel_sum = 0.0f;
445 int start_bin = bin_indices[i];
446 int mid_bin = bin_indices[i + 1];
447 int end_bin = bin_indices[i + 2];
450 for (
int j = start_bin; j < mid_bin; j++) {
451 if (j >=
bins)
break;
452 float weight = (j - start_bin) /
float(mid_bin - start_bin);
457 for (
int j = mid_bin; j < end_bin; j++) {
458 if (j >=
bins)
break;
459 float weight = (end_bin - j) /
float(end_bin - mid_bin);
476 bool fromMEL(
float *values,
int n_bins,
float min_freq = 0.0f,
477 float max_freq = 0.0f) {
478 if (n_bins <= 0 || values ==
nullptr)
return false;
481 if (min_freq <= 0.0f) min_freq =
frequency(0);
485 for (
int i = 0; i <
bins; i++) {
492 float min_mel = 2595.0f * log10(1.0f + (min_freq / 700.0f));
493 float max_mel = 2595.0f * log10(1.0f + (max_freq / 700.0f));
497 mel_points.
resize(n_bins + 2);
499 float mel_step = (max_mel - min_mel) / (n_bins + 1);
500 for (
int i = 0; i < n_bins + 2; i++) {
501 mel_points[i] = min_mel + i * mel_step;
506 freq_points.
resize(n_bins + 2);
507 for (
int i = 0; i < n_bins + 2; i++) {
508 freq_points[i] = 700.0f * (pow(10.0f, mel_points[i] / 2595.0f) - 1.0f);
513 bin_indices.
resize(n_bins + 2);
514 for (
int i = 0; i < n_bins + 2; i++) {
517 if (bin_indices[i] >=
bins) bin_indices[i] =
bins - 1;
518 if (bin_indices[i] < 0) bin_indices[i] = 0;
525 for (
int i = 0; i < n_bins; i++) {
526 int start_bin = bin_indices[i];
527 int mid_bin = bin_indices[i + 1];
528 int end_bin = bin_indices[i + 2];
531 for (
int j = start_bin; j < mid_bin; j++) {
532 if (j >=
bins)
break;
533 float weight = (j - start_bin) /
float(mid_bin - start_bin);
534 linear_magnitudes[j] += values[i] * weight;
538 for (
int j = mid_bin; j < end_bin; j++) {
539 if (j >=
bins)
break;
540 float weight = (end_bin - j) /
float(end_bin - mid_bin);
541 linear_magnitudes[j] += values[i] * weight;
546 for (
int i = 0; i <
bins; i++) {
547 if (linear_magnitudes[i] > 0) {
549 bin.
real = linear_magnitudes[i];
565 LOGE(
"Invalid bin %d", bin);
574 return map(freq, 0, max_freq, 0,
size());
581 LOGE(
"Invalid bin %d", bin);
589 LOGE(
"Invalid bin %d", bin);
599 return atan2(fft_bin.
img, fft_bin.
real);
608 for (
int j = 0; j <
size(); j++) {
620 for (
int j = 0; j <
size(); j++) {
627 bool setBin(
int idx,
float real,
float img) {
629 if (idx < 0 || idx >=
size())
return false;
632 return rc_first_half && rc_2nd_half;
642 for (
int j = 0; j <
size(); j++) {
651 template <
typename T>
672 template <
typename T>
674 T *dataT = (T *)data;
683 for (
int j = 0; j < sample_count; j++) {
684 T out_sample = samples[j];
686 float scaled_sample =
687 1.0f / NumberConverter::maxValueT<T>() * windowed_sample;
702 template <
typename T>
711 template <
typename T>
764 template <
typename T>
766 for (
int j = 0; j < len; j++) {
770 out_data[ch] = sample;
783 for (
int j = 0; j < N; j++) {
787 for (
int i = N - 2; i >= j; i--) {
long map(long x, long in_min, long in_max, long out_min, long out_max)
Maps input to output values.
Definition Arduino.h:182
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGE(...)
Definition AudioLoggerIDF.h:30
Different Window functions that can be used by FFT.
#define assert(T)
Definition avr.h:10
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition AudioTypes.h:26
@ RXTX_MODE
Definition AudioTypes.h:26
@ TX_MODE
Definition AudioTypes.h:26
@ RX_MODE
Definition AudioTypes.h:26