@@ -18,7 +18,6 @@ static float complex data[FFT_N] = {0.0};
1818static float complex root [FFT_N / 2 ] = {0.0 };
1919
2020static bool generated = false;
21- static char xdelay [BAND_N ] = {0 };
2221static float xscale [BAND_N + 1 ] = {0.0 };
2322
2423static 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
8683void 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
132129void 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