Skip to content

Commit d2e479b

Browse files
committed
fft: update scale factors
1 parent 68b6ab8 commit d2e479b

File tree

2 files changed

+16
-19
lines changed

2 files changed

+16
-19
lines changed

main/inc/user/fft.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#define INC_USER_FFT_H_
1010

1111
#include <stdint.h>
12-
#include <complex.h>
1312

1413
#define TWO_PI (6.2831853f)
1514

main/src/user/fft.c

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ static float complex data[FFT_N] = {0.0};
1818
static float complex root[FFT_N / 2] = {0.0};
1919

2020
static bool generated = false;
21-
static char xdelay[BAND_N] = {0};
2221
static float xscale[BAND_N + 1] = {0.0};
2322

2423
static int bit_reverse(int x)
@@ -58,7 +57,7 @@ static void compute_log_xscale(float *xscale, int bands)
5857
}
5958
}
6059

61-
static float compute_freq_band(const float *freq, const float *xscale, int band, int bands)
60+
static float compute_freq_band(const float *freq, const float *xscale, int band)
6261
{
6362
float n = 0.0;
6463
int a = ceilf(xscale[band]);
@@ -78,24 +77,22 @@ static float compute_freq_band(const float *freq, const float *xscale, int band,
7877
}
7978
}
8079

81-
n *= bands / 12.0;
82-
83-
return 20 * log10f(n);
80+
return 20 * log10f(n * BAND_N / FFT_N / 12.0);
8481
}
8582

8683
void fft_compute_lin(uint16_t *data_out, uint16_t scale_factor, uint16_t max_val, uint16_t min_val)
8784
{
8885
float freq[FFT_N] = {0.0};
8986

9087
for (int i = 0; i < FFT_N / 2; i++) {
91-
freq[i * 2] = cabsf(data[i] + conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 512.0);
92-
freq[i * 2 + 1] = cabsf(data[i] - conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 512.0);
88+
freq[i * 2] = cabsf(data[i] + conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 511.0);
89+
freq[i * 2 + 1] = cabsf(data[i] - conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 511.0);
9390
}
9491

9592
freq[0] /= 2.0;
9693

9794
for (int i = 0; i < FFT_OUT_N; i++) {
98-
data_out[i] += freq[FFT_N / FFT_OUT_N * i] * (max_val / 32.0);
95+
data_out[i] += freq[FFT_N / FFT_OUT_N * i] * (max_val / 40.0);
9996
data_out[i] /= 2.0;
10097

10198
if (data_out[i] > max_val) {
@@ -111,14 +108,14 @@ void fft_compute_log(uint16_t *data_out, uint16_t scale_factor, uint16_t max_val
111108
float freq[FFT_N] = {0.0};
112109

113110
for (int i = 0; i < FFT_N / 2; i++) {
114-
freq[i * 2] = cabsf(data[i] + conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 512.0);
115-
freq[i * 2 + 1] = cabsf(data[i] - conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 512.0);
111+
freq[i * 2] = cabsf(data[i] + conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 511.0);
112+
freq[i * 2 + 1] = cabsf(data[i] - conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 511.0);
116113
}
117114

118115
freq[0] /= 2.0;
119116

120117
for (int i = 0; i < FFT_OUT_N; i++) {
121-
data_out[i] += 20 * log10f(1 + freq[FFT_N / FFT_OUT_N * i]) * (max_val / 32.0);
118+
data_out[i] += 20 * log10f(1 + freq[FFT_N / FFT_OUT_N * i]) * (max_val / 40.0);
122119
data_out[i] /= 2.0;
123120

124121
if (data_out[i] > max_val) {
@@ -132,27 +129,28 @@ void fft_compute_log(uint16_t *data_out, uint16_t scale_factor, uint16_t max_val
132129
void fft_compute_bands(uint16_t *data_out, uint16_t scale_factor, uint16_t max_val, uint16_t min_val)
133130
{
134131
float freq[FFT_N] = {0.0};
132+
static char delay[BAND_N] = {0};
135133

136134
for (int i = 0; i < FFT_N / 2; i++) {
137-
freq[i * 2] = cabsf(data[i] + conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 512.0 / FFT_N);
138-
freq[i * 2 + 1] = cabsf(data[i] - conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 512.0 / FFT_N);
135+
freq[i * 2] = cabsf(data[i] + conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 511.0);
136+
freq[i * 2 + 1] = cabsf(data[i] - conjf(data[FFT_N - 1 - i])) / 4.0 / FFT_N * (scale_factor / 511.0);
139137
}
140138

141139
freq[0] /= 2.0;
142140

143141
for (int i = 0; i < BAND_N; i++) {
144-
float x = (40 + compute_freq_band(freq, xscale, i, BAND_N)) * (max_val / 64.0);
142+
float x = (40 + compute_freq_band(freq, xscale, i)) * (max_val / 64.0);
145143

146-
data_out[i] = MAX(0, data_out[i] - (BAND_FADE - xdelay[i]));
144+
data_out[i] = MAX(0, data_out[i] - (BAND_FADE - delay[i]));
147145

148-
if (xdelay[i]) {
149-
xdelay[i]--;
146+
if (delay[i]) {
147+
delay[i]--;
150148
}
151149

152150
if (x > data_out[i]) {
153151
data_out[i]= x;
154152

155-
xdelay[i] = BAND_DELAY;
153+
delay[i] = BAND_DELAY;
156154
}
157155

158156
if (data_out[i] > max_val) {

0 commit comments

Comments
 (0)