mbed port of FFT routines from STM32 DSP library and Ivan Mellen's implementation. Tested on LPC2368 mbed but should work on 1768 too (original code was written for Cortex-M3)
main.cpp@0:90ade34a3b71, 2009-12-13 (annotated)
- Committer:
- igorsk
- Date:
- Sun Dec 13 07:14:57 2009 +0000
- Revision:
- 0:90ade34a3b71
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
igorsk | 0:90ade34a3b71 | 1 | #include "mbed.h" |
igorsk | 0:90ade34a3b71 | 2 | #include <limits.h> |
igorsk | 0:90ade34a3b71 | 3 | |
igorsk | 0:90ade34a3b71 | 4 | DigitalOut myled(LED1); |
igorsk | 0:90ade34a3b71 | 5 | LocalFileSystem local("local"); |
igorsk | 0:90ade34a3b71 | 6 | |
igorsk | 0:90ade34a3b71 | 7 | // code from FFTCM3.s by Ivan Mellen |
igorsk | 0:90ade34a3b71 | 8 | // http://www.luminarymicro.com/component/option,com_joomlaboard/Itemid,92/func,view/id,1636/catid,6/ |
igorsk | 0:90ade34a3b71 | 9 | extern "C" void fftR4(short *y, short *x, int N); |
igorsk | 0:90ade34a3b71 | 10 | extern "C" void ifftR4(short *y, short *x, int N); |
igorsk | 0:90ade34a3b71 | 11 | |
igorsk | 0:90ade34a3b71 | 12 | // code from STM32 DSP Library |
igorsk | 0:90ade34a3b71 | 13 | /* 64 points*/ |
igorsk | 0:90ade34a3b71 | 14 | extern "C" void cr4_fft_64_stm32(void *pssOUT, void *pssIN, uint16_t Nbin); |
igorsk | 0:90ade34a3b71 | 15 | /* 256 points */ |
igorsk | 0:90ade34a3b71 | 16 | extern "C" void cr4_fft_256_stm32(void *pssOUT, void *pssIN, uint16_t Nbin); |
igorsk | 0:90ade34a3b71 | 17 | /* 1024 points */ |
igorsk | 0:90ade34a3b71 | 18 | extern "C" void cr4_fft_1024_stm32(void *pssOUT, void *pssIN, uint16_t Nbin); |
igorsk | 0:90ade34a3b71 | 19 | |
igorsk | 0:90ade34a3b71 | 20 | void test_stm32() |
igorsk | 0:90ade34a3b71 | 21 | { |
igorsk | 0:90ade34a3b71 | 22 | #define N 64 /*Number of points*/ |
igorsk | 0:90ade34a3b71 | 23 | uint32_t x[N], y[N]; /* input and output arrays */ |
igorsk | 0:90ade34a3b71 | 24 | int16_t real[N], imag[N]; /* real and imaginary arrays */ |
igorsk | 0:90ade34a3b71 | 25 | memset(real, 0, sizeof(real)); |
igorsk | 0:90ade34a3b71 | 26 | memset(imag, 0, sizeof(imag)); |
igorsk | 0:90ade34a3b71 | 27 | real[1]=SHRT_MAX; |
igorsk | 0:90ade34a3b71 | 28 | /* Fill the input array */ |
igorsk | 0:90ade34a3b71 | 29 | for (int i=0; i<N; i++) |
igorsk | 0:90ade34a3b71 | 30 | { |
igorsk | 0:90ade34a3b71 | 31 | x[i] = (((uint16_t)(real[i])) | ((uint32_t)(imag[i]<<16))); |
igorsk | 0:90ade34a3b71 | 32 | } |
igorsk | 0:90ade34a3b71 | 33 | cr4_fft_64_stm32(y, x, N); /*computes the FFT of the x[N] samples*/ |
igorsk | 0:90ade34a3b71 | 34 | FILE* log = fopen("/local/stm32.txt","w"); |
igorsk | 0:90ade34a3b71 | 35 | for (int i=0; i<N; i++) |
igorsk | 0:90ade34a3b71 | 36 | { |
igorsk | 0:90ade34a3b71 | 37 | fprintf(log, "%d: %d, %d -> %d, %d\n", i, real[i], imag[i], int16_t(y[i] & 0xFFFF), int16_t(y[i] >> 16)); |
igorsk | 0:90ade34a3b71 | 38 | } |
igorsk | 0:90ade34a3b71 | 39 | fclose(log); |
igorsk | 0:90ade34a3b71 | 40 | } |
igorsk | 0:90ade34a3b71 | 41 | |
igorsk | 0:90ade34a3b71 | 42 | void test_mellen() |
igorsk | 0:90ade34a3b71 | 43 | { |
igorsk | 0:90ade34a3b71 | 44 | short x[512]; // input data 16 bit, 4 byte aligned x0r,x0i,x1r,x1i,.... |
igorsk | 0:90ade34a3b71 | 45 | short y[512]; // output data 16 bit,4 byte aligned y0r,y0i,y1r,y1i,.... |
igorsk | 0:90ade34a3b71 | 46 | short z[512]; // same format... |
igorsk | 0:90ade34a3b71 | 47 | |
igorsk | 0:90ade34a3b71 | 48 | for (int i=0;i<512;i++) x[i]=0; |
igorsk | 0:90ade34a3b71 | 49 | for (int i=0;i<512;i=i+8) |
igorsk | 0:90ade34a3b71 | 50 | { x[i+0]=16384; x[i+2]=16384; x[i+4]=-16384; x[i+6]=-16384;} |
igorsk | 0:90ade34a3b71 | 51 | // x = [ 16384,16384,-16384,-16384,16384,...] 1/4 Fsampling |
igorsk | 0:90ade34a3b71 | 52 | |
igorsk | 0:90ade34a3b71 | 53 | //call functions |
igorsk | 0:90ade34a3b71 | 54 | fftR4(y, x, 256); // y is in frequency domain y[128]= |
igorsk | 0:90ade34a3b71 | 55 | printf("fftR4 ok\n"); |
igorsk | 0:90ade34a3b71 | 56 | ifftR4(z, y, 256); // z should be x/N + noise introduced by 16 bit truncating |
igorsk | 0:90ade34a3b71 | 57 | printf("ifftR4 ok\n"); |
igorsk | 0:90ade34a3b71 | 58 | FILE* log = fopen("/local/mellen.txt","w"); |
igorsk | 0:90ade34a3b71 | 59 | for (int i=0; i<256; i++) |
igorsk | 0:90ade34a3b71 | 60 | { |
igorsk | 0:90ade34a3b71 | 61 | fprintf(log, "%d: %d -> %d -> %d\n", i, x[i], y[i], z[i]); |
igorsk | 0:90ade34a3b71 | 62 | } |
igorsk | 0:90ade34a3b71 | 63 | fclose(log); |
igorsk | 0:90ade34a3b71 | 64 | } |
igorsk | 0:90ade34a3b71 | 65 | |
igorsk | 0:90ade34a3b71 | 66 | int main() |
igorsk | 0:90ade34a3b71 | 67 | { |
igorsk | 0:90ade34a3b71 | 68 | printf("Testing Mellen\n"); |
igorsk | 0:90ade34a3b71 | 69 | test_mellen(); |
igorsk | 0:90ade34a3b71 | 70 | printf("Testing STM32\n"); |
igorsk | 0:90ade34a3b71 | 71 | test_stm32(); |
igorsk | 0:90ade34a3b71 | 72 | printf("Done\n"); |
igorsk | 0:90ade34a3b71 | 73 | } |