Use compact variant sin_cos table in fft (not decrease speed, and need only 208 bytes flash)

This commit is contained in:
DiSlord 2020-03-23 15:10:01 +03:00
parent 9221ad04ca
commit 48e28f79d0

25
fft.h
View file

@ -26,6 +26,8 @@
#include <math.h> #include <math.h>
#include <stdint.h> #include <stdint.h>
// Use table increase transform speed from 6500 tick to 2025, increase code size on 700 bytes
// Use compact table, increase code size on 208 bytes, and not decrease speed
#define FFT_USE_SIN_COS_TABLE #define FFT_USE_SIN_COS_TABLE
static uint16_t reverse_bits(uint16_t x, int n) { static uint16_t reverse_bits(uint16_t x, int n) {
@ -43,6 +45,7 @@ static const float sin_table[] = {
printf("% .8f,%c", sin(2 * M_PI * i / FFT_SIZE), i % 8 == 7 ? '\n' : ' '); printf("% .8f,%c", sin(2 * M_PI * i / FFT_SIZE), i % 8 == 7 ? '\n' : ' ');
} }
*/ */
// for FFT_SIZE = 256
0.00000000, 0.02454123, 0.04906767, 0.07356456, 0.09801714, 0.12241068, 0.14673047, 0.17096189, 0.00000000, 0.02454123, 0.04906767, 0.07356456, 0.09801714, 0.12241068, 0.14673047, 0.17096189,
0.19509032, 0.21910124, 0.24298018, 0.26671276, 0.29028468, 0.31368174, 0.33688985, 0.35989504, 0.19509032, 0.21910124, 0.24298018, 0.26671276, 0.29028468, 0.31368174, 0.33688985, 0.35989504,
0.38268343, 0.40524131, 0.42755509, 0.44961133, 0.47139674, 0.49289819, 0.51410274, 0.53499762, 0.38268343, 0.40524131, 0.42755509, 0.44961133, 0.47139674, 0.49289819, 0.51410274, 0.53499762,
@ -51,7 +54,7 @@ static const float sin_table[] = {
0.83146961, 0.84485357, 0.85772861, 0.87008699, 0.88192126, 0.89322430, 0.90398929, 0.91420976, 0.83146961, 0.84485357, 0.85772861, 0.87008699, 0.88192126, 0.89322430, 0.90398929, 0.91420976,
0.92387953, 0.93299280, 0.94154407, 0.94952818, 0.95694034, 0.96377607, 0.97003125, 0.97570213, 0.92387953, 0.93299280, 0.94154407, 0.94952818, 0.95694034, 0.96377607, 0.97003125, 0.97570213,
0.98078528, 0.98527764, 0.98917651, 0.99247953, 0.99518473, 0.99729046, 0.99879546, 0.99969882, 0.98078528, 0.98527764, 0.98917651, 0.99247953, 0.99518473, 0.99729046, 0.99879546, 0.99969882,
1.00000000, 0.99969882, 0.99879546, 0.99729046, 0.99518473, 0.99247953, 0.98917651, 0.98527764, 1.00000000,/* 0.99969882, 0.99879546, 0.99729046, 0.99518473, 0.99247953, 0.98917651, 0.98527764,
0.98078528, 0.97570213, 0.97003125, 0.96377607, 0.95694034, 0.94952818, 0.94154407, 0.93299280, 0.98078528, 0.97570213, 0.97003125, 0.96377607, 0.95694034, 0.94952818, 0.94154407, 0.93299280,
0.92387953, 0.91420976, 0.90398929, 0.89322430, 0.88192126, 0.87008699, 0.85772861, 0.84485357, 0.92387953, 0.91420976, 0.90398929, 0.89322430, 0.88192126, 0.87008699, 0.85772861, 0.84485357,
0.83146961, 0.81758481, 0.80320753, 0.78834643, 0.77301045, 0.75720885, 0.74095113, 0.72424708, 0.83146961, 0.81758481, 0.80320753, 0.78834643, 0.77301045, 0.75720885, 0.74095113, 0.72424708,
@ -66,9 +69,19 @@ static const float sin_table[] = {
-0.70710678, -0.72424708, -0.74095113, -0.75720885, -0.77301045, -0.78834643, -0.80320753, -0.81758481, -0.70710678, -0.72424708, -0.74095113, -0.75720885, -0.77301045, -0.78834643, -0.80320753, -0.81758481,
-0.83146961, -0.84485357, -0.85772861, -0.87008699, -0.88192126, -0.89322430, -0.90398929, -0.91420976, -0.83146961, -0.84485357, -0.85772861, -0.87008699, -0.88192126, -0.89322430, -0.90398929, -0.91420976,
-0.92387953, -0.93299280, -0.94154407, -0.94952818, -0.95694034, -0.96377607, -0.97003125, -0.97570213, -0.92387953, -0.93299280, -0.94154407, -0.94952818, -0.95694034, -0.96377607, -0.97003125, -0.97570213,
-0.98078528, -0.98527764, -0.98917651, -0.99247953, -0.99518473, -0.99729046, -0.99879546, -0.99969882, -0.98078528, -0.98527764, -0.98917651, -0.99247953, -0.99518473, -0.99729046, -0.99879546, -0.99969882,*/
}; };
const float* const cos_table = &sin_table[64]; // full size table:
// sin = sin_table[i ]
// cos = sin_table[i+64]
//#define SIN(i) sin_table[(i)]
//#define COS(i) sin_table[(i)+64]
// for size use only 0-64 indexes
// sin = i > 64 ? sin_table[128-i] : sin_table[ i];
// cos = i > 64 ?-sin_table[ i-64] : sin_table[64-i];
#define SIN(i) ((i) > 64 ? sin_table[128-(i)] : sin_table[ (i)])
#define COS(i) ((i) > 64 ?-sin_table[ (i)-64] : sin_table[64-(i)])
#endif #endif
/*** /***
@ -104,8 +117,10 @@ static void fft256(float array[][2], const uint8_t dir) {
uint16_t j, k; uint16_t j, k;
for (j = i, k = 0; j < i + halfsize; j++, k += tablestep) { for (j = i, k = 0; j < i + halfsize; j++, k += tablestep) {
uint16_t l = j + halfsize; uint16_t l = j + halfsize;
float tpre = array[l][real] * cos_table[k] + array[l][imag] * sin_table[k]; float s = SIN(k);
float tpim = -array[l][real] * sin_table[k] + array[l][imag] * cos_table[k]; float c = COS(k);
float tpre = array[l][real] * c + array[l][imag] * s;
float tpim = -array[l][real] * s + array[l][imag] * c;
array[l][real] = array[j][real] - tpre; array[l][real] = array[j][real] - tpre;
array[l][imag] = array[j][imag] - tpim; array[l][imag] = array[j][imag] - tpim;
array[j][real] += tpre; array[j][real] += tpre;