fft_implementation_draft1

Dependencies:   mbed

Revision:
0:b723ff6df537
Child:
1:b86b60ae81af
diff -r 000000000000 -r b723ff6df537 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Mar 07 11:06:31 2018 +0000
@@ -0,0 +1,127 @@
+#include <mbed.h>
+
+#include <iostream>
+#include <complex>
+#define MAX 2048
+#define M_PI 3.1415926535897932384
+
+using namespace std;
+
+
+float s;
+float a = 1; //amplitude
+float pi = 3.142; //pi
+float o = 1/2; //offset
+float time_count = 0;
+
+int i = 0; //iteration counter
+int f1 = 100; //frequency in Hz
+//int f2 = 250; //frequency in Hz
+//int f3 = 500; //frequency in Hz
+float step = 1/(5*f1);
+float time[MAX] = 0;
+
+float* generateTimeVector (float* timeVec, int vecSize, float stepSize)
+{
+    for(int i=1; i<=vecSize; i++)
+    {
+        timeVec[i] = i*stepSize;
+    }
+    return timeVec;  
+}
+
+bool set1 = false;
+bool set2 = false;
+bool set3 = false;
+
+void sineVector (complex<double>* sineVector, int i, int freqHz, int amplitude, int offset);
+
+int log2(int N)    /*function to calculate the log2(.) of int numbers*/
+{
+  int k = N, i = 0;
+  while(k) {
+    k >>= 1;
+    i++;
+  }
+  return i - 1;
+}
+
+int check(int n)    //checking if the number of element is a power of 2
+{
+  return n > 0 && (n & (n - 1)) == 0;
+}
+
+int reverse(int N, int n)    //calculating revers number
+{
+  int j, p = 0;
+  for(j = 1; j <= log2(N); j++) {
+    if(n & (1 << (log2(N) - j)))
+      p |= 1 << (j - 1);
+  }
+  return p;
+}
+
+void ordina(complex<double>* f1, int N) //using the reverse order in the array
+{
+  complex<double> f2[MAX];
+  for(int i = 0; i < N; i++)
+    f2[i] = f1[reverse(N, i)];
+  for(int j = 0; j < N; j++)
+    f1[j] = f2[j];
+}
+
+void transform(complex<double>* f, int N) //
+{
+  ordina(f, N);    //first: reverse order
+  complex<double> *W;
+  W = (complex<double> *)malloc(N / 2 * sizeof(complex<double>));
+  W[1] = polar(1., -2. * M_PI / N);
+  W[0] = 1;
+  for(int i = 2; i < N / 2; i++)
+    W[i] = pow(W[1], i);
+  int n = 1;
+  int a = N / 2;
+  for(int j = 0; j < log2(N); j++) {
+    for(int i = 0; i < N; i++) {
+      if(!(i & n)) {
+        complex<double> temp = f[i];
+        complex<double> Temp = W[(i * a) % (n * a)] * f[i + n];
+        f[i] = temp + Temp;
+        f[i + n] = temp - Temp;
+      }
+    }
+    n *= 2;
+    a = a / 2;
+  }
+}
+
+void FFT(complex<double>* f, int N, double d)
+{
+  transform(f, N);
+  for(int i = 0; i < N; i++)
+    f[i] *= d; //multiplying by step
+}
+
+int main()
+{
+  complex<double> vec[MAX];
+  for (i = 0; i < MAX; i++)
+  {
+      sineVector(vec, i, f1, a, 0);
+  }
+  
+  FFT(vec, MAX, 1); //'d' should be 1 in order to have the same results of matlab fft(.)
+  cout << "...printing the FFT of the array specified" << endl;
+  for(int j = 0; j < MAX; j++)
+  {
+     cout << vec[j] << endl; 
+  }
+    
+  return 0;
+}
+
+
+void sineVector (complex<double>* sineVector, int i, int freqHz, int amplitude, int offset)
+{
+       sineVector[i] = offset + amplitude*sin((pi/180) * freqHz * i);
+}