valeria toffoli
/
COG4050_analogSensor
fft+analohADXL100x
Fork of COG4050_blink by
FFT/FFT.cpp@2:dbe2cc9e3b23, 2018-11-05 (annotated)
- Committer:
- vtoffoli
- Date:
- Mon Nov 05 08:39:17 2018 +0000
- Revision:
- 2:dbe2cc9e3b23
fft+analogADXL;
Who changed what in which revision?
User | Revision | Line number | New 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 | } |