@@ -19,8 +19,6 @@ static float window[FFT_N * 2] = {0.0};
19
19
static float complex root [FFT_N ] = {0.0 };
20
20
static float complex data [FFT_N ] = {0.0 };
21
21
22
- static float xscale [BAND_N + 1 ] = {0.0 };
23
-
24
22
static bool generated = false;
25
23
26
24
static int bit_reverse (int x )
@@ -51,14 +49,9 @@ static void compute_fft_tables(void)
51
49
for (int i = 0 ; i < FFT_N ; i ++ ) {
52
50
root [i ] = cexpf (- I * i * TWO_PI / (FFT_N * 2 ));
53
51
}
54
-
55
- // log xscale
56
- for (int i = 0 ; i <= BAND_N ; i ++ ) {
57
- xscale [i ] = powf (FFT_N , (float )i / BAND_N ) - 0.5 ;
58
- }
59
52
}
60
53
61
- static float compute_freq_lin (const float * freq , int step , int idx )
54
+ static float compute_freq_lin (const float * freq , uint16_t step , uint16_t idx )
62
55
{
63
56
float n = 0.0 ;
64
57
@@ -69,7 +62,7 @@ static float compute_freq_lin(const float *freq, int step, int idx)
69
62
return n / step * 2.0 ;
70
63
}
71
64
72
- static float compute_freq_band (const float * freq , const float * xscale , int band )
65
+ static float compute_freq_band (const float * freq , const float * xscale , uint16_t bands , uint16_t band )
73
66
{
74
67
float n = 0.0 ;
75
68
@@ -92,13 +85,13 @@ static float compute_freq_band(const float *freq, const float *xscale, int band)
92
85
}
93
86
}
94
87
95
- return 20 * log10f (n * BAND_N / FFT_N / 12.0 );
88
+ return 20 * log10f (n * bands / FFT_N / 12.0 );
96
89
}
97
90
98
- void fft_compute_lin (uint16_t * data_out , uint16_t max_val , uint16_t min_val )
91
+ void fft_compute_lin (uint16_t * data_out , uint16_t num , uint16_t step , uint16_t max_val , uint16_t min_val )
99
92
{
100
- for (int i = 0 ; i < FFT_OUT_N ; i ++ ) {
101
- data_out [i ] += compute_freq_lin (freq , FFT_N / FFT_OUT_N , i ) * (max_val / 40.0 );
93
+ for (int i = 0 ; i < num ; i ++ ) {
94
+ data_out [i ] += compute_freq_lin (freq , step , i ) * (max_val / 40.0 );
102
95
data_out [i ] /= 2.0 ;
103
96
104
97
if (data_out [i ] > max_val ) {
@@ -109,10 +102,10 @@ void fft_compute_lin(uint16_t *data_out, uint16_t max_val, uint16_t min_val)
109
102
}
110
103
}
111
104
112
- void fft_compute_log (uint16_t * data_out , uint16_t max_val , uint16_t min_val )
105
+ void fft_compute_log (uint16_t * data_out , uint16_t num , uint16_t step , uint16_t max_val , uint16_t min_val )
113
106
{
114
- for (int i = 0 ; i < FFT_OUT_N ; i ++ ) {
115
- data_out [i ] += 20 * log10f (1 + compute_freq_lin (freq , FFT_N / FFT_OUT_N , i )) * (max_val / 40.0 );
107
+ for (int i = 0 ; i < num ; i ++ ) {
108
+ data_out [i ] += 20 * log10f (1 + compute_freq_lin (freq , step , i )) * (max_val / 40.0 );
116
109
data_out [i ] /= 2.0 ;
117
110
118
111
if (data_out [i ] > max_val ) {
@@ -123,12 +116,12 @@ void fft_compute_log(uint16_t *data_out, uint16_t max_val, uint16_t min_val)
123
116
}
124
117
}
125
118
126
- void fft_compute_bands (uint16_t * data_out , uint16_t max_val , uint16_t min_val )
119
+ void fft_compute_bands (uint16_t * data_out , const float * xscale , uint16_t bands , uint16_t * delay , uint16_t max_val , uint16_t min_val )
127
120
{
128
- static char delay [ BAND_N ] = { 0 };
121
+ enum { BAND_FADE = 2 , BAND_DELAY = 2 };
129
122
130
- for (int i = 0 ; i < BAND_N ; i ++ ) {
131
- float x = (40 + compute_freq_band (freq , xscale , i )) * (max_val / 64.0 );
123
+ for (int i = 0 ; i < bands ; i ++ ) {
124
+ float x = (40 + compute_freq_band (freq , xscale , bands , i )) * (max_val / 64.0 );
132
125
133
126
data_out [i ] = MAX (0 , data_out [i ] - (BAND_FADE - delay [i ]));
134
127
@@ -137,7 +130,7 @@ void fft_compute_bands(uint16_t *data_out, uint16_t max_val, uint16_t min_val)
137
130
}
138
131
139
132
if (x > data_out [i ]) {
140
- data_out [i ]= x ;
133
+ data_out [i ] = x ;
141
134
142
135
delay [i ] = BAND_DELAY ;
143
136
}
@@ -150,6 +143,13 @@ void fft_compute_bands(uint16_t *data_out, uint16_t max_val, uint16_t min_val)
150
143
}
151
144
}
152
145
146
+ void fft_compute_xscale (float * xscale , uint16_t bands )
147
+ {
148
+ for (int i = 0 ; i <= bands ; i ++ ) {
149
+ xscale [i ] = powf (FFT_N , (float )i / bands ) - 0.5 ;
150
+ }
151
+ }
152
+
153
153
void fft_execute (float scale_factor )
154
154
{
155
155
float complex even = 0 , odd = 0 ;
0 commit comments