48#define ECHO_GET_FRAME_SIZE 3
49#define ECHO_SET_SAMPLING_RATE 24
50#define ECHO_GET_SAMPLING_RATE 25
51#define ECHO_GET_IMPULSE_RESPONSE_SIZE 27
52#define ECHO_GET_IMPULSE_RESPONSE 29
114template <
typename T,
typename SampleType>
116 using Word16 =
typename SampleType::word16_t;
117 using Word32 =
typename SampleType::word32_t;
118 using Num =
typename SampleType::float_t;
214inline void echo_fft(
void* table, T* in, T* out);
216inline void echo_ifft(
void* table, T* in, T* out);
296template <
typename T =
int16_t,
typename SampleType = MDFFloat>
299 using Word16 =
typename SampleType::word16_t;
300 using Word32 =
typename SampleType::word32_t;
301 using Num =
typename SampleType::float_t;
400 echoWarning(
"Internal playback buffer corruption");
442 for (
int i = 0; i < N * M; i++)
state->
W[i] = 0;
446 for (
int i = 0; i < N * (M + 1); i++)
state->
X[i] = 0;
454 for (
int i = 0; i < N *
C; i++)
state->
E[i] = 0;
455 for (
int i = 0; i < N * K; i++)
state->
x[i] = 0;
458 for (
int i = 0; i < K; i++)
state->
memX[i] = 0;
504 for (
int j = 0; j < M; j++) {
506 for (
int i = 0; i < n; i++) filt[j * n + i] = 32767 *
state->
wtmp[i];
541 echoWarning(
"Cannot change filter length after initialization");
555 echoWarning(
"Cannot change mic channels after initialization");
569 echoWarning(
"Cannot change speaker channels after initialization");
583 echoWarning(
"Cannot change FFT driver after initialization");
622 template <
typename A>
634 template <
typename A>
640 LOGW(
"EchoCanceller Warning: %s", str);
644 LOGE(
"EchoCanceller Error: %s", str);
647 template <
typename A>
679 inline float spxExp(
float x) {
return expf(x); }
686 inline float spxCos(
float x) {
return cosf(x); }
700 Word16 den2 = radius * radius + .7f * (1 - radius) * (1 - radius);
701 for (
int i = 0; i < len; i++) {
702 Word16 vin = in[i * stride];
703 Word32 vout = mem[0] + vin;
704 mem[0] = mem[1] + 2 * (-vin + radius * vout);
705 mem[1] = vin - den2 * vout;
706 out[i] = radius * vout;
720 for (
int i = 0; i < len; i++) {
734 for (
int i = 1, j = 1; i < N - 1; i += 2, j++) {
735 ps[j] = X[i] * X[i] + X[i + 1] * X[i + 1];
737 ps[N / 2] = X[N - 1] * X[N - 1];
748 ps[0] += X[0] * X[0];
749 for (
int i = 1, j = 1; i < N - 1; i += 2, j++) {
750 ps[j] += X[i] * X[i] + X[i + 1] * X[i + 1];
752 ps[N / 2] += X[N - 1] * X[N - 1];
764 Word16* acc,
int N,
int M) {
765 for (
int i = 0; i < N; i++) acc[i] = 0;
767 for (
int j = 0; j < M; j++) {
768 acc[0] += X[0] * Y[0];
769 for (
int i = 1; i < N - 1; i += 2) {
770 acc[i] += (X[i] * Y[i] - X[i + 1] * Y[i + 1]);
771 acc[i + 1] += (X[i + 1] * Y[i] + X[i] * Y[i + 1]);
773 acc[N - 1] += X[N - 1] * Y[N - 1];
801 prod[0] = W * (X[0] * Y[0]);
802 for (
int i = 1, j = 1; i < N - 1; i += 2, j++) {
804 prod[i] = W * (X[i] * Y[i] + X[i + 1] * Y[i + 1]);
805 prod[i + 1] = W * (-X[i + 1] * Y[i] + X[i] * Y[i + 1]);
808 prod[N - 1] = W * (X[N - 1] * Y[N - 1]);
824 for (
int i = 0; i < M; i++) {
826 for (
int p = 0; p < P; p++) {
827 for (
int j = 0; j < N; j++) {
828 float val = W[p * N * M + i * N + j];
833 if (prop[i] > max_sum) max_sum = prop[i];
836 for (
int i = 0; i < M; i++) {
837 prop[i] += 0.1f * max_sum;
841 for (
int i = 0; i < M; i++) {
842 prop[i] = 0.99f * prop[i] / prop_sum;
856 int N = frame_size * 2;
862 if (!st)
return nullptr;
907 for (
int i = 0; i < N; i++)
908 st->window[i] = .5f - .5f *
cosf(2 *
M_PI * i / N);
911 for (
int i = 0; i <=
st->frame_size; i++)
st->power_1[i] = 1.0f;
914 for (
int i = 0; i < N * M * K *
C; i++)
st->W[i] = 0;
919 float decay =
expf(-2.4f / M);
922 for (
int i = 1; i < M; i++) {
923 st->prop[i] =
st->prop[i - 1] * decay;
926 for (
int i = M - 1; i >= 0; i--) {
927 st->prop[i] = .8f *
st->prop[i] / sum;
936 if (
st->sampling_rate < 12000)
937 st->notch_radius = .9f;
938 else if (
st->sampling_rate < 24000)
939 st->notch_radius = .982f;
941 st->notch_radius = .992f;
945 st->Pey =
st->Pyy = 1.0f;
948 st->Davg1 =
st->Davg2 = 0;
949 st->Dvar1 =
st->Dvar2 = 0.0f;
955 st->play_buf_started = 0;
957 st->fft_table =
nullptr;
972 float mn = NumberConverter::minValueT<T>();
973 float mx = NumberConverter::maxValueT<T>();
974 if (
v <
mn + 0.5f)
return (
T)
mn;
975 if (
v >
mx - 0.5f)
return (
T)
mx;
998 int N =
st->window_size;
1013 float ss = .35f / M;
1019 st->input +
chan *
st->frame_size,
st->frame_size,
1022 for (
int i = 0; i <
st->frame_size; i++) {
1032 std::memmove(&
st->x[
speak * N],
1035 for (
int i = 0; i <
st->frame_size; i++) {
1045 for (
int j = M - 1;
j >= 0;
j--) {
1046 std::memmove(&
st->X[(
j + 1) * N * K +
speak * N],
1057 st->x +
speak * N +
st->frame_size,
st->frame_size);
1066 st->Y +
chan * N, N, M * K);
1068 for (
int i = 0; i <
st->frame_size; i++)
1070 st->e[
chan * N + i +
st->frame_size];
1079 if (
st->saturated == 0) {
1082 for (
int j = M - 1;
j >= 0;
j--) {
1084 &
st->X[(
j + 1) * N * K +
speak * N],
1086 for (
int i = 0; i < N; i++)
1087 st->W[
chan * N * K * M +
j * N * K +
speak * N + i] +=
st->PHI[i];
1098 for (
int j = 0;
j < M;
j++) {
1099 if (
j == 0 ||
st->cancel_count % (M - 1) ==
j - 1) {
1103 for (
int i =
st->frame_size; i < N; i++)
st->wtmp[i] = 0;
1105 st->fft_table,
st->wtmp,
1113 for (
int i = 0; i <=
st->frame_size; i++)
1114 st->Rf[i] =
st->Yf[i] =
st->Xf[i] = 0;
1125 for (
int i = 0; i <
st->frame_size; i++)
1127 st->y[
chan * N + i +
st->frame_size];
1130 for (
int i = 0; i <
st->frame_size; i++)
1132 st->y[
chan * N + i +
st->frame_size];
1143 st->Davg1 = .6f *
st->Davg1 + .4f * (
Sff -
See);
1144 st->Davg2 = .85f *
st->Davg2 + .15f * (
Sff -
See);
1157 st->Davg1 =
st->Davg2 = 0;
1158 st->Dvar1 =
st->Dvar2 = 0.0f;
1159 std::memcpy(
st->foreground,
st->W, N * M *
C * K *
sizeof(
Word16));
1161 for (
int i = 0; i <
st->frame_size; i++)
1162 st->e[
chan * N + i +
st->frame_size] =
1163 st->window[i +
st->frame_size] *
1164 st->e[
chan * N + i +
st->frame_size] +
1165 st->window[i] *
st->y[
chan * N + i +
st->frame_size];
1177 std::memcpy(
st->W,
st->foreground, N * M *
C * K *
sizeof(
Word32));
1179 for (
int i = 0; i <
st->frame_size; i++)
1180 st->y[
chan * N + i +
st->frame_size] =
1181 st->e[
chan * N + i +
st->frame_size];
1182 for (
int i = 0; i <
st->frame_size; i++)
1184 st->y[
chan * N + i +
st->frame_size];
1187 st->Davg1 =
st->Davg2 = 0;
1188 st->Dvar1 =
st->Dvar2 = 0.0f;
1194 const float sat_threshold = NumberConverter::maxValueT<T>() * (32000.0f / 32767.0f);
1197 for (
int i = 0; i <
st->frame_size; i++) {
1201 st->e[
chan * N + i +
st->frame_size];
1204 st->y[
chan * N + i +
st->frame_size];
1208 if (
st->saturated == 0)
st->saturated = 1;
1215 for (
int i = 0; i <
st->frame_size; i++) {
1222 st->y +
chan * N +
st->frame_size,
st->frame_size);
1224 st->y +
chan * N +
st->frame_size,
st->frame_size);
1226 st->input +
chan *
st->frame_size,
st->frame_size);
1231 for (
int i = 0; i <
st->frame_size; i++)
st->y[i +
chan * N] = 0;
1240 if (!(
Syy >= 0 &&
Sxx >= 0 &&
See >= 0) ||
1241 !(
Sff < N * 1e9f &&
Syy < N * 1e9f &&
Sxx < N * 1e9f)) {
1242 st->screwed_up += 50;
1243 for (
int i = 0; i <
st->frame_size *
C; i++) out[i] = 0;
1244 }
else if (
Sff >
Sdd + N * 10000.0f) {
1250 if (
st->screwed_up >= 50) {
1256 if (
See < N * 100.0f)
See = N * 100.0f;
1260 st->x +
speak * N +
st->frame_size,
st->frame_size);
1265 for (
int j = 0;
j <=
st->frame_size;
j++)
1269 Num Pey = 0.0f, Pyy = 0.0f;
1270 for (
int j =
st->frame_size;
j >= 0;
j--) {
1273 Pey = Pey + Eh * Yh;
1274 Pyy = Pyy + Yh * Yh;
1276 (1 -
st->spec_average) *
st->Eh[
j] +
st->spec_average *
st->Rf[
j];
1278 (1 -
st->spec_average) *
st->Yh[
j] +
st->spec_average *
st->Yf[
j];
1287 if (Pyy < 1.0f) Pyy = 1.0f;
1298 if (
st->Pyy < 1.0f)
st->Pyy = 1.0f;
1300 if (
st->Pey >
st->Pyy)
st->Pey =
st->Pyy;
1302 st->leak_estimate =
st->Pey /
st->Pyy;
1303 if (
st->leak_estimate > 16383)
1304 st->leak_estimate = 32767;
1306 st->leak_estimate =
st->leak_estimate * 2;
1312 if (
RER > .5f)
RER = .5f;
1314 if (!
st->adapted &&
st->sum_adapt > M &&
1315 st->leak_estimate *
Syy > .03f *
Syy) {
1320 for (
int i = 0; i <=
st->frame_size; i++) {
1323 if (
r > .5f * e)
r = .5f * e;
1324 r = .7f *
r + .3f * (
RER * e);
1325 st->power_1[i] =
r / (e * (
st->power[i] + 10));
1329 if (
Sxx > N * 1000.0f) {
1334 for (
int i = 0; i <=
st->frame_size; i++)
1339 std::memmove(
st->last_y,
1340 &
st->last_y[
st->frame_size],
1343 for (
int i = 0; i <
st->frame_size; i++)
1344 st->last_y[
st->frame_size + i] = in[i] - out[i];
1368 if (!driver->
begin(size)) {
1380 auto* st =
static_cast<fft_state*
>(table);
1394template <
typename T>
1396 auto* st =
static_cast<fft_state*
>(table);
1397 if (!st || !st->driver)
return;
1400 for (
int i = 0; i < st->N; i++) {
1415 st->driver->getBin(0, dc_bin);
1416 out[0] = dc_bin.
real;
1417 for (
int i = 1; i < st->N - 1; i += 2) {
1418 int bin = (i + 1) / 2;
1420 st->driver->getBin(bin, fft_bin);
1421 out[i] = fft_bin.
real;
1422 out[i + 1] = fft_bin.
img;
1425 st->driver->getBin(st->N / 2, nyquist_bin);
1426 out[st->N - 1] = nyquist_bin.
real;
1437template <
typename T>
1439 auto* st =
static_cast<fft_state*
>(table);
1440 if (!st || !st->driver || !st->driver->isReverseFFT())
return;
1444 for (
int i = 1; i < st->N - 1; i += 2) {
1445 int bin = (i + 1) / 2;
1446 st->driver->setBin(bin, (
float)in[i], (float)in[i + 1]);
1448 st->driver->setBin(st->N / 2, (
float)in[st->N - 1], 0);
1454 for (
int i = 0; i < st->N; i++) {
1455 out[i] = st->driver->getValue(i);
#define ss
Definition AudioLoRa.h:8
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define ECHO_GET_IMPULSE_RESPONSE
Definition MDFEchoCancellation.h:52
#define ECHO_GET_SAMPLING_RATE
Definition MDFEchoCancellation.h:50
#define ECHO_SET_SAMPLING_RATE
Definition MDFEchoCancellation.h:49
#define ECHO_GET_IMPULSE_RESPONSE_SIZE
Definition MDFEchoCancellation.h:51
#define ECHO_GET_FRAME_SIZE
Definition MDFEchoCancellation.h:48
#define PLAYBACK_DELAY
Definition MDFEchoCancellationConfig.h:58
#define M_PI
Definition MDFEchoCancellationConfig.h:66
void play(maxi_float_t *channels)