Daniel Dobaño Fernandez
/
pruebas
Revision 0:e60134beb2ca, committed 2012-06-14
- Comitter:
- ddobano
- Date:
- Thu Jun 14 10:59:08 2012 +0000
- Commit message:
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Jun 14 10:59:08 2012 +0000 @@ -0,0 +1,158 @@ +#include "mbed.h" + + +DigitalOut myled(LED1); +DigitalOut led(LED2); +DigitalOut led2(LED3); +DigitalOut led3(LED4); +const int N=1024; // Sample number +struct TWIDDLE { // Structure factor for calculate fft + + float cosval [N/2]; + float sinval [N/2]; + +}; +void FFT(float datos[N], int n, TWIDDLE &w); //Declaration of functions +void enviodatos(float datos[N], int n); +Serial pc(USBTX, USBRX); //Declaration Serial port + +int main() { //Main program + myled.write(0); + led.write(0); + led2.write(0); + led3.write(0); + int i; //Parameters to calculate the values of a sine function. DATOS[N]=Amp*sin(w0*t) + float arg; + arg=2*3.1416/N; //argument of the structure TWIDDLE + float tm,t,w0,T, Amp; + tm=0.1; // increments of time (0,1seg) + t=0; //initial time + T=2*3.1416; //Period of signal + w0=(2*3.1416/T); // angular frequency + Amp=3; //Amplitude + struct TWIDDLE W; //Declarate of a type structure + + for (i=0; i<N/2; i++) { //Calculate all the TWIDDLE factors + W.cosval[i]= cos(i*arg); + W.sinval[i]= -sin(i*arg); + } + + float DATOS[N]; //array to save the sinus values + for (i=0; i<N; i++) { //calculate the sinus values + DATOS[i]=Amp*sin(w0*t); + t+=tm; + } + led.write(1); //Execution of the program to here OK + FFT(DATOS,N,W); //Function to calculate FFT + enviodatos(DATOS,N); //Function to send values to serial port + led3.write(1); //Execution of the program to here OK + while (1); // + +} + +void FFT(float datos[N], int n,TWIDDLE &w) { + float temp1, temp2, temp3,temp4; //variables needed to calculate FFT + int i,j,k,p; + int upper_leg, lower_leg; + int leg_diff; + int num_stages=0; + int index, step; + float datos_real[n], datos_imag[n]; //real and imaginary values + for (p=0; p<n; p++) { + datos_real[p]=datos[p]; + datos_imag[p]=0; + } + led2.write(1); // Execution of the program to here break it if N=>2048, else OK. + i=1; + do { + num_stages+=1; + i=i*2; + } while (i!=n); + + leg_diff=n/2; + step=1; + + for (i=0; i<num_stages; i++) { + index=0; + for (j=0; j<leg_diff; j++) { + for (upper_leg=j; upper_leg<n; upper_leg+=(2*leg_diff)) { + lower_leg=upper_leg+leg_diff; + + temp1= (datos_real[upper_leg]+ datos_real[lower_leg]); + temp2= (datos_real[upper_leg]- datos_real[lower_leg]); + temp3= (datos_imag[upper_leg]+ datos_imag[lower_leg]); + temp4= (datos_imag[upper_leg]- datos_imag[lower_leg]); + datos_real[lower_leg]= (temp2*w.cosval[index])-(temp4*w.sinval[index]); + datos_imag[lower_leg]= (temp2*w.sinval[index]+temp4*w.cosval[index]); + datos_real[upper_leg]= temp1; + datos_imag[upper_leg]= temp3; + } + index+=step; + } + leg_diff=leg_diff/2; + step*=2; + } +//bit reversal + + j=0; + for (i=1; i<(N-2); i++) { + k=n/2; + while (k<=j) { + j=j-k; + k=k/2; + } + j=j+k; + + if (i<j) { + temp1= datos_real[j]; + temp2= datos_imag[j]; + datos_real[j]=datos_real[i]; + datos_imag[j]=datos_imag[i]; + datos_real[i]=temp1; + datos_imag[i]=temp2; + } + } + + for (i=0; i<n; i++) { + + datos[i]= pow(sqrt(pow(datos_real[i],2)+pow(datos_imag[i],2)),2); //Calculate the power fft + }; + +} + +void enviodatos(float datos[N],int n) { + int i=0,j=0,k=0,aux=0; //send to serial port the values correctly. + unsigned char bytes[4]; + float dato; + + for (i=0; i<n; i++) { + dato=datos[i]; + aux=dato; + for (j=0; j<4; j++) { + switch (j) { + case 0: + bytes[j]=aux; + aux=aux>>8; + break; + case 1: + bytes[j]=aux; + aux=aux>>8; + break; + case 2: + bytes[j]=aux; + aux=aux>>8; + break; + case 3: + bytes[j]=aux; + aux=aux>>8; + break; + } + } + for (k=3; k>=0; k--) { + + while (pc.writeable()==0); + pc.putc(bytes[k]); + + } + } +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Jun 14 10:59:08 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/737756e0b479