fft+analohADXL100x

Dependencies:   COG4050_ADT7420

Fork of COG4050_blink by valeria toffoli

Committer:
vtoffoli
Date:
Mon Nov 05 08:39:17 2018 +0000
Revision:
2:dbe2cc9e3b23
fft+analogADXL;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vtoffoli 2:dbe2cc9e3b23 1 // --------------------------------------------------------------------------------------------------------
vtoffoli 2:dbe2cc9e3b23 2 //
vtoffoli 2:dbe2cc9e3b23 3 // September 2018
vtoffoli 2:dbe2cc9e3b23 4 // Author: Valeria Toffoli, Rohan Gurav
vtoffoli 2:dbe2cc9e3b23 5 // --------------------------------------------------------------------------------------------------------
vtoffoli 2:dbe2cc9e3b23 6 //
vtoffoli 2:dbe2cc9e3b23 7 // FFT.h
vtoffoli 2:dbe2cc9e3b23 8 //
vtoffoli 2:dbe2cc9e3b23 9 // --------------------------------------------------------------------------------------------------------
vtoffoli 2:dbe2cc9e3b23 10 //
vtoffoli 2:dbe2cc9e3b23 11 // This library provides all the functions necessary to obtain the FFT form an analog ADXL connected with
vtoffoli 2:dbe2cc9e3b23 12 // EV-COG-AD3029 or EV-COG-AD4050 Board.
vtoffoli 2:dbe2cc9e3b23 13 //
vtoffoli 2:dbe2cc9e3b23 14 // Permission is hereby granted, free of charge, to any person obtaining
vtoffoli 2:dbe2cc9e3b23 15 // a copy of this software and associated documentation files (the
vtoffoli 2:dbe2cc9e3b23 16 // "Software"), to deal in the Software without restriction, including
vtoffoli 2:dbe2cc9e3b23 17 // without limitation the rights to use, copy, modify, merge, publish,
vtoffoli 2:dbe2cc9e3b23 18 // distribute, sublicense, and/or sell copies of the Software, and to
vtoffoli 2:dbe2cc9e3b23 19 // permit persons to whom the Software is furnished to do so, subject to
vtoffoli 2:dbe2cc9e3b23 20 // the following conditions:
vtoffoli 2:dbe2cc9e3b23 21 //
vtoffoli 2:dbe2cc9e3b23 22 // The above copyright notice and this permission notice shall be
vtoffoli 2:dbe2cc9e3b23 23 // included in all copies or substantial portions of the Software.
vtoffoli 2:dbe2cc9e3b23 24 //
vtoffoli 2:dbe2cc9e3b23 25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
vtoffoli 2:dbe2cc9e3b23 26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
vtoffoli 2:dbe2cc9e3b23 27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
vtoffoli 2:dbe2cc9e3b23 28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
vtoffoli 2:dbe2cc9e3b23 29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
vtoffoli 2:dbe2cc9e3b23 30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
vtoffoli 2:dbe2cc9e3b23 31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
vtoffoli 2:dbe2cc9e3b23 32 //
vtoffoli 2:dbe2cc9e3b23 33 // --------------------------------------------------------------------------------------------------------
vtoffoli 2:dbe2cc9e3b23 34
vtoffoli 2:dbe2cc9e3b23 35
vtoffoli 2:dbe2cc9e3b23 36
vtoffoli 2:dbe2cc9e3b23 37 #include <stdint.h>
vtoffoli 2:dbe2cc9e3b23 38 #include <math.h>
vtoffoli 2:dbe2cc9e3b23 39 #include <complex>
vtoffoli 2:dbe2cc9e3b23 40 #include "mbed.h"
vtoffoli 2:dbe2cc9e3b23 41 #include "FFT.h"
vtoffoli 2:dbe2cc9e3b23 42
vtoffoli 2:dbe2cc9e3b23 43
vtoffoli 2:dbe2cc9e3b23 44 int FFT::log2(int N) //funzione per calcolare il logaritmo in base 2 di un intero
vtoffoli 2:dbe2cc9e3b23 45 {
vtoffoli 2:dbe2cc9e3b23 46 int k = N, i = 0;
vtoffoli 2:dbe2cc9e3b23 47 while(k) {
vtoffoli 2:dbe2cc9e3b23 48 k >>= 1;
vtoffoli 2:dbe2cc9e3b23 49 i++;
vtoffoli 2:dbe2cc9e3b23 50 }
vtoffoli 2:dbe2cc9e3b23 51 return i - 1;
vtoffoli 2:dbe2cc9e3b23 52 }
vtoffoli 2:dbe2cc9e3b23 53
vtoffoli 2:dbe2cc9e3b23 54 int FFT::check(int n) //usato per controllare se il numero di componenti del vettore di input è una potenza di 2
vtoffoli 2:dbe2cc9e3b23 55 {
vtoffoli 2:dbe2cc9e3b23 56 return n > 0 && (n & (n - 1)) == 0;
vtoffoli 2:dbe2cc9e3b23 57 }
vtoffoli 2:dbe2cc9e3b23 58
vtoffoli 2:dbe2cc9e3b23 59 int FFT::reverse(int N, int n) //calcola il reverse number di ogni intero n rispetto al numero massimo N
vtoffoli 2:dbe2cc9e3b23 60 {
vtoffoli 2:dbe2cc9e3b23 61 int j, p = 0;
vtoffoli 2:dbe2cc9e3b23 62 for(j = 1; j <= log2(N); j++) {
vtoffoli 2:dbe2cc9e3b23 63 if(n & (1 << (log2(N) - j)))
vtoffoli 2:dbe2cc9e3b23 64 p |= 1 << (j - 1);
vtoffoli 2:dbe2cc9e3b23 65 }
vtoffoli 2:dbe2cc9e3b23 66 return p;
vtoffoli 2:dbe2cc9e3b23 67 }
vtoffoli 2:dbe2cc9e3b23 68
vtoffoli 2:dbe2cc9e3b23 69 void FFT::order(complex<double>* f1, int N) //dispone gli elementi del vettore ordinandoli per reverse order
vtoffoli 2:dbe2cc9e3b23 70 {
vtoffoli 2:dbe2cc9e3b23 71 complex<double> f2[N];
vtoffoli 2:dbe2cc9e3b23 72 for(int i = 0; i < N; i++)
vtoffoli 2:dbe2cc9e3b23 73 f2[i] = f1[reverse(N, i)];
vtoffoli 2:dbe2cc9e3b23 74 for(int j = 0; j < N; j++)
vtoffoli 2:dbe2cc9e3b23 75 f1[j] = f2[j];
vtoffoli 2:dbe2cc9e3b23 76 }
vtoffoli 2:dbe2cc9e3b23 77
vtoffoli 2:dbe2cc9e3b23 78 void FFT::transform(complex<double>* f, int N) //calcola il vettore trasformato
vtoffoli 2:dbe2cc9e3b23 79 {
vtoffoli 2:dbe2cc9e3b23 80 order(f, N); //dapprima lo ordina col reverse order
vtoffoli 2:dbe2cc9e3b23 81 complex<double> W[N / 2]; //vettore degli zeri dell'unità.
vtoffoli 2:dbe2cc9e3b23 82 //Prima N/2-1 ma genera errore con ciclo for successivo
vtoffoli 2:dbe2cc9e3b23 83 //in quanto prova a copiare in una zona non allocata "W[N/2-1]"
vtoffoli 2:dbe2cc9e3b23 84 W[1] = polar(1., -2. * M_PI / N);
vtoffoli 2:dbe2cc9e3b23 85 W[0] = 1;
vtoffoli 2:dbe2cc9e3b23 86 for(int i = 2; i < N / 2; i++)
vtoffoli 2:dbe2cc9e3b23 87 W[i] = pow(W[1], i);
vtoffoli 2:dbe2cc9e3b23 88 int n = 1;
vtoffoli 2:dbe2cc9e3b23 89 int a = N / 2;
vtoffoli 2:dbe2cc9e3b23 90 for(int j = 0; j < log2(N); j++) {
vtoffoli 2:dbe2cc9e3b23 91 for(int i = 0; i < N; i++) {
vtoffoli 2:dbe2cc9e3b23 92 if(!(i & n)) {
vtoffoli 2:dbe2cc9e3b23 93 /*ad ogni step di raddoppiamento di n, vengono utilizzati gli indici */
vtoffoli 2:dbe2cc9e3b23 94 /*'i' presi alternativamente a gruppetti di n, una volta si e una no.*/
vtoffoli 2:dbe2cc9e3b23 95 complex<double> temp = f[i];
vtoffoli 2:dbe2cc9e3b23 96 complex<double> Temp = W[(i * a) % (n * a)] * f[i + n];
vtoffoli 2:dbe2cc9e3b23 97 f[i] = temp + Temp;
vtoffoli 2:dbe2cc9e3b23 98 f[i + n] = temp - Temp;
vtoffoli 2:dbe2cc9e3b23 99 }
vtoffoli 2:dbe2cc9e3b23 100 }
vtoffoli 2:dbe2cc9e3b23 101 n *= 2;
vtoffoli 2:dbe2cc9e3b23 102 a = a / 2;
vtoffoli 2:dbe2cc9e3b23 103 }
vtoffoli 2:dbe2cc9e3b23 104 }
vtoffoli 2:dbe2cc9e3b23 105
vtoffoli 2:dbe2cc9e3b23 106 void FFT::fourier(complex<double>* f, int N, double d)
vtoffoli 2:dbe2cc9e3b23 107 {
vtoffoli 2:dbe2cc9e3b23 108 transform(f, N);
vtoffoli 2:dbe2cc9e3b23 109 for(int i = 0; i < N; i++)
vtoffoli 2:dbe2cc9e3b23 110 f[i] *= d; //moltiplica il vettore per il passo in modo da avere il vettore trasformato effettivo
vtoffoli 2:dbe2cc9e3b23 111 }