31#if !FL_FFT_ESP_DSP_AVAILABLE
43using fl::audio::fft::detail::espDspRealForward;
48constexpr float TWO_PI_F = 6.28318530717958647692f;
53 return sqrtf(cpx[k].r * cpx[k].r + cpx[k].i * cpx[k].i);
59 for (
int i = 0; i < N; ++i) {
60 in[i] = 0.5f *
sinf(TWO_PI_F *
static_cast<float>(k) * i / N);
62 espDspRealForward(N, in, outBuf);
64 float peak = binMag(outBuf, k);
66 float maxOther = 0.0f;
67 for (
int b = 0; b <= N / 2; ++b) {
68 if (b >= k - 1 && b <= k + 1)
continue;
69 float m = binMag(outBuf, b);
70 if (m > maxOther) maxOther = m;
72 float ratio = peak / (maxOther > 1e-9f ? maxOther : 1e-9f);
73 bool ok = (peak > 10.0f * maxOther) && (peak > 50.0f);
78 Serial.print(
" maxOther=");
82 Serial.println(ok ?
" PASS" :
" FAIL");
89 for (
int i = 0; i < N; ++i) in[i] = 0.0f;
91 espDspRealForward(N, in, outBuf);
94 float minMag = 1e9f, maxMag = 0.0f;
95 for (
int b = 0; b <= N / 2; ++b) {
96 float m = binMag(outBuf, b);
97 if (m < minMag) minMag = m;
98 if (m > maxMag) maxMag = m;
100 bool ok = (minMag > 0.95f && maxMag < 1.05f);
101 Serial.print(
" impulse min=");
105 Serial.println(ok ?
" PASS" :
" FAIL");
112 for (
int i = 0; i < N; ++i) in[i] = 0.7f;
113 espDspRealForward(N, in, outBuf);
115 float dc = binMag(outBuf, 0);
116 float maxOther = 0.0f;
117 for (
int b = 1; b <= N / 2; ++b) {
118 float m = binMag(outBuf, b);
119 if (m > maxOther) maxOther = m;
121 bool ok = (dc > 100.0f) && (maxOther < 1.0f);
122 Serial.print(
" dc dc_bin=");
124 Serial.print(
" maxOther=");
125 Serial.print(maxOther, 4);
126 Serial.println(ok ?
" PASS" :
" FAIL");
133 for (
int i = 0; i < N; ++i) in[i] = 0.0f;
134 espDspRealForward(N, in, outBuf);
137 for (
int b = 0; b <= N / 2; ++b) {
138 float m = binMag(outBuf, b);
139 if (m > maxMag) maxMag = m;
141 bool ok = (maxMag < 1e-4f);
142 Serial.print(
" zero maxMag=");
144 Serial.println(ok ?
" PASS" :
" FAIL");
155 Serial.println(
"========================================");
156 Serial.println(
" ESP-DSP real-FFT sanity test (N=512)");
157 Serial.println(
"========================================");
159 bool allPassed =
true;
160 allPassed &= testZero();
161 allPassed &= testDc();
162 allPassed &= testImpulse();
163 allPassed &= testSine(40);
164 allPassed &= testSine(113);
165 allPassed &= testSine(200);
172 Serial.println(
"========================================");
173 Serial.println(allPassed ?
"FFT_PARITY_PASS" :
"FFT_PARITY_FAIL");
174 Serial.println(
"========================================");
float sqrtf(float value) FL_NOEXCEPT
float sinf(float value) FL_NOEXCEPT
void delay(u32 ms, bool run_async=true) FL_NOEXCEPT
Public delay wrapper that keeps bare Arduino delay() preferred after using fl::delay; while still all...