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)

Dependencies:   mbed

Committer:
igorsk
Date:
Sun Dec 13 07:14:57 2009 +0000
Revision:
0:90ade34a3b71

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }