#include #include #include #include //radiola #include #include #define SAMPLE_RATE 2048000 #define CENTER_FREQ 446018750 #define FFT_LEVEL 10 #define FFT_SIZE (1 << FFT_LEVEL) #define SAMPLE_LENGHT (2 * FFT_SIZE) #define PRESCALE 8 #define POSTSCALE 2 #define WIDTH_POINTS 32 int16_t* Sinewave; int N_WAVE, LOG2_N_WAVE; double* power_table; //better to have size size mod olen == 0 int normalise( uint8_t *ibuf, int ilen, uint8_t *obuf, int olen ) { uint32_t i,j,m; uint32_t ppi; uint32_t sum; div_t d; if ( ilen >= olen ) { d = div(ilen,olen); ppi = d.quot; if (d.rem > 0) ppi += 1; } else { printf("Input buffer smaller ther output buffer\n"); return -1; } m = 0; i = 0; for (i=0,m=0; i < ilen+ppi; i += ppi, m++) { sum = 0; for (j=0;j> 14; b = c & 0x01; return (c >> 1) + b; } int32_t real_conj(int16_t real, int16_t imag) /* real(n * conj(n)) */ { return ((int32_t)real*(int32_t)real + (int32_t)imag*(int32_t)imag); } int fix_fft(int16_t iq[], int m) /* interleaved iq[], 0 <= n < 2**m, changes in place */ { int mr, nn, i, j, l, k, istep, n, shift; int16_t qr, qi, tr, ti, wr, wi; n = 1 << m; if (n > N_WAVE) {return -1;} mr = 0; nn = n - 1; /* decimation in time - re-order data */ for (m=1; m<=nn; ++m) { l = n; do {l >>= 1;} while (mr+l > nn); mr = (mr & (l-1)) + l; if (mr <= m) {continue;} // real = 2*m, imag = 2*m+1 tr = iq[2*m]; iq[2*m] = iq[2*mr]; iq[2*mr] = tr; ti = iq[2*m+1]; iq[2*m+1] = iq[2*mr+1]; iq[2*mr+1] = ti; } l = 1; k = LOG2_N_WAVE-1; while (l < n) { shift = 1; istep = l << 1; for (m=0; m>= 1; wi >>= 1;} for (i=m; i>= 1; qi >>= 1;} iq[2*j] = qr - tr; iq[2*j+1] = qi - ti; iq[2*i] = qr + tr; iq[2*i+1] = qi + ti; } } --k; l = istep; } return 0; } //fftize int simple_fft( uint8_t *buf, int len ) { int i,j; uint16_t p; uint16_t buf1[SAMPLE_LENGHT]; uint16_t buf2[SAMPLE_LENGHT]; int fft_len; for (i=0; i