108 LOGE(
"Could not resize data");
111 for (
int j = 0; j <
data.
size(); j++) {
119 float add_value = value;
120 if (window_function !=
nullptr) {
121 add_value = value * window_function->
factor(pos);
124 data[pos] += add_value;
129 for (
int j = 0; j < stride; j++) {
133 for (
int j = 0; j < stride; j++) {
136 if (result[j] > maxResult) {
137 result[j] = maxResult;
139 if (result[j] < -maxResult) {
140 result[j] = -maxResult;
144 for (
int j = 0; j <
len - stride; j++) {
148 for (
int j =
len - stride; j <
len; j++) {
189 virtual bool setBin(
int idx,
float real,
float img) {
return false; }
222 info.rxtx_mode = mode;
248 LOGE(
"Not enough memory");
259 bool is_valid_rxtx =
false;
263 is_valid_rxtx =
true;
269 is_valid_rxtx =
true;
272 if (!is_valid_rxtx) {
273 LOGE(
"Invalid rxtx_mode");
324 size_t samples = frame_bytes > 0 ? len / frame_bytes *
cfg.
channels : 0;
327 processSamples<int8_t>(data, samples);
330 processSamples<int16_t>(data, samples);
333 processSamples<int24_t>(data, samples);
336 processSamples<int32_t>(data, samples);
392 for (
int j = 0; j <
size(); j++) {
407 for (
int j = 0; j < N; j++) {
412 for (
int j = 0; j <
size(); j++) {
416 insertSorted<N>(
result, act);
427 float *
toMEL(
int n_bins,
float min_freq = 0.0f,
float max_freq = 0.0f,
428 bool power =
false) {
429 if (n_bins <= 0) n_bins =
size();
434 for (
int i = 0; i < n_bins; i++) {
437 const float *m = mags + filter.
start_bin;
438 float mel_sum = 0.0f;
439 for (
int j = 0; j < filter.
count; j++) mel_sum += m[j] * weights[j];
453 bool fromMEL(
float *values,
int n_bins,
float min_freq = 0.0f,
454 float max_freq = 0.0f) {
455 if (n_bins <= 0 || values ==
nullptr)
return false;
461 for (
int i = 0; i <
bins; i++) linear_magnitudes[i] = 0.0f;
462 for (
int i = 0; i < n_bins; i++) {
465 for (
int j = 0; j < filter.
count; j++) {
466 linear_magnitudes[filter.
start_bin + j] += values[i] * weights[j];
471 for (
int i = 0; i <
bins; i++) {
474 bin.
real = linear_magnitudes[i];
487 LOGE(
"Invalid bin %d", bin);
496 return map(freq, 0, max_freq, 0,
size());
503 LOGE(
"Invalid bin %d", bin);
511 LOGE(
"Invalid bin %d", bin);
521 return atan2(fft_bin.
img, fft_bin.
real);
531 for (
int j = 0; j <
size(); j++) {
544 for (
int j = 0; j <
size(); j++) {
551 bool setBin(
int idx,
float real,
float img) {
553 if (idx < 0 || idx >=
size())
return false;
556 return rc_first_half && rc_2nd_half;
566 for (
int j = 0; j <
size(); j++) {
575 template <
typename T>
605 static float hzToMel(
float hz) {
return 2595.0f * log10f(1.0f + hz / 700.0f); }
607 return 700.0f * (powf(10.0f, mel / 2595.0f) - 1.0f);
613 if (min_freq <= 0.0f) min_freq =
frequency(0);
620 float min_mel =
hzToMel(min_freq);
621 float mel_step = (
hzToMel(max_freq) - min_mel) / (n_bins + 1);
627 for (
int i = 0; i < n_bins + 2; i++) edges[i] =
melToHz(min_mel + i * mel_step);
630 for (
int i = 0; i < n_bins; i++) {
633 int first = (
int)(edges[i] / bin_hz) + 1;
634 int last = (
int)ceilf(edges[i + 2] / bin_hz) - 1;
638 filter.
count = last - first + 1;
642 int j = (
int)(edges[i + 1] / bin_hz + 0.5f);
651 for (
int i = 0; i < n_bins; i++) {
654 if (filter.
count == 0) {
659 float left = edges[i], center = edges[i + 1], right = edges[i + 2];
660 for (
int k = 0; k < filter.
count; k++) {
661 float f = (filter.
start_bin + k) * bin_hz;
662 w[k] = f <= center ? (f - left) / (center - left) : (right - f) / (right - center);
677 template <
typename T>
679 T *dataT = (T *)data;
683 while (pos < count) {
685 size_t n = count - pos < room ? count - pos : room;
700 template <
typename T>
705 const float scale = 1.0f / NumberConverter::maxValueT<T>();
706 for (
int j = 0; j < sample_count; j++) {
721 template <
typename T>
730 template <
typename T>
783 template <
typename T>
785 for (
int j = 0; j < len; j++) {
789 out_data[ch] = sample;
806 for (
int j = 0; j < N; j++) {
810 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