oldexamplecode

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
rik
Date:
Fri Mar 24 11:22:30 2017 +0000
Commit message:
oldexamplecode;

Changed in this revision

DFT.cpp Show annotated file Show diff for this revision Revisions of this file
DFT.h Show annotated file Show diff for this revision Revisions of this file
LookupTables.cpp Show annotated file Show diff for this revision Revisions of this file
LookupTables.h Show annotated file Show diff for this revision Revisions of this file
PSDdetection.cpp Show annotated file Show diff for this revision Revisions of this file
PSDdetection.h Show annotated file Show diff for this revision Revisions of this file
complexmath.cpp Show annotated file Show diff for this revision Revisions of this file
complexmath.h Show annotated file Show diff for this revision Revisions of this file
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
diff -r 000000000000 -r 6863633bf8a4 DFT.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DFT.cpp	Fri Mar 24 11:22:30 2017 +0000
@@ -0,0 +1,148 @@
+
+#include "DFT.h"
+
+
+// Preprocesses the data array and performs a dft on it, ARRAY MUST BE 1024 LONG
+void performFFT(float* datam, int datalength){
+	if (datalength == 1024){
+		// - Calculating and substracting the mean  - Takes ~2N additions
+		subMean(datam, datalength);
+		// - Applying a hanning window - N multiplications
+		applyHanningTable(datam, datalength);
+		// - Re-indexing the array - 2N operations
+		reindexData(datam, datalength);
+		// It then applies a radix-2 Cooley Tukey FFT to create a DFT of the original signal
+		cooleyTukeyRadix2(datam, datalength);
+		// Remove the DC component and null everything above the nyquist
+		afterProcessing(datam, datalength);
+	}
+	// Thus preprocessing takes 5N operations
+	// FFT itself takes NlogN operations
+	// Calculating to complex is N operations
+	// Calulating the complex back to magnitude is ~4N operations
+	// Total operation time is thus ~10N + NlogN complex operations
+}
+
+// Performs a radix-2 cooley tukey FFT on the data array
+void cooleyTukeyRadix2(float* data, int datalength){
+	
+	complex_num fftdata[1024];
+	complex_num fftbuffer[512];
+	complex_num twiddlebuffer;
+
+	complex_num minusone;
+	minusone.real = -1;
+	minusone.imaginary = 0;
+
+	// Convert data to complex data
+	for (int i = 0; i < datalength; i++){
+		fftdata[i].real = data[i];
+		fftdata[i].imaginary = 0;
+		}
+
+	for (int stage = 0; stage < 10; stage++){
+
+		unsigned int step = 1<<(stage+1);
+
+		for (unsigned int i = 0; i < 1024; i = i+step){ // Crack it up in parts, i.e. for stage0 -> 512, stage1 -> 256 , 2>128, 3>64, 4>32, 5>16, 6>8, 7>4, 8>2, 9>1 --> 1024/2^stage OR IN STEPS: stage0 -> 2,   stage1 -> 4,    2>8,   3>16, 4,32, 5>64, .........      9>512 --> 1024 - 1024/2^stage+1
+			// Buffer the first 'half' of the thing, which is the first half step
+			for (unsigned int k = 0; k < step / 2; k++){
+				fftbuffer[k].real = fftdata[i+k].real;
+				fftbuffer[k].imaginary = fftdata[i+k].imaginary;
+			}
+			
+			// Apply twiddle factors to the seconds half (half step) depending on stage and numbering
+			for (unsigned int k = 0; k < step / 2; k++){
+				// Read in the correct twiddle factor
+				// Twiddle factor is recalculated with k*(1024 / 2^stage+1) which can be recalculated to 1<<
+				twiddlebuffer.imaginary = twiddleLookupTable_Imaginary[k * (1<<(9-stage))];
+				twiddlebuffer.real = twiddleLookupTable_Real[k * (1 << (9 - stage))];
+				
+				fftdata[i + k + step / 2] = complex_multiply(fftdata[i + k + step / 2], twiddlebuffer);
+			}
+			
+			// Recalculate the first half by addition of the first and recalculated half
+			for (unsigned int k = 0; k < step / 2; k++)
+				fftdata[i + k] = complex_add(fftdata[i+k], fftdata[i+k+step/2]);
+			
+
+			// Multiply the second half with minus 1
+			for (unsigned int k = 0; k < step / 2; k++)
+				fftdata[i + step / 2 + k] = complex_multiply(fftdata[i + step/2+k], minusone);
+
+			// Add the buffered old values, with the new second half values
+			for (unsigned int k = 0; k < step / 2; k++)
+				fftdata[i + step / 2 + k] = complex_add(fftdata[i + step/2 + k], fftbuffer[k]);
+		}
+	}
+
+	// Convert complex data back to magnitude data
+	for (int i = 0; i < 1024; i++)
+		data[i] = complex_magnitude(fftdata[i]);
+}
+
+// Calculates and subtracts the signal mean - Takes ~2N operations
+void subMean(float* data, int datalength){
+	float mean = 0;
+	float total = 0;
+	// Because the data is between 0 and 1, we can just sum and then device by datalength
+	// Normally you would devide each data sample by the datalength and sum all of those (to prevent overflow), so this saves N times multiplications
+	for (int i = 0; i < datalength; i++)
+		total += data[i];
+
+	mean = total / datalength;
+
+	for (int i = 0; i < datalength; i++)
+		data[i] = data[i] - mean;
+
+}
+
+// Reindexes the array in preperation of the FFT implemented using a LUT, 2N operations
+void reindexData(float* data, int datalength){
+
+	float reordereddata[1024];
+
+	for (int i = 0; i < datalength; i++){
+		reordereddata[reversebit_lut_i[i]] = data[i];
+	}
+
+	// Copy all the reorderddata to the original array (datalength*int size in bytes)
+	memcpy(data, reordereddata, datalength*4);
+}
+
+// Removes the DC component and null everything above the nyquist frequency
+void afterProcessing(float* data, int datalength){
+	data[0] = 0; // Set DC component to 0
+
+	for (int i = datalength-1; i > datalength / 2; i--) // Null everything above the nyquist frequency 
+		data[i] = 0;
+
+	// FIlter 50hz
+	filterfreq(50, data, datalength);
+}
+
+// Filters a frequency and its multiples
+void filterfreq(int frequency, float* data, int datalength){
+	int niggr = 512;
+	int freqperbin = 10;
+	// Calculate which bin contains the frequency
+	int bin = frequency / freqperbin;
+
+	// Null bin frequencies and the two surrounding bins, plus its multiples adjecent
+	do{
+		if (bin - 1 >= 0) // Negative elements = you gonna have a bad time
+			data[bin - 1] = 0;
+		data[bin] = 0;
+		data[bin + 1] = 0; // Since element 512-1024 also exist, we can null it even if it isnt really usefull
+		bin *= 2;
+	} while (bin<niggr);
+}
+
+// Calculate total magnitude, frequency magnitude component integrating module (FMCIM)
+int calcPSD(float* data, int datalength){
+	float knoedel=0;
+	for (int i = 0; i < datalength; i++){
+		knoedel += (float)data[i];
+	}
+	return (int)knoedel;
+}
\ No newline at end of file
diff -r 000000000000 -r 6863633bf8a4 DFT.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DFT.h	Fri Mar 24 11:22:30 2017 +0000
@@ -0,0 +1,37 @@
+
+// This file first preprocesses a 1024 long data array by:
+// - Calculating and substracting the mean
+// - Applying a hanning window
+// - Re-indexing the array
+// It then applies a radix-2 Cooley Tukey FFT to create a DFT of the original signal
+
+#pragma once
+#ifndef _DFT_H_
+#define _DFT_H_
+
+#include <string.h> // Only for memcpy
+#include "LookupTables.h"
+#include "complexmath.h"
+
+// Preprocesses the data array and performs a dft on it, ARRAY MUST BE 1024 LONG
+void performFFT(float* datam, int datalength);
+
+// Performs a radix-2 cooley tukey FFT on the data array
+void cooleyTukeyRadix2(float* data, int datalength);
+
+// Calculates and subtracts the signal mean
+void subMean(float* data, int datalength);
+
+// Reindexes the array in preperation of the FFT
+void reindexData(float* data, int datalength);
+
+// Removes the DC component and null everything above the nyquist frequency
+void afterProcessing(float* data, int datalength);
+
+// Filter a frequency and its multiples
+void filterfreq(int frequency, float* data, int datalength);
+
+// Calculate total magnitude, frequency magnitude component integrating module (FMCIM)
+int calcPSD(float* data, int datalength);
+
+#endif
\ No newline at end of file
diff -r 000000000000 -r 6863633bf8a4 LookupTables.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LookupTables.cpp	Fri Mar 24 11:22:30 2017 +0000
@@ -0,0 +1,67 @@
+
+#include "LookupTables.h"
+
+////////////////// COSINE SINE LOOKUP TABLES
+
+// Returns the cosine value using the lut of a given value
+float lut_cos(float value){
+	// Cosine is symmetric so convert to absolute
+	if (value < 0)
+		value = -value;
+
+	// and subtract the "offset"
+	//float actualvalue = (float)(value % (2*M_PI));
+
+	while (value >= 2 * (float)M_PI){
+		value -= 2 * (float)M_PI;
+	}
+
+	// Calculate the value to a discrete value (1024*0.00613592 = 2 pi)
+	int discreteValue = (int)(value / 0.00613592);
+
+	return cosLookupTable_f[discreteValue];
+}
+// Returns the sine value using the lut for a given value
+float lut_sin(float value){
+	// Convert to cosine
+	value -= 0.5*(float)M_PI;
+	// Cosine is symmetric so convert to absolute
+	if (value < 0)
+		value = -value;
+
+	// subtract the "offset" of the original 0-2pi
+	//float actualvalue = (float)(value % (float)(2 * M_PI));
+
+	while (value >= (2 * (float)M_PI)){
+		value -= (2 * (float)M_PI);
+	}
+
+	// Calculate the value to a discrete value (1024*0.00613592 = 2 pi)
+	int discreteValue = (int)(value / 0.00613592);
+
+	return cosLookupTable_f[discreteValue];
+}
+
+// Returns the cosine value using the lut of a given value
+// WARNING, FAST VERSION ONLY WORKS WITH VALUES 0 - 2 PI
+float lut_cos_f(float value){
+	// Calculate the value to a discrete value (1024*0.00613592 = 2 pi)
+	int discreteValue = (int)(value / 0.00613592);
+
+	return cosLookupTable_f[discreteValue];
+}
+
+////////////////// END COSINE SINE LOOKUP TABLES
+
+////////////////// HANNING LOOKUP TABLE
+
+// Applies the hanning LUT to the supplied array of data
+void applyHanningTable(float* data, int datasize){
+	if (datasize == 1024){ // Only works for 10 bit data arrays
+		for (int i = 0; i < 1024; i++){
+			data[i] *= hanningTable_f[i];
+		}
+	}
+}
+
+////////////////// END HANNING LOOKUP TABLE
\ No newline at end of file
diff -r 000000000000 -r 6863633bf8a4 LookupTables.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LookupTables.h	Fri Mar 24 11:22:30 2017 +0000
@@ -0,0 +1,49 @@
+
+//
+// This file contains all the lookup tables needed for the robot
+//
+
+#pragma once
+#ifndef _LOOKUP_TABLES_H
+#define _LOOKUP_TABLES_H
+
+#define M_PI           3.14159265358979323846
+
+
+////////////////// COSINE SINE LOOKUP TABLES
+// 10 bit lookup table for the cosine function (NOTE lookup table for the sine is generated with an offset)
+const float cosLookupTable_f[] = { 1, 0.999981, 0.999925, 0.999831, 0.999699, 0.999529, 0.999322, 0.999078, 0.998795, 0.998476, 0.998118, 0.997723, 0.99729, 0.99682, 0.996313, 0.995767, 0.995185, 0.994565, 0.993907, 0.993212, 0.99248, 0.99171, 0.990903, 0.990058, 0.989177, 0.988258, 0.987301, 0.986308, 0.985278, 0.98421, 0.983105, 0.981964, 0.980785, 0.97957, 0.978317, 0.977028, 0.975702, 0.974339, 0.97294, 0.971504, 0.970031, 0.968522, 0.966976, 0.965394, 0.963776, 0.962121, 0.960431, 0.958703, 0.95694, 0.955141, 0.953306, 0.951435, 0.949528, 0.947586, 0.945607, 0.943593, 0.941544, 0.939459, 0.937339, 0.935184, 0.932993, 0.930767, 0.928506, 0.92621, 0.92388, 0.921514, 0.919114, 0.916679, 0.91421, 0.911706, 0.909168, 0.906596, 0.903989, 0.901349, 0.898674, 0.895966, 0.893224, 0.890449, 0.88764, 0.884797, 0.881921, 0.879012, 0.87607, 0.873095, 0.870087, 0.867046, 0.863973, 0.860867, 0.857729, 0.854558, 0.851355, 0.84812, 0.844854, 0.841555, 0.838225, 0.834863, 0.83147, 0.828045, 0.824589, 0.821102, 0.817585, 0.814036, 0.810457, 0.806848, 0.803208, 0.799537, 0.795837, 0.792107, 0.788346, 0.784557, 0.780737, 0.776888, 0.77301, 0.769103, 0.765167, 0.761202, 0.757209, 0.753187, 0.749136, 0.745058, 0.740951, 0.736817, 0.732654, 0.728464, 0.724247, 0.720002, 0.715731, 0.711432, 0.707107, 0.702755, 0.698376, 0.693971, 0.689541, 0.685084, 0.680601, 0.676093, 0.671559, 0.667, 0.662416, 0.657807, 0.653173, 0.648514, 0.643832, 0.639124, 0.634393, 0.629638, 0.624859, 0.620057, 0.615232, 0.610383, 0.605511, 0.600616, 0.595699, 0.59076, 0.585798, 0.580814, 0.575808, 0.570781, 0.565732, 0.560662, 0.55557, 0.550458, 0.545325, 0.540172, 0.534998, 0.529804, 0.52459, 0.519356, 0.514103, 0.50883, 0.503538, 0.498228, 0.492898, 0.48755, 0.482184, 0.476799, 0.471397, 0.465977, 0.460539, 0.455084, 0.449611, 0.444122, 0.438616, 0.433094, 0.427555, 0.422, 0.41643, 0.410843, 0.405241, 0.399624, 0.393992, 0.388345, 0.382683, 0.377007, 0.371317, 0.365613, 0.359895, 0.354163, 0.348419, 0.342661, 0.33689, 0.331106, 0.32531, 0.319502, 0.313682, 0.30785, 0.302006, 0.296151, 0.290285, 0.284407, 0.27852, 0.272621, 0.266713, 0.260794, 0.254866, 0.248928, 0.24298, 0.237024, 0.231058, 0.225084, 0.219101, 0.21311, 0.207111, 0.201105, 0.19509, 0.189069, 0.18304, 0.177004, 0.170962, 0.164913, 0.158858, 0.152797, 0.14673, 0.140658, 0.134581, 0.128498, 0.122411, 0.116319, 0.110222, 0.104122, 0.0980171, 0.0919089, 0.0857973, 0.0796824, 0.0735645, 0.0674438, 0.0613207, 0.0551952, 0.0490676, 0.0429382, 0.0368072, 0.0306747, 0.0245411, 0.0184067, 0.0122715, 0.00613586, -4.37114e-008, -0.00613595, -0.0122716, -0.0184068, -0.0245412, -0.0306748, -0.0368073, -0.0429383, -0.0490677, -0.0551953, -0.0613208, -0.0674439, -0.0735646, -0.0796825, -0.0857974, -0.091909, -0.0980172, -0.104122, -0.110222, -0.116319, -0.122411, -0.128498, -0.134581, -0.140658, -0.146731, -0.152797, -0.158858, -0.164913, -0.170962, -0.177004, -0.18304, -0.189069, -0.19509, -0.201105, -0.207111, -0.21311, -0.219101, -0.225084, -0.231058, -0.237024, -0.24298, -0.248928, -0.254866, -0.260794, -0.266713, -0.272621, -0.27852, -0.284408, -0.290285, -0.296151, -0.302006, -0.30785, -0.313682, -0.319502, -0.32531, -0.331106, -0.33689, -0.342661, -0.348419, -0.354164, -0.359895, -0.365613, -0.371317, -0.377007, -0.382684, -0.388345, -0.393992, -0.399624, -0.405241, -0.410843, -0.41643, -0.422, -0.427555, -0.433094, -0.438616, -0.444122, -0.449611, -0.455084, -0.460539, -0.465977, -0.471397, -0.476799, -0.482184, -0.48755, -0.492898, -0.498228, -0.503538, -0.50883, -0.514103, -0.519356, -0.52459, -0.529804, -0.534998, -0.540172, -0.545325, -0.550458, -0.55557, -0.560662, -0.565732, -0.570781, -0.575808, -0.580814, -0.585798, -0.59076, -0.595699, -0.600617, -0.605511, -0.610383, -0.615232, -0.620057, -0.62486, -0.629638, -0.634393, -0.639124, -0.643832, -0.648514, -0.653173, -0.657807, -0.662416, -0.667, -0.671559, -0.676093, -0.680601, -0.685084, -0.689541, -0.693971, -0.698376, -0.702755, -0.707107, -0.711432, -0.715731, -0.720003, -0.724247, -0.728464, -0.732654, -0.736817, -0.740951, -0.745058, -0.749137, -0.753187, -0.757209, -0.761202, -0.765167, -0.769103, -0.77301, -0.776888, -0.780737, -0.784557, -0.788346, -0.792107, -0.795837, -0.799537, -0.803208, -0.806848, -0.810457, -0.814036, -0.817585, -0.821103, -0.824589, -0.828045, -0.83147, -0.834863, -0.838225, -0.841555, -0.844854, -0.84812, -0.851355, -0.854558, -0.857729, -0.860867, -0.863973, -0.867046, -0.870087, -0.873095, -0.87607, -0.879012, -0.881921, -0.884797, -0.88764, -0.890449, -0.893224, -0.895966, -0.898674, -0.901349, -0.903989, -0.906596, -0.909168, -0.911706, -0.91421, -0.916679, -0.919114, -0.921514, -0.92388, -0.92621, -0.928506, -0.930767, -0.932993, -0.935184, -0.937339, -0.939459, -0.941544, -0.943594, -0.945607, -0.947586, -0.949528, -0.951435, -0.953306, -0.955141, -0.95694, -0.958703, -0.960431, -0.962121, -0.963776, -0.965394, -0.966976, -0.968522, -0.970031, -0.971504, -0.97294, -0.974339, -0.975702, -0.977028, -0.978317, -0.97957, -0.980785, -0.981964, -0.983105, -0.98421, -0.985278, -0.986308, -0.987301, -0.988258, -0.989177, -0.990058, -0.990903, -0.99171, -0.99248, -0.993212, -0.993907, -0.994565, -0.995185, -0.995767, -0.996313, -0.99682, -0.99729, -0.997723, -0.998118, -0.998476, -0.998795, -0.999078, -0.999322, -0.999529, -0.999699, -0.999831, -0.999925, -0.999981, -1, -0.999981, -0.999925, -0.999831, -0.999699, -0.999529, -0.999322, -0.999078, -0.998795, -0.998476, -0.998118, -0.997723, -0.99729, -0.99682, -0.996313, -0.995767, -0.995185, -0.994565, -0.993907, -0.993212, -0.99248, -0.99171, -0.990903, -0.990058, -0.989177, -0.988258, -0.987301, -0.986308, -0.985278, -0.98421, -0.983105, -0.981964, -0.980785, -0.97957, -0.978317, -0.977028, -0.975702, -0.974339, -0.97294, -0.971504, -0.970031, -0.968522, -0.966976, -0.965394, -0.963776, -0.962121, -0.96043, -0.958703, -0.95694, -0.955141, -0.953306, -0.951435, -0.949528, -0.947586, -0.945607, -0.943593, -0.941544, -0.939459, -0.937339, -0.935183, -0.932993, -0.930767, -0.928506, -0.92621, -0.92388, -0.921514, -0.919114, -0.916679, -0.91421, -0.911706, -0.909168, -0.906596, -0.903989, -0.901349, -0.898674, -0.895966, -0.893224, -0.890449, -0.88764, -0.884797, -0.881921, -0.879012, -0.87607, -0.873095, -0.870087, -0.867046, -0.863973, -0.860867, -0.857729, -0.854558, -0.851355, -0.84812, -0.844854, -0.841555, -0.838225, -0.834863, -0.83147, -0.828045, -0.824589, -0.821102, -0.817585, -0.814036, -0.810457, -0.806847, -0.803208, -0.799537, -0.795837, -0.792107, -0.788346, -0.784557, -0.780737, -0.776888, -0.77301, -0.769103, -0.765167, -0.761202, -0.757209, -0.753187, -0.749136, -0.745058, -0.740951, -0.736817, -0.732654, -0.728464, -0.724247, -0.720002, -0.715731, -0.711432, -0.707107, -0.702755, -0.698376, -0.693971, -0.689541, -0.685084, -0.680601, -0.676093, -0.671559, -0.667, -0.662416, -0.657807, -0.653173, -0.648514, -0.643832, -0.639124, -0.634393, -0.629638, -0.62486, -0.620057, -0.615232, -0.610383, -0.605511, -0.600616, -0.595699, -0.59076, -0.585798, -0.580814, -0.575808, -0.570781, -0.565732, -0.560661, -0.55557, -0.550458, -0.545325, -0.540171, -0.534997, -0.529803, -0.524589, -0.519356, -0.514103, -0.50883, -0.503538, -0.498228, -0.492898, -0.48755, -0.482184, -0.476799, -0.471397, -0.465976, -0.460539, -0.455083, -0.449611, -0.444122, -0.438616, -0.433094, -0.427555, -0.422, -0.416429, -0.410843, -0.405241, -0.399624, -0.393992, -0.388345, -0.382683, -0.377007, -0.371317, -0.365613, -0.359895, -0.354164, -0.348419, -0.342661, -0.33689, -0.331106, -0.32531, -0.319502, -0.313682, -0.30785, -0.302006, -0.296151, -0.290285, -0.284407, -0.27852, -0.272621, -0.266713, -0.260794, -0.254865, -0.248927, -0.24298, -0.237023, -0.231058, -0.225084, -0.219101, -0.21311, -0.207111, -0.201105, -0.19509, -0.189069, -0.18304, -0.177004, -0.170962, -0.164913, -0.158858, -0.152797, -0.14673, -0.140658, -0.134581, -0.128498, -0.122411, -0.116318, -0.110222, -0.104121, -0.0980169, -0.0919087, -0.0857971, -0.0796822, -0.0735643, -0.0674436, -0.0613204, -0.0551949, -0.0490673, -0.0429379, -0.0368073, -0.0306749, -0.0245413, -0.0184068, -0.0122716, -0.00613589, 1.19249e-008, 0.00613591, 0.0122716, 0.0184068, 0.0245413, 0.0306749, 0.0368073, 0.0429384, 0.0490678, 0.0551954, 0.0613209, 0.0674441, 0.0735648, 0.0796827, 0.0857976, 0.0919092, 0.0980174, 0.104122, 0.110223, 0.116319, 0.122411, 0.128498, 0.134581, 0.140658, 0.14673, 0.152797, 0.158858, 0.164913, 0.170962, 0.177004, 0.18304, 0.189069, 0.19509, 0.201105, 0.207111, 0.21311, 0.219101, 0.225084, 0.231058, 0.237024, 0.24298, 0.248928, 0.254866, 0.260794, 0.266713, 0.272622, 0.27852, 0.284408, 0.290285, 0.296151, 0.302006, 0.30785, 0.313682, 0.319502, 0.32531, 0.331106, 0.33689, 0.342661, 0.348419, 0.354164, 0.359895, 0.365613, 0.371317, 0.377008, 0.382684, 0.388345, 0.393992, 0.399624, 0.405242, 0.410843, 0.41643, 0.422001, 0.427555, 0.433094, 0.438617, 0.444122, 0.449612, 0.455084, 0.460539, 0.465976, 0.471397, 0.476799, 0.482184, 0.48755, 0.492898, 0.498228, 0.503538, 0.50883, 0.514103, 0.519356, 0.52459, 0.529804, 0.534998, 0.540172, 0.545325, 0.550458, 0.55557, 0.560662, 0.565732, 0.570781, 0.575808, 0.580814, 0.585798, 0.59076, 0.595699, 0.600616, 0.605511, 0.610383, 0.615232, 0.620057, 0.62486, 0.629638, 0.634393, 0.639125, 0.643832, 0.648515, 0.653173, 0.657807, 0.662416, 0.667, 0.671559, 0.676093, 0.680601, 0.685084, 0.689541, 0.693972, 0.698376, 0.702755, 0.707107, 0.711432, 0.715731, 0.720003, 0.724247, 0.728464, 0.732654, 0.736817, 0.740951, 0.745058, 0.749136, 0.753187, 0.757209, 0.761202, 0.765167, 0.769103, 0.773011, 0.776889, 0.780737, 0.784557, 0.788347, 0.792107, 0.795837, 0.799537, 0.803208, 0.806848, 0.810457, 0.814037, 0.817585, 0.821103, 0.824589, 0.828045, 0.83147, 0.834863, 0.838225, 0.841555, 0.844854, 0.84812, 0.851355, 0.854558, 0.857729, 0.860867, 0.863973, 0.867046, 0.870087, 0.873095, 0.87607, 0.879012, 0.881921, 0.884797, 0.88764, 0.890449, 0.893224, 0.895966, 0.898675, 0.901349, 0.903989, 0.906596, 0.909168, 0.911706, 0.91421, 0.916679, 0.919114, 0.921514, 0.92388, 0.92621, 0.928506, 0.930767, 0.932993, 0.935184, 0.937339, 0.939459, 0.941544, 0.943594, 0.945607, 0.947586, 0.949528, 0.951435, 0.953306, 0.955141, 0.95694, 0.958704, 0.960431, 0.962121, 0.963776, 0.965395, 0.966977, 0.968522, 0.970031, 0.971504, 0.97294, 0.974339, 0.975702, 0.977028, 0.978317, 0.97957, 0.980785, 0.981964, 0.983106, 0.98421, 0.985278, 0.986308, 0.987301, 0.988258, 0.989177, 0.990058, 0.990903, 0.99171, 0.99248, 0.993212, 0.993907, 0.994565, 0.995185, 0.995767, 0.996313, 0.99682, 0.99729, 0.997723, 0.998118, 0.998476, 0.998795, 0.999078, 0.999322, 0.999529, 0.999699, 0.999831, 0.999925, 0.999981 };
+
+// Returns the cosine value using the lut of a given value
+float lut_cos(float value);
+// Returns the sine value using the lut for a given value
+float lut_sin(float value);
+
+// Returns the cosine value using the lut of a given value
+// WARNING, FAST VERSION ONLY WORKS WITH VALUES 0 - 2 PI
+float lut_cos_f(float value);
+////////////////// END COSINE SINE LOOKUP TABLES
+
+////////////////// HANNING LOOKUP TABLE
+// 10 bit hanning lookup table
+const float hanningTable_f[] = { 0, 9.43077e-006, 3.77227e-005, 8.48748e-005, 0.000150885, 0.000235751, 0.00033947, 0.000462038, 0.00060345, 0.0007637, 0.000942783, 0.00114069, 0.00135742, 0.00159296, 0.0018473, 0.00212043, 0.00241234, 0.00272303, 0.00305247, 0.00340066, 0.00376758, 0.00415322, 0.00455757, 0.0049806, 0.00542231, 0.00588268, 0.00636168, 0.00685931, 0.00737554, 0.00791035, 0.00846373, 0.00903565, 0.00962609, 0.010235, 0.0108624, 0.0115083, 0.0121726, 0.0128553, 0.0135564, 0.0142758, 0.0150135, 0.0157696, 0.0165439, 0.0173364, 0.0181472, 0.0189761, 0.0198232, 0.0206884, 0.0215716, 0.022473, 0.0233923, 0.0243296, 0.0252849, 0.026258, 0.027249, 0.0282579, 0.0292846, 0.030329, 0.0313911, 0.0324709, 0.0335684, 0.0346834, 0.035816, 0.0369661, 0.0381337, 0.0393187, 0.0405211, 0.0417408, 0.0429778, 0.044232, 0.0455035, 0.046792, 0.0480977, 0.0494204, 0.0507601, 0.0521168, 0.0534904, 0.0548808, 0.056288, 0.0577119, 0.0591525, 0.0606098, 0.0620836, 0.0635739, 0.0650807, 0.0666039, 0.0681435, 0.0696993, 0.0712714, 0.0728597, 0.0744641, 0.0760845, 0.0777209, 0.0793732, 0.0810414, 0.0827255, 0.0844252, 0.0861406, 0.0878717, 0.0896183, 0.0913804, 0.0931578, 0.0949507, 0.0967588, 0.0985821, 0.100421, 0.102274, 0.104143, 0.106026, 0.107924, 0.109838, 0.111765, 0.113708, 0.115665, 0.117637, 0.119623, 0.121623, 0.123638, 0.125666, 0.127709, 0.129766, 0.131837, 0.133922, 0.136021, 0.138133, 0.140259, 0.142399, 0.144552, 0.146718, 0.148898, 0.151091, 0.153297, 0.155517, 0.157749, 0.159994, 0.162252, 0.164523, 0.166806, 0.169102, 0.171411, 0.173732, 0.176065, 0.17841, 0.180768, 0.183137, 0.185519, 0.187912, 0.190317, 0.192734, 0.195163, 0.197603, 0.200054, 0.202517, 0.20499, 0.207475, 0.209972, 0.212479, 0.214996, 0.217525, 0.220064, 0.222614, 0.225174, 0.227745, 0.230326, 0.232917, 0.235518, 0.238129, 0.24075, 0.243381, 0.246021, 0.248671, 0.251331, 0.254, 0.256678, 0.259365, 0.262062, 0.264767, 0.267482, 0.270205, 0.272936, 0.275677, 0.278425, 0.281183, 0.283948, 0.286721, 0.289503, 0.292293, 0.29509, 0.297895, 0.300708, 0.303528, 0.306355, 0.30919, 0.312033, 0.314882, 0.317738, 0.320601, 0.323471, 0.326347, 0.32923, 0.33212, 0.335016, 0.337918, 0.340826, 0.34374, 0.34666, 0.349586, 0.352518, 0.355455, 0.358397, 0.361345, 0.364298, 0.367256, 0.37022, 0.373188, 0.376161, 0.379138, 0.382121, 0.385107, 0.388098, 0.391093, 0.394092, 0.397096, 0.400103, 0.403114, 0.406128, 0.409146, 0.412168, 0.415193, 0.418221, 0.421252, 0.424286, 0.427323, 0.430363, 0.433405, 0.43645, 0.439497, 0.442547, 0.445598, 0.448652, 0.451708, 0.454765, 0.457824, 0.460885, 0.463948, 0.467011, 0.470076, 0.473142, 0.476209, 0.479277, 0.482346, 0.485415, 0.488485, 0.491555, 0.494626, 0.497697, 0.500768, 0.503839, 0.506909, 0.50998, 0.51305, 0.51612, 0.519189, 0.522257, 0.525325, 0.528391, 0.531457, 0.534521, 0.537584, 0.540645, 0.543705, 0.546764, 0.54982, 0.552875, 0.555928, 0.558978, 0.562027, 0.565073, 0.568116, 0.571157, 0.574196, 0.577231, 0.580264, 0.583294, 0.58632, 0.589343, 0.592363, 0.595379, 0.598392, 0.601401, 0.604406, 0.607408, 0.610405, 0.613398, 0.616387, 0.619371, 0.622351, 0.625326, 0.628297, 0.631263, 0.634223, 0.637179, 0.640129, 0.643075, 0.646015, 0.648949, 0.651878, 0.654801, 0.657718, 0.660629, 0.663534, 0.666433, 0.669326, 0.672212, 0.675092, 0.677965, 0.680831, 0.683691, 0.686544, 0.689389, 0.692228, 0.695059, 0.697883, 0.7007, 0.703509, 0.70631, 0.709103, 0.711889, 0.714666, 0.717436, 0.720197, 0.72295, 0.725695, 0.728431, 0.731158, 0.733877, 0.736587, 0.739287, 0.741979, 0.744662, 0.747336, 0.75, 0.752655, 0.7553, 0.757936, 0.760562, 0.763178, 0.765784, 0.76838, 0.770966, 0.773542, 0.776107, 0.778662, 0.781207, 0.783741, 0.786264, 0.788776, 0.791278, 0.793768, 0.796248, 0.798716, 0.801173, 0.803619, 0.806053, 0.808476, 0.810887, 0.813286, 0.815673, 0.818049, 0.820413, 0.822764, 0.825103, 0.82743, 0.829745, 0.832047, 0.834337, 0.836614, 0.838879, 0.84113, 0.843369, 0.845595, 0.847808, 0.850007, 0.852194, 0.854367, 0.856527, 0.858673, 0.860806, 0.862925, 0.86503, 0.867122, 0.8692, 0.871264, 0.873314, 0.87535, 0.877372, 0.879379, 0.881372, 0.883351, 0.885315, 0.887265, 0.8892, 0.891121, 0.893027, 0.894917, 0.896793, 0.898655, 0.900501, 0.902331, 0.904147, 0.905948, 0.907733, 0.909503, 0.911257, 0.912996, 0.914719, 0.916427, 0.918119, 0.919795, 0.921455, 0.923099, 0.924728, 0.92634, 0.927936, 0.929517, 0.931081, 0.932628, 0.93416, 0.935675, 0.937173, 0.938655, 0.940121, 0.94157, 0.943002, 0.944418, 0.945817, 0.947199, 0.948564, 0.949912, 0.951243, 0.952557, 0.953854, 0.955134, 0.956397, 0.957643, 0.958871, 0.960082, 0.961276, 0.962452, 0.963611, 0.964752, 0.965876, 0.966983, 0.968071, 0.969142, 0.970195, 0.971231, 0.972249, 0.973249, 0.974231, 0.975195, 0.976141, 0.97707, 0.97798, 0.978872, 0.979746, 0.980603, 0.981441, 0.98226, 0.983062, 0.983846, 0.984611, 0.985358, 0.986086, 0.986796, 0.987488, 0.988162, 0.988817, 0.989454, 0.990072, 0.990671, 0.991253, 0.991815, 0.992359, 0.992885, 0.993392, 0.99388, 0.99435, 0.994801, 0.995233, 0.995647, 0.996042, 0.996418, 0.996776, 0.997115, 0.997435, 0.997736, 0.998019, 0.998282, 0.998527, 0.998753, 0.998961, 0.999149, 0.999319, 0.99947, 0.999602, 0.999715, 0.999809, 0.999884, 0.999941, 0.999979, 0.999998, 0.999998, 0.999979, 0.999941, 0.999884, 0.999809, 0.999715, 0.999602, 0.99947, 0.999319, 0.999149, 0.998961, 0.998753, 0.998527, 0.998282, 0.998019, 0.997736, 0.997435, 0.997115, 0.996776, 0.996418, 0.996042, 0.995647, 0.995233, 0.994801, 0.99435, 0.99388, 0.993392, 0.992885, 0.992359, 0.991815, 0.991253, 0.990671, 0.990072, 0.989454, 0.988817, 0.988162, 0.987488, 0.986796, 0.986086, 0.985358, 0.984611, 0.983846, 0.983062, 0.98226, 0.981441, 0.980603, 0.979746, 0.978872, 0.97798, 0.97707, 0.976141, 0.975195, 0.974231, 0.973249, 0.972249, 0.971231, 0.970195, 0.969142, 0.968071, 0.966983, 0.965876, 0.964752, 0.963611, 0.962452, 0.961276, 0.960082, 0.958871, 0.957643, 0.956397, 0.955134, 0.953854, 0.952557, 0.951243, 0.949912, 0.948564, 0.947199, 0.945817, 0.944418, 0.943002, 0.94157, 0.940121, 0.938655, 0.937173, 0.935675, 0.93416, 0.932628, 0.931081, 0.929517, 0.927936, 0.92634, 0.924728, 0.923099, 0.921455, 0.919795, 0.918119, 0.916427, 0.914719, 0.912996, 0.911257, 0.909503, 0.907733, 0.905948, 0.904147, 0.902331, 0.900501, 0.898655, 0.896793, 0.894917, 0.893027, 0.891121, 0.8892, 0.887265, 0.885315, 0.883351, 0.881372, 0.879379, 0.877372, 0.87535, 0.873314, 0.871264, 0.8692, 0.867122, 0.86503, 0.862925, 0.860806, 0.858673, 0.856527, 0.854367, 0.852194, 0.850007, 0.847808, 0.845595, 0.843369, 0.84113, 0.838879, 0.836614, 0.834337, 0.832047, 0.829745, 0.82743, 0.825103, 0.822764, 0.820413, 0.818049, 0.815673, 0.813286, 0.810887, 0.808476, 0.806053, 0.803619, 0.801173, 0.798716, 0.796248, 0.793768, 0.791278, 0.788776, 0.786264, 0.783741, 0.781207, 0.778662, 0.776107, 0.773542, 0.770966, 0.76838, 0.765784, 0.763178, 0.760562, 0.757936, 0.7553, 0.752655, 0.75, 0.747336, 0.744662, 0.741979, 0.739287, 0.736587, 0.733877, 0.731158, 0.728431, 0.725695, 0.72295, 0.720197, 0.717436, 0.714666, 0.711889, 0.709103, 0.70631, 0.703509, 0.7007, 0.697883, 0.695059, 0.692228, 0.689389, 0.686544, 0.683691, 0.680831, 0.677965, 0.675092, 0.672212, 0.669326, 0.666433, 0.663534, 0.660629, 0.657718, 0.654801, 0.651878, 0.648949, 0.646015, 0.643075, 0.640129, 0.637179, 0.634223, 0.631263, 0.628297, 0.625326, 0.622351, 0.619371, 0.616387, 0.613398, 0.610405, 0.607408, 0.604406, 0.601401, 0.598392, 0.595379, 0.592363, 0.589343, 0.58632, 0.583294, 0.580264, 0.577231, 0.574196, 0.571157, 0.568116, 0.565073, 0.562027, 0.558978, 0.555928, 0.552875, 0.54982, 0.546764, 0.543705, 0.540645, 0.537584, 0.534521, 0.531457, 0.528391, 0.525325, 0.522257, 0.519189, 0.51612, 0.51305, 0.50998, 0.506909, 0.503839, 0.500768, 0.497697, 0.494626, 0.491555, 0.488485, 0.485415, 0.482346, 0.479277, 0.476209, 0.473142, 0.470076, 0.467011, 0.463948, 0.460885, 0.457824, 0.454765, 0.451708, 0.448652, 0.445598, 0.442547, 0.439497, 0.43645, 0.433405, 0.430363, 0.427323, 0.424286, 0.421252, 0.418221, 0.415193, 0.412168, 0.409146, 0.406128, 0.403114, 0.400103, 0.397096, 0.394092, 0.391093, 0.388098, 0.385107, 0.382121, 0.379138, 0.376161, 0.373188, 0.37022, 0.367256, 0.364298, 0.361345, 0.358397, 0.355455, 0.352518, 0.349586, 0.34666, 0.34374, 0.340826, 0.337918, 0.335016, 0.33212, 0.32923, 0.326347, 0.323471, 0.320601, 0.317738, 0.314882, 0.312033, 0.30919, 0.306355, 0.303528, 0.300708, 0.297895, 0.29509, 0.292293, 0.289503, 0.286721, 0.283948, 0.281183, 0.278425, 0.275677, 0.272936, 0.270205, 0.267482, 0.264767, 0.262062, 0.259365, 0.256678, 0.254, 0.251331, 0.248671, 0.246021, 0.243381, 0.24075, 0.238129, 0.235518, 0.232917, 0.230326, 0.227745, 0.225174, 0.222614, 0.220064, 0.217525, 0.214996, 0.212479, 0.209972, 0.207475, 0.20499, 0.202517, 0.200054, 0.197603, 0.195163, 0.192734, 0.190317, 0.187912, 0.185519, 0.183137, 0.180768, 0.17841, 0.176065, 0.173732, 0.171411, 0.169102, 0.166806, 0.164523, 0.162252, 0.159994, 0.157749, 0.155517, 0.153297, 0.151091, 0.148898, 0.146718, 0.144552, 0.142399, 0.140259, 0.138133, 0.136021, 0.133922, 0.131837, 0.129766, 0.127709, 0.125666, 0.123638, 0.121623, 0.119623, 0.117637, 0.115665, 0.113708, 0.111765, 0.109838, 0.107924, 0.106026, 0.104143, 0.102274, 0.100421, 0.0985821, 0.0967588, 0.0949507, 0.0931578, 0.0913804, 0.0896183, 0.0878717, 0.0861406, 0.0844252, 0.0827255, 0.0810414, 0.0793732, 0.0777209, 0.0760845, 0.0744641, 0.0728597, 0.0712714, 0.0696993, 0.0681435, 0.0666039, 0.0650807, 0.0635739, 0.0620836, 0.0606098, 0.0591525, 0.0577119, 0.056288, 0.0548808, 0.0534904, 0.0521168, 0.0507601, 0.0494204, 0.0480977, 0.046792, 0.0455035, 0.044232, 0.0429778, 0.0417408, 0.0405211, 0.0393187, 0.0381337, 0.0369661, 0.035816, 0.0346834, 0.0335684, 0.0324709, 0.0313911, 0.030329, 0.0292846, 0.0282579, 0.027249, 0.026258, 0.0252849, 0.0243296, 0.0233923, 0.022473, 0.0215716, 0.0206884, 0.0198232, 0.0189761, 0.0181472, 0.0173364, 0.0165439, 0.0157696, 0.0150135, 0.0142758, 0.0135564, 0.0128553, 0.0121726, 0.0115083, 0.0108624, 0.010235, 0.00962609, 0.00903565, 0.00846373, 0.00791035, 0.00737554, 0.00685931, 0.00636168, 0.00588268, 0.00542231, 0.0049806, 0.00455757, 0.00415322, 0.00376758, 0.00340066, 0.00305247, 0.00272303, 0.00241234, 0.00212043, 0.0018473, 0.00159296, 0.00135742, 0.00114069, 0.000942783, 0.0007637, 0.00060345, 0.000462038, 0.00033947, 0.000235751, 0.000150885, 8.48748e-005, 3.77227e-005, 9.43077e-006, 0 };
+
+// Applies the hanning LUT to the supplied array of data
+void applyHanningTable(float* data, int datasize);
+////////////////// END HANNING LOOKUP TABLE
+
+////////////////// BIT REVERSING LOOKUP TABLE
+
+const int reversebit_lut_i[] = {0, 512, 256, 768, 128, 640, 384, 896, 64, 576, 320, 832, 192, 704, 448, 960, 32, 544, 288, 800, 160, 672, 416, 928, 96, 608, 352, 864, 224, 736, 480, 992, 16, 528, 272, 784, 144, 656, 400, 912, 80, 592, 336, 848, 208, 720, 464, 976, 48, 560, 304, 816, 176, 688, 432, 944, 112, 624, 368, 880, 240, 752, 496, 1008, 8, 520, 264, 776, 136, 648, 392, 904, 72, 584, 328, 840, 200, 712, 456, 968, 40, 552, 296, 808, 168, 680, 424, 936, 104, 616, 360, 872, 232, 744, 488, 1000, 24, 536, 280, 792, 152, 664, 408, 920, 88, 600, 344, 856, 216, 728, 472, 984, 56, 568, 312, 824, 184, 696, 440, 952, 120, 632, 376, 888, 248, 760, 504, 1016, 4, 516, 260, 772, 132, 644, 388, 900, 68, 580, 324, 836, 196, 708, 452, 964, 36, 548, 292, 804, 164, 676, 420, 932, 100, 612, 356, 868, 228, 740, 484, 996, 20, 532, 276, 788, 148, 660, 404, 916, 84, 596, 340, 852, 212, 724, 468, 980, 52, 564, 308, 820, 180, 692, 436, 948, 116, 628, 372, 884, 244, 756, 500, 1012, 12, 524, 268, 780, 140, 652, 396, 908, 76, 588, 332, 844, 204, 716, 460, 972, 44, 556, 300, 812, 172, 684, 428, 940, 108, 620, 364, 876, 236, 748, 492, 1004, 28, 540, 284, 796, 156, 668, 412, 924, 92, 604, 348, 860, 220, 732, 476, 988, 60, 572, 316, 828, 188, 700, 444, 956, 124, 636, 380, 892, 252, 764, 508, 1020, 2, 514, 258, 770, 130, 642, 386, 898, 66, 578, 322, 834, 194, 706, 450, 962, 34, 546, 290, 802, 162, 674, 418, 930, 98, 610, 354, 866, 226, 738, 482, 994, 18, 530, 274, 786, 146, 658, 402, 914, 82, 594, 338, 850, 210, 722, 466, 978, 50, 562, 306, 818, 178, 690, 434, 946, 114, 626, 370, 882, 242, 754, 498, 1010, 10, 522, 266, 778, 138, 650, 394, 906, 74, 586, 330, 842, 202, 714, 458, 970, 42, 554, 298, 810, 170, 682, 426, 938, 106, 618, 362, 874, 234, 746, 490, 1002, 26, 538, 282, 794, 154, 666, 410, 922, 90, 602, 346, 858, 218, 730, 474, 986, 58, 570, 314, 826, 186, 698, 442, 954, 122, 634, 378, 890, 250, 762, 506, 1018, 6, 518, 262, 774, 134, 646, 390, 902, 70, 582, 326, 838, 198, 710, 454, 966, 38, 550, 294, 806, 166, 678, 422, 934, 102, 614, 358, 870, 230, 742, 486, 998, 22, 534, 278, 790, 150, 662, 406, 918, 86, 598, 342, 854, 214, 726, 470, 982, 54, 566, 310, 822, 182, 694, 438, 950, 118, 630, 374, 886, 246, 758, 502, 1014, 14, 526, 270, 782, 142, 654, 398, 910, 78, 590, 334, 846, 206, 718, 462, 974, 46, 558, 302, 814, 174, 686, 430, 942, 110, 622, 366, 878, 238, 750, 494, 1006, 30, 542, 286, 798, 158, 670, 414, 926, 94, 606, 350, 862, 222, 734, 478, 990, 62, 574, 318, 830, 190, 702, 446, 958, 126, 638, 382, 894, 254, 766, 510, 1022, 1, 513, 257, 769, 129, 641, 385, 897, 65, 577, 321, 833, 193, 705, 449, 961, 33, 545, 289, 801, 161, 673, 417, 929, 97, 609, 353, 865, 225, 737, 481, 993, 17, 529, 273, 785, 145, 657, 401, 913, 81, 593, 337, 849, 209, 721, 465, 977, 49, 561, 305, 817, 177, 689, 433, 945, 113, 625, 369, 881, 241, 753, 497, 1009, 9, 521, 265, 777, 137, 649, 393, 905, 73, 585, 329, 841, 201, 713, 457, 969, 41, 553, 297, 809, 169, 681, 425, 937, 105, 617, 361, 873, 233, 745, 489, 1001, 25, 537, 281, 793, 153, 665, 409, 921, 89, 601, 345, 857, 217, 729, 473, 985, 57, 569, 313, 825, 185, 697, 441, 953, 121, 633, 377, 889, 249, 761, 505, 1017, 5, 517, 261, 773, 133, 645, 389, 901, 69, 581, 325, 837, 197, 709, 453, 965, 37, 549, 293, 805, 165, 677, 421, 933, 101, 613, 357, 869, 229, 741, 485, 997, 21, 533, 277, 789, 149, 661, 405, 917, 85, 597, 341, 853, 213, 725, 469, 981, 53, 565, 309, 821, 181, 693, 437, 949, 117, 629, 373, 885, 245, 757, 501, 1013, 13, 525, 269, 781, 141, 653, 397, 909, 77, 589, 333, 845, 205, 717, 461, 973, 45, 557, 301, 813, 173, 685, 429, 941, 109, 621, 365, 877, 237, 749, 493, 1005, 29, 541, 285, 797, 157, 669, 413, 925, 93, 605, 349, 861, 221, 733, 477, 989, 61, 573, 317, 829, 189, 701, 445, 957, 125, 637, 381, 893, 253, 765, 509, 1021, 3, 515, 259, 771, 131, 643, 387, 899, 67, 579, 323, 835, 195, 707, 451, 963, 35, 547, 291, 803, 163, 675, 419, 931, 99, 611, 355, 867, 227, 739, 483, 995, 19, 531, 275, 787, 147, 659, 403, 915, 83, 595, 339, 851, 211, 723, 467, 979, 51, 563, 307, 819, 179, 691, 435, 947, 115, 627, 371, 883, 243, 755, 499, 1011, 11, 523, 267, 779, 139, 651, 395, 907, 75, 587, 331, 843, 203, 715, 459, 971, 43, 555, 299, 811, 171, 683, 427, 939, 107, 619, 363, 875, 235, 747, 491, 1003, 27, 539, 283, 795, 155, 667, 411, 923, 91, 603, 347, 859, 219, 731, 475, 987, 59, 571, 315, 827, 187, 699, 443, 955, 123, 635, 379, 891, 251, 763, 507, 1019, 7, 519, 263, 775, 135, 647, 391, 903, 71, 583, 327, 839, 199, 711, 455, 967, 39, 551, 295, 807, 167, 679, 423, 935, 103, 615, 359, 871, 231, 743, 487, 999, 23, 535, 279, 791, 151, 663, 407, 919, 87, 599, 343, 855, 215, 727, 471, 983, 55, 567, 311, 823, 183, 695, 439, 951, 119, 631, 375, 887, 247, 759, 503, 1015, 15, 527, 271, 783, 143, 655, 399, 911, 79, 591, 335, 847, 207, 719, 463, 975, 47, 559, 303, 815, 175, 687, 431, 943, 111, 623, 367, 879, 239, 751, 495, 1007, 31, 543, 287, 799, 159, 671, 415, 927, 95, 607, 351, 863, 223, 735, 479, 991, 63, 575, 319, 831, 191, 703, 447, 959, 127, 639, 383, 895, 255, 767, 511, 1023};
+
+////////////////// END BIT REVERSING LOOKUP TABLE
+
+////////////////// TWIDDLEFACTOR LOOKUP TABLE
+
+// Twiddle factors are complex, thus two look up tables, one for the real and one for the imaginary part
+const float twiddleLookupTable_Real[] = { 1, 0.999981, 0.999925, 0.999831, 0.999699, 0.999529, 0.999322, 0.999078, 0.998795, 0.998476, 0.998118, 0.997723, 0.99729, 0.99682, 0.996313, 0.995767, 0.995185, 0.994565, 0.993907, 0.993212, 0.99248, 0.99171, 0.990903, 0.990058, 0.989177, 0.988258, 0.987301, 0.986308, 0.985278, 0.98421, 0.983105, 0.981964, 0.980785, 0.97957, 0.978317, 0.977028, 0.975702, 0.974339, 0.97294, 0.971504, 0.970031, 0.968522, 0.966976, 0.965394, 0.963776, 0.962121, 0.960431, 0.958703, 0.95694, 0.955141, 0.953306, 0.951435, 0.949528, 0.947586, 0.945607, 0.943593, 0.941544, 0.939459, 0.937339, 0.935184, 0.932993, 0.930767, 0.928506, 0.92621, 0.92388, 0.921514, 0.919114, 0.916679, 0.91421, 0.911706, 0.909168, 0.906596, 0.903989, 0.901349, 0.898674, 0.895966, 0.893224, 0.890449, 0.88764, 0.884797, 0.881921, 0.879012, 0.87607, 0.873095, 0.870087, 0.867046, 0.863973, 0.860867, 0.857729, 0.854558, 0.851355, 0.84812, 0.844854, 0.841555, 0.838225, 0.834863, 0.83147, 0.828045, 0.824589, 0.821102, 0.817585, 0.814036, 0.810457, 0.806848, 0.803208, 0.799537, 0.795837, 0.792107, 0.788346, 0.784557, 0.780737, 0.776888, 0.77301, 0.769103, 0.765167, 0.761202, 0.757209, 0.753187, 0.749136, 0.745058, 0.740951, 0.736817, 0.732654, 0.728464, 0.724247, 0.720003, 0.715731, 0.711432, 0.707107, 0.702755, 0.698376, 0.693971, 0.689541, 0.685084, 0.680601, 0.676093, 0.671559, 0.667, 0.662416, 0.657807, 0.653173, 0.648514, 0.643832, 0.639124, 0.634393, 0.629638, 0.62486, 0.620057, 0.615232, 0.610383, 0.605511, 0.600616, 0.595699, 0.59076, 0.585798, 0.580814, 0.575808, 0.570781, 0.565732, 0.560662, 0.55557, 0.550458, 0.545325, 0.540171, 0.534998, 0.529804, 0.52459, 0.519356, 0.514103, 0.50883, 0.503538, 0.498228, 0.492898, 0.48755, 0.482184, 0.476799, 0.471397, 0.465977, 0.460539, 0.455084, 0.449611, 0.444122, 0.438616, 0.433094, 0.427555, 0.422, 0.41643, 0.410843, 0.405241, 0.399624, 0.393992, 0.388345, 0.382683, 0.377007, 0.371317, 0.365613, 0.359895, 0.354164, 0.348419, 0.342661, 0.33689, 0.331106, 0.32531, 0.319502, 0.313682, 0.30785, 0.302006, 0.296151, 0.290285, 0.284408, 0.27852, 0.272621, 0.266713, 0.260794, 0.254866, 0.248928, 0.24298, 0.237024, 0.231058, 0.225084, 0.219101, 0.21311, 0.207111, 0.201105, 0.19509, 0.189069, 0.18304, 0.177004, 0.170962, 0.164913, 0.158858, 0.152797, 0.14673, 0.140658, 0.134581, 0.128498, 0.122411, 0.116319, 0.110222, 0.104122, 0.0980171, 0.091909, 0.0857973, 0.0796824, 0.0735646, 0.0674439, 0.0613207, 0.0551952, 0.0490677, 0.0429383, 0.0368072, 0.0306748, 0.0245412, 0.0184067, 0.0122715, 0.00613588, 6.12323e-017, -0.00613588, -0.0122715, -0.0184067, -0.0245412, -0.0306748, -0.0368072, -0.0429383, -0.0490677, -0.0551952, -0.0613207, -0.0674439, -0.0735646, -0.0796824, -0.0857973, -0.091909, -0.0980171, -0.104122, -0.110222, -0.116319, -0.122411, -0.128498, -0.134581, -0.140658, -0.14673, -0.152797, -0.158858, -0.164913, -0.170962, -0.177004, -0.18304, -0.189069, -0.19509, -0.201105, -0.207111, -0.21311, -0.219101, -0.225084, -0.231058, -0.237024, -0.24298, -0.248928, -0.254866, -0.260794, -0.266713, -0.272621, -0.27852, -0.284408, -0.290285, -0.296151, -0.302006, -0.30785, -0.313682, -0.319502, -0.32531, -0.331106, -0.33689, -0.342661, -0.348419, -0.354164, -0.359895, -0.365613, -0.371317, -0.377007, -0.382683, -0.388345, -0.393992, -0.399624, -0.405241, -0.410843, -0.41643, -0.422, -0.427555, -0.433094, -0.438616, -0.444122, -0.449611, -0.455084, -0.460539, -0.465977, -0.471397, -0.476799, -0.482184, -0.48755, -0.492898, -0.498228, -0.503538, -0.50883, -0.514103, -0.519356, -0.52459, -0.529804, -0.534998, -0.540171, -0.545325, -0.550458, -0.55557, -0.560662, -0.565732, -0.570781, -0.575808, -0.580814, -0.585798, -0.59076, -0.595699, -0.600616, -0.605511, -0.610383, -0.615232, -0.620057, -0.62486, -0.629638, -0.634393, -0.639124, -0.643832, -0.648514, -0.653173, -0.657807, -0.662416, -0.667, -0.671559, -0.676093, -0.680601, -0.685084, -0.689541, -0.693971, -0.698376, -0.702755, -0.707107, -0.711432, -0.715731, -0.720003, -0.724247, -0.728464, -0.732654, -0.736817, -0.740951, -0.745058, -0.749136, -0.753187, -0.757209, -0.761202, -0.765167, -0.769103, -0.77301, -0.776888, -0.780737, -0.784557, -0.788346, -0.792107, -0.795837, -0.799537, -0.803208, -0.806848, -0.810457, -0.814036, -0.817585, -0.821102, -0.824589, -0.828045, -0.83147, -0.834863, -0.838225, -0.841555, -0.844854, -0.84812, -0.851355, -0.854558, -0.857729, -0.860867, -0.863973, -0.867046, -0.870087, -0.873095, -0.87607, -0.879012, -0.881921, -0.884797, -0.88764, -0.890449, -0.893224, -0.895966, -0.898674, -0.901349, -0.903989, -0.906596, -0.909168, -0.911706, -0.91421, -0.916679, -0.919114, -0.921514, -0.92388, -0.92621, -0.928506, -0.930767, -0.932993, -0.935184, -0.937339, -0.939459, -0.941544, -0.943593, -0.945607, -0.947586, -0.949528, -0.951435, -0.953306, -0.955141, -0.95694, -0.958703, -0.960431, -0.962121, -0.963776, -0.965394, -0.966976, -0.968522, -0.970031, -0.971504, -0.97294, -0.974339, -0.975702, -0.977028, -0.978317, -0.97957, -0.980785, -0.981964, -0.983105, -0.98421, -0.985278, -0.986308, -0.987301, -0.988258, -0.989177, -0.990058, -0.990903, -0.99171, -0.99248, -0.993212, -0.993907, -0.994565, -0.995185, -0.995767, -0.996313, -0.99682, -0.99729, -0.997723, -0.998118, -0.998476, -0.998795, -0.999078, -0.999322, -0.999529, -0.999699, -0.999831, -0.999925, -0.999981, -1, -0.999981, -0.999925, -0.999831, -0.999699, -0.999529, -0.999322, -0.999078, -0.998795, -0.998476, -0.998118, -0.997723, -0.99729, -0.99682, -0.996313, -0.995767, -0.995185, -0.994565, -0.993907, -0.993212, -0.99248, -0.99171, -0.990903, -0.990058, -0.989177, -0.988258, -0.987301, -0.986308, -0.985278, -0.98421, -0.983105, -0.981964, -0.980785, -0.97957, -0.978317, -0.977028, -0.975702, -0.974339, -0.97294, -0.971504, -0.970031, -0.968522, -0.966976, -0.965394, -0.963776, -0.962121, -0.960431, -0.958703, -0.95694, -0.955141, -0.953306, -0.951435, -0.949528, -0.947586, -0.945607, -0.943593, -0.941544, -0.939459, -0.937339, -0.935184, -0.932993, -0.930767, -0.928506, -0.92621, -0.92388, -0.921514, -0.919114, -0.916679, -0.91421, -0.911706, -0.909168, -0.906596, -0.903989, -0.901349, -0.898674, -0.895966, -0.893224, -0.890449, -0.88764, -0.884797, -0.881921, -0.879012, -0.87607, -0.873095, -0.870087, -0.867046, -0.863973, -0.860867, -0.857729, -0.854558, -0.851355, -0.84812, -0.844854, -0.841555, -0.838225, -0.834863, -0.83147, -0.828045, -0.824589, -0.821102, -0.817585, -0.814036, -0.810457, -0.806848, -0.803208, -0.799537, -0.795837, -0.792107, -0.788346, -0.784557, -0.780737, -0.776888, -0.77301, -0.769103, -0.765167, -0.761202, -0.757209, -0.753187, -0.749136, -0.745058, -0.740951, -0.736817, -0.732654, -0.728464, -0.724247, -0.720003, -0.715731, -0.711432, -0.707107, -0.702755, -0.698376, -0.693971, -0.689541, -0.685084, -0.680601, -0.676093, -0.671559, -0.667, -0.662416, -0.657807, -0.653173, -0.648514, -0.643832, -0.639124, -0.634393, -0.629638, -0.62486, -0.620057, -0.615232, -0.610383, -0.605511, -0.600616, -0.595699, -0.59076, -0.585798, -0.580814, -0.575808, -0.570781, -0.565732, -0.560662, -0.55557, -0.550458, -0.545325, -0.540171, -0.534998, -0.529804, -0.52459, -0.519356, -0.514103, -0.50883, -0.503538, -0.498228, -0.492898, -0.48755, -0.482184, -0.476799, -0.471397, -0.465977, -0.460539, -0.455084, -0.449611, -0.444122, -0.438616, -0.433094, -0.427555, -0.422, -0.41643, -0.410843, -0.405241, -0.399624, -0.393992, -0.388345, -0.382683, -0.377007, -0.371317, -0.365613, -0.359895, -0.354164, -0.348419, -0.342661, -0.33689, -0.331106, -0.32531, -0.319502, -0.313682, -0.30785, -0.302006, -0.296151, -0.290285, -0.284408, -0.27852, -0.272621, -0.266713, -0.260794, -0.254866, -0.248928, -0.24298, -0.237024, -0.231058, -0.225084, -0.219101, -0.21311, -0.207111, -0.201105, -0.19509, -0.189069, -0.18304, -0.177004, -0.170962, -0.164913, -0.158858, -0.152797, -0.14673, -0.140658, -0.134581, -0.128498, -0.122411, -0.116319, -0.110222, -0.104122, -0.0980171, -0.091909, -0.0857973, -0.0796824, -0.0735646, -0.0674439, -0.0613207, -0.0551952, -0.0490677, -0.0429383, -0.0368072, -0.0306748, -0.0245412, -0.0184067, -0.0122715, -0.00613588, -1.83697e-016, 0.00613588, 0.0122715, 0.0184067, 0.0245412, 0.0306748, 0.0368072, 0.0429383, 0.0490677, 0.0551952, 0.0613207, 0.0674439, 0.0735646, 0.0796824, 0.0857973, 0.091909, 0.0980171, 0.104122, 0.110222, 0.116319, 0.122411, 0.128498, 0.134581, 0.140658, 0.14673, 0.152797, 0.158858, 0.164913, 0.170962, 0.177004, 0.18304, 0.189069, 0.19509, 0.201105, 0.207111, 0.21311, 0.219101, 0.225084, 0.231058, 0.237024, 0.24298, 0.248928, 0.254866, 0.260794, 0.266713, 0.272621, 0.27852, 0.284408, 0.290285, 0.296151, 0.302006, 0.30785, 0.313682, 0.319502, 0.32531, 0.331106, 0.33689, 0.342661, 0.348419, 0.354164, 0.359895, 0.365613, 0.371317, 0.377007, 0.382683, 0.388345, 0.393992, 0.399624, 0.405241, 0.410843, 0.41643, 0.422, 0.427555, 0.433094, 0.438616, 0.444122, 0.449611, 0.455084, 0.460539, 0.465977, 0.471397, 0.476799, 0.482184, 0.48755, 0.492898, 0.498228, 0.503538, 0.50883, 0.514103, 0.519356, 0.52459, 0.529804, 0.534998, 0.540171, 0.545325, 0.550458, 0.55557, 0.560662, 0.565732, 0.570781, 0.575808, 0.580814, 0.585798, 0.59076, 0.595699, 0.600616, 0.605511, 0.610383, 0.615232, 0.620057, 0.62486, 0.629638, 0.634393, 0.639124, 0.643832, 0.648514, 0.653173, 0.657807, 0.662416, 0.667, 0.671559, 0.676093, 0.680601, 0.685084, 0.689541, 0.693971, 0.698376, 0.702755, 0.707107, 0.711432, 0.715731, 0.720003, 0.724247, 0.728464, 0.732654, 0.736817, 0.740951, 0.745058, 0.749136, 0.753187, 0.757209, 0.761202, 0.765167, 0.769103, 0.77301, 0.776888, 0.780737, 0.784557, 0.788346, 0.792107, 0.795837, 0.799537, 0.803208, 0.806848, 0.810457, 0.814036, 0.817585, 0.821102, 0.824589, 0.828045, 0.83147, 0.834863, 0.838225, 0.841555, 0.844854, 0.84812, 0.851355, 0.854558, 0.857729, 0.860867, 0.863973, 0.867046, 0.870087, 0.873095, 0.87607, 0.879012, 0.881921, 0.884797, 0.88764, 0.890449, 0.893224, 0.895966, 0.898674, 0.901349, 0.903989, 0.906596, 0.909168, 0.911706, 0.91421, 0.916679, 0.919114, 0.921514, 0.92388, 0.92621, 0.928506, 0.930767, 0.932993, 0.935184, 0.937339, 0.939459, 0.941544, 0.943593, 0.945607, 0.947586, 0.949528, 0.951435, 0.953306, 0.955141, 0.95694, 0.958703, 0.960431, 0.962121, 0.963776, 0.965394, 0.966976, 0.968522, 0.970031, 0.971504, 0.97294, 0.974339, 0.975702, 0.977028, 0.978317, 0.97957, 0.980785, 0.981964, 0.983105, 0.98421, 0.985278, 0.986308, 0.987301, 0.988258, 0.989177, 0.990058, 0.990903, 0.99171, 0.99248, 0.993212, 0.993907, 0.994565, 0.995185, 0.995767, 0.996313, 0.99682, 0.99729, 0.997723, 0.998118, 0.998476, 0.998795, 0.999078, 0.999322, 0.999529, 0.999699, 0.999831, 0.999925, 0.999981};
+const float twiddleLookupTable_Imaginary[] = { 0, -0.00613588, -0.0122715, -0.0184067, -0.0245412, -0.0306748, -0.0368072, -0.0429383, -0.0490677, -0.0551952, -0.0613207, -0.0674439, -0.0735646, -0.0796824, -0.0857973, -0.091909, -0.0980171, -0.104122, -0.110222, -0.116319, -0.122411, -0.128498, -0.134581, -0.140658, -0.14673, -0.152797, -0.158858, -0.164913, -0.170962, -0.177004, -0.18304, -0.189069, -0.19509, -0.201105, -0.207111, -0.21311, -0.219101, -0.225084, -0.231058, -0.237024, -0.24298, -0.248928, -0.254866, -0.260794, -0.266713, -0.272621, -0.27852, -0.284408, -0.290285, -0.296151, -0.302006, -0.30785, -0.313682, -0.319502, -0.32531, -0.331106, -0.33689, -0.342661, -0.348419, -0.354164, -0.359895, -0.365613, -0.371317, -0.377007, -0.382683, -0.388345, -0.393992, -0.399624, -0.405241, -0.410843, -0.41643, -0.422, -0.427555, -0.433094, -0.438616, -0.444122, -0.449611, -0.455084, -0.460539, -0.465977, -0.471397, -0.476799, -0.482184, -0.48755, -0.492898, -0.498228, -0.503538, -0.50883, -0.514103, -0.519356, -0.52459, -0.529804, -0.534998, -0.540171, -0.545325, -0.550458, -0.55557, -0.560662, -0.565732, -0.570781, -0.575808, -0.580814, -0.585798, -0.59076, -0.595699, -0.600616, -0.605511, -0.610383, -0.615232, -0.620057, -0.62486, -0.629638, -0.634393, -0.639124, -0.643832, -0.648514, -0.653173, -0.657807, -0.662416, -0.667, -0.671559, -0.676093, -0.680601, -0.685084, -0.689541, -0.693971, -0.698376, -0.702755, -0.707107, -0.711432, -0.715731, -0.720003, -0.724247, -0.728464, -0.732654, -0.736817, -0.740951, -0.745058, -0.749136, -0.753187, -0.757209, -0.761202, -0.765167, -0.769103, -0.77301, -0.776888, -0.780737, -0.784557, -0.788346, -0.792107, -0.795837, -0.799537, -0.803208, -0.806848, -0.810457, -0.814036, -0.817585, -0.821102, -0.824589, -0.828045, -0.83147, -0.834863, -0.838225, -0.841555, -0.844854, -0.84812, -0.851355, -0.854558, -0.857729, -0.860867, -0.863973, -0.867046, -0.870087, -0.873095, -0.87607, -0.879012, -0.881921, -0.884797, -0.88764, -0.890449, -0.893224, -0.895966, -0.898674, -0.901349, -0.903989, -0.906596, -0.909168, -0.911706, -0.91421, -0.916679, -0.919114, -0.921514, -0.92388, -0.92621, -0.928506, -0.930767, -0.932993, -0.935184, -0.937339, -0.939459, -0.941544, -0.943593, -0.945607, -0.947586, -0.949528, -0.951435, -0.953306, -0.955141, -0.95694, -0.958703, -0.960431, -0.962121, -0.963776, -0.965394, -0.966976, -0.968522, -0.970031, -0.971504, -0.97294, -0.974339, -0.975702, -0.977028, -0.978317, -0.97957, -0.980785, -0.981964, -0.983105, -0.98421, -0.985278, -0.986308, -0.987301, -0.988258, -0.989177, -0.990058, -0.990903, -0.99171, -0.99248, -0.993212, -0.993907, -0.994565, -0.995185, -0.995767, -0.996313, -0.99682, -0.99729, -0.997723, -0.998118, -0.998476, -0.998795, -0.999078, -0.999322, -0.999529, -0.999699, -0.999831, -0.999925, -0.999981, -1, -0.999981, -0.999925, -0.999831, -0.999699, -0.999529, -0.999322, -0.999078, -0.998795, -0.998476, -0.998118, -0.997723, -0.99729, -0.99682, -0.996313, -0.995767, -0.995185, -0.994565, -0.993907, -0.993212, -0.99248, -0.99171, -0.990903, -0.990058, -0.989177, -0.988258, -0.987301, -0.986308, -0.985278, -0.98421, -0.983105, -0.981964, -0.980785, -0.97957, -0.978317, -0.977028, -0.975702, -0.974339, -0.97294, -0.971504, -0.970031, -0.968522, -0.966976, -0.965394, -0.963776, -0.962121, -0.960431, -0.958703, -0.95694, -0.955141, -0.953306, -0.951435, -0.949528, -0.947586, -0.945607, -0.943593, -0.941544, -0.939459, -0.937339, -0.935184, -0.932993, -0.930767, -0.928506, -0.92621, -0.92388, -0.921514, -0.919114, -0.916679, -0.91421, -0.911706, -0.909168, -0.906596, -0.903989, -0.901349, -0.898674, -0.895966, -0.893224, -0.890449, -0.88764, -0.884797, -0.881921, -0.879012, -0.87607, -0.873095, -0.870087, -0.867046, -0.863973, -0.860867, -0.857729, -0.854558, -0.851355, -0.84812, -0.844854, -0.841555, -0.838225, -0.834863, -0.83147, -0.828045, -0.824589, -0.821102, -0.817585, -0.814036, -0.810457, -0.806848, -0.803208, -0.799537, -0.795837, -0.792107, -0.788346, -0.784557, -0.780737, -0.776888, -0.77301, -0.769103, -0.765167, -0.761202, -0.757209, -0.753187, -0.749136, -0.745058, -0.740951, -0.736817, -0.732654, -0.728464, -0.724247, -0.720003, -0.715731, -0.711432, -0.707107, -0.702755, -0.698376, -0.693971, -0.689541, -0.685084, -0.680601, -0.676093, -0.671559, -0.667, -0.662416, -0.657807, -0.653173, -0.648514, -0.643832, -0.639124, -0.634393, -0.629638, -0.62486, -0.620057, -0.615232, -0.610383, -0.605511, -0.600616, -0.595699, -0.59076, -0.585798, -0.580814, -0.575808, -0.570781, -0.565732, -0.560662, -0.55557, -0.550458, -0.545325, -0.540171, -0.534998, -0.529804, -0.52459, -0.519356, -0.514103, -0.50883, -0.503538, -0.498228, -0.492898, -0.48755, -0.482184, -0.476799, -0.471397, -0.465977, -0.460539, -0.455084, -0.449611, -0.444122, -0.438616, -0.433094, -0.427555, -0.422, -0.41643, -0.410843, -0.405241, -0.399624, -0.393992, -0.388345, -0.382683, -0.377007, -0.371317, -0.365613, -0.359895, -0.354164, -0.348419, -0.342661, -0.33689, -0.331106, -0.32531, -0.319502, -0.313682, -0.30785, -0.302006, -0.296151, -0.290285, -0.284408, -0.27852, -0.272621, -0.266713, -0.260794, -0.254866, -0.248928, -0.24298, -0.237024, -0.231058, -0.225084, -0.219101, -0.21311, -0.207111, -0.201105, -0.19509, -0.189069, -0.18304, -0.177004, -0.170962, -0.164913, -0.158858, -0.152797, -0.14673, -0.140658, -0.134581, -0.128498, -0.122411, -0.116319, -0.110222, -0.104122, -0.0980171, -0.091909, -0.0857973, -0.0796824, -0.0735646, -0.0674439, -0.0613207, -0.0551952, -0.0490677, -0.0429383, -0.0368072, -0.0306748, -0.0245412, -0.0184067, -0.0122715, -0.00613588, -1.22465e-016, 0.00613588, 0.0122715, 0.0184067, 0.0245412, 0.0306748, 0.0368072, 0.0429383, 0.0490677, 0.0551952, 0.0613207, 0.0674439, 0.0735646, 0.0796824, 0.0857973, 0.091909, 0.0980171, 0.104122, 0.110222, 0.116319, 0.122411, 0.128498, 0.134581, 0.140658, 0.14673, 0.152797, 0.158858, 0.164913, 0.170962, 0.177004, 0.18304, 0.189069, 0.19509, 0.201105, 0.207111, 0.21311, 0.219101, 0.225084, 0.231058, 0.237024, 0.24298, 0.248928, 0.254866, 0.260794, 0.266713, 0.272621, 0.27852, 0.284408, 0.290285, 0.296151, 0.302006, 0.30785, 0.313682, 0.319502, 0.32531, 0.331106, 0.33689, 0.342661, 0.348419, 0.354164, 0.359895, 0.365613, 0.371317, 0.377007, 0.382683, 0.388345, 0.393992, 0.399624, 0.405241, 0.410843, 0.41643, 0.422, 0.427555, 0.433094, 0.438616, 0.444122, 0.449611, 0.455084, 0.460539, 0.465977, 0.471397, 0.476799, 0.482184, 0.48755, 0.492898, 0.498228, 0.503538, 0.50883, 0.514103, 0.519356, 0.52459, 0.529804, 0.534998, 0.540171, 0.545325, 0.550458, 0.55557, 0.560662, 0.565732, 0.570781, 0.575808, 0.580814, 0.585798, 0.59076, 0.595699, 0.600616, 0.605511, 0.610383, 0.615232, 0.620057, 0.62486, 0.629638, 0.634393, 0.639124, 0.643832, 0.648514, 0.653173, 0.657807, 0.662416, 0.667, 0.671559, 0.676093, 0.680601, 0.685084, 0.689541, 0.693971, 0.698376, 0.702755, 0.707107, 0.711432, 0.715731, 0.720003, 0.724247, 0.728464, 0.732654, 0.736817, 0.740951, 0.745058, 0.749136, 0.753187, 0.757209, 0.761202, 0.765167, 0.769103, 0.77301, 0.776888, 0.780737, 0.784557, 0.788346, 0.792107, 0.795837, 0.799537, 0.803208, 0.806848, 0.810457, 0.814036, 0.817585, 0.821102, 0.824589, 0.828045, 0.83147, 0.834863, 0.838225, 0.841555, 0.844854, 0.84812, 0.851355, 0.854558, 0.857729, 0.860867, 0.863973, 0.867046, 0.870087, 0.873095, 0.87607, 0.879012, 0.881921, 0.884797, 0.88764, 0.890449, 0.893224, 0.895966, 0.898674, 0.901349, 0.903989, 0.906596, 0.909168, 0.911706, 0.91421, 0.916679, 0.919114, 0.921514, 0.92388, 0.92621, 0.928506, 0.930767, 0.932993, 0.935184, 0.937339, 0.939459, 0.941544, 0.943593, 0.945607, 0.947586, 0.949528, 0.951435, 0.953306, 0.955141, 0.95694, 0.958703, 0.960431, 0.962121, 0.963776, 0.965394, 0.966976, 0.968522, 0.970031, 0.971504, 0.97294, 0.974339, 0.975702, 0.977028, 0.978317, 0.97957, 0.980785, 0.981964, 0.983105, 0.98421, 0.985278, 0.986308, 0.987301, 0.988258, 0.989177, 0.990058, 0.990903, 0.99171, 0.99248, 0.993212, 0.993907, 0.994565, 0.995185, 0.995767, 0.996313, 0.99682, 0.99729, 0.997723, 0.998118, 0.998476, 0.998795, 0.999078, 0.999322, 0.999529, 0.999699, 0.999831, 0.999925, 0.999981, 1, 0.999981, 0.999925, 0.999831, 0.999699, 0.999529, 0.999322, 0.999078, 0.998795, 0.998476, 0.998118, 0.997723, 0.99729, 0.99682, 0.996313, 0.995767, 0.995185, 0.994565, 0.993907, 0.993212, 0.99248, 0.99171, 0.990903, 0.990058, 0.989177, 0.988258, 0.987301, 0.986308, 0.985278, 0.98421, 0.983105, 0.981964, 0.980785, 0.97957, 0.978317, 0.977028, 0.975702, 0.974339, 0.97294, 0.971504, 0.970031, 0.968522, 0.966976, 0.965394, 0.963776, 0.962121, 0.960431, 0.958703, 0.95694, 0.955141, 0.953306, 0.951435, 0.949528, 0.947586, 0.945607, 0.943593, 0.941544, 0.939459, 0.937339, 0.935184, 0.932993, 0.930767, 0.928506, 0.92621, 0.92388, 0.921514, 0.919114, 0.916679, 0.91421, 0.911706, 0.909168, 0.906596, 0.903989, 0.901349, 0.898674, 0.895966, 0.893224, 0.890449, 0.88764, 0.884797, 0.881921, 0.879012, 0.87607, 0.873095, 0.870087, 0.867046, 0.863973, 0.860867, 0.857729, 0.854558, 0.851355, 0.84812, 0.844854, 0.841555, 0.838225, 0.834863, 0.83147, 0.828045, 0.824589, 0.821102, 0.817585, 0.814036, 0.810457, 0.806848, 0.803208, 0.799537, 0.795837, 0.792107, 0.788346, 0.784557, 0.780737, 0.776888, 0.77301, 0.769103, 0.765167, 0.761202, 0.757209, 0.753187, 0.749136, 0.745058, 0.740951, 0.736817, 0.732654, 0.728464, 0.724247, 0.720003, 0.715731, 0.711432, 0.707107, 0.702755, 0.698376, 0.693971, 0.689541, 0.685084, 0.680601, 0.676093, 0.671559, 0.667, 0.662416, 0.657807, 0.653173, 0.648514, 0.643832, 0.639124, 0.634393, 0.629638, 0.62486, 0.620057, 0.615232, 0.610383, 0.605511, 0.600616, 0.595699, 0.59076, 0.585798, 0.580814, 0.575808, 0.570781, 0.565732, 0.560662, 0.55557, 0.550458, 0.545325, 0.540171, 0.534998, 0.529804, 0.52459, 0.519356, 0.514103, 0.50883, 0.503538, 0.498228, 0.492898, 0.48755, 0.482184, 0.476799, 0.471397, 0.465977, 0.460539, 0.455084, 0.449611, 0.444122, 0.438616, 0.433094, 0.427555, 0.422, 0.41643, 0.410843, 0.405241, 0.399624, 0.393992, 0.388345, 0.382683, 0.377007, 0.371317, 0.365613, 0.359895, 0.354164, 0.348419, 0.342661, 0.33689, 0.331106, 0.32531, 0.319502, 0.313682, 0.30785, 0.302006, 0.296151, 0.290285, 0.284408, 0.27852, 0.272621, 0.266713, 0.260794, 0.254866, 0.248928, 0.24298, 0.237024, 0.231058, 0.225084, 0.219101, 0.21311, 0.207111, 0.201105, 0.19509, 0.189069, 0.18304, 0.177004, 0.170962, 0.164913, 0.158858, 0.152797, 0.14673, 0.140658, 0.134581, 0.128498, 0.122411, 0.116319, 0.110222, 0.104122, 0.0980171, 0.091909, 0.0857973, 0.0796824, 0.0735646, 0.0674439, 0.0613207, 0.0551952, 0.0490677, 0.0429383, 0.0368072, 0.0306748, 0.0245412, 0.0184067, 0.0122715, 0.00613588};
+
+////////////////// END TWIDDLEFACTOR LOOKUP TABLE
+
+#endif
\ No newline at end of file
diff -r 000000000000 -r 6863633bf8a4 PSDdetection.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PSDdetection.cpp	Fri Mar 24 11:22:30 2017 +0000
@@ -0,0 +1,59 @@
+
+#include "PSDdetection.h"
+
+Arm::Arm(){
+	for (int i = 0; i<4; i++)
+		prevEMG[i] = 0;
+
+	EMGreference = 140;
+}
+
+// Sets a new reference level
+void Arm::setReference(int reflevel){
+	this->EMGreference = reflevel;
+}
+
+// Updates the array with a new sample and checks wheter a muscle is active
+bool Arm::checksample(int emgsample){
+
+	bool MuscleIsActive = false;
+
+	// Shift all the previous values in time
+	for (int i = 3; i>0; i--){
+		prevEMG[i] = prevEMG[i - 1];
+	}
+
+	// Put in the latest sample
+	prevEMG[0] = emgsample;
+
+	// Weighted average filter to smoothen out the response
+	int average = (prevEMG[0] * 1 + prevEMG[1] * 0.63 + prevEMG[2] * 0.45 + prevEMG[3] * 0.22) / (1 + 0.63 + 0.45 + 0.22);
+
+	// Check with reference level to determine if it is 
+	if (average > (EMGreference + EMGtriggerlevel)){
+		MuscleIsActive = true;
+	}
+
+	return MuscleIsActive;
+}
+
+int biquad10(int emgsample){
+	//initialize filter values 
+	float filteredValue,a0,a1,a2,b1,b2;
+	float intermediateValue1[2]intermediateValue2[2];
+	//filter for 10hz -6bd biquad
+	a0=0.0009446857782217186;
+	a1=0.0018893715564434373;
+	a2=0.0009446857782217186;
+	b1=-1.9111847961312216;
+	b2=0.9149635392441086;
+	//calculations for transposed direct form 2
+	intermediateValue1[0] = a2*emgsample-b2*filteredValue;
+	intermediateValue2[0] = a2*emgsample-b1*filteredValue+intermediateValue1[1];
+	filteredValue = a0*filteredValue+intermediateValue2[1];
+	intermediateValue1[1] = intermediateValue1[0];
+	intermediateValue2[1] = intermediateValue2[0];
+	
+	
+	return ((int)filteredValue);
+	}
\ No newline at end of file
diff -r 000000000000 -r 6863633bf8a4 PSDdetection.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PSDdetection.h	Fri Mar 24 11:22:30 2017 +0000
@@ -0,0 +1,29 @@
+
+#ifndef PSD_DETECTION_H_
+#define PSD_DETECTION_H_
+#pragma once
+
+class Arm{
+
+public:
+	Arm();
+	~Arm();
+
+	// Sets a new reference level
+	void setReference(int reflevel);
+	// Updates the array with a new sample and checks wheter a muscle is active
+	bool checksample(int emgsample);
+	// Filters the signal with a biquad filter
+	int biquad10 (int emgsample);
+
+
+private:
+	int EMGreference;
+	const int EMGtriggerlevel = 20; // above the reference
+	int prevEMG[4];
+
+};
+
+
+
+#endif
\ No newline at end of file
diff -r 000000000000 -r 6863633bf8a4 complexmath.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/complexmath.cpp	Fri Mar 24 11:22:30 2017 +0000
@@ -0,0 +1,37 @@
+
+#include "complexmath.h"
+
+// Complex adition and multiplication
+complex_num complex_add(complex_num A, complex_num B){
+	A.imaginary += B.imaginary;
+	A.real += B.real;
+	return A;
+}
+complex_num complex_multiply(complex_num A, complex_num B){
+	complex_num C;
+	C.real = A.real*B.real - A.imaginary*B.imaginary;
+	C.imaginary = A.imaginary*B.real + A.real*B.imaginary;
+	return C;
+}
+
+// Retrieve the phase and magnitude of a complex number (polar form)
+float complex_phase(complex_num A){
+	return(lut_cos(A.imaginary)/lut_sin(A.real));
+}
+float complex_magnitude(complex_num A){
+	return sqrt(A.real*A.real + A.imaginary*A.imaginary);
+}
+
+// Transform polar form to a complex number
+complex_num complex_transform(float phase, float magnitude){
+	complex_num A;
+	A.real = magnitude*lut_cos(phase);
+	A.imaginary = magnitude*lut_sin(phase);
+	return A;
+}
+
+// Complex conjugate
+complex_num complex_conjugate(complex_num A){
+	A.imaginary = -A.imaginary;
+	return A;
+}
\ No newline at end of file
diff -r 000000000000 -r 6863633bf8a4 complexmath.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/complexmath.h	Fri Mar 24 11:22:30 2017 +0000
@@ -0,0 +1,31 @@
+
+// This file contains an implementation of complex mathmatics
+// i.e. definition of a complex unit and basic operationds such as magnitude, phase, addition and multiplication
+
+#pragma once
+#ifndef _COMPLEX_MATH_H
+#define _COMPLEX_MATH_H
+
+#include "LookupTables.h"
+#include <math.h> // only for sqrt, not for cos sin
+
+struct complex_num{
+	float imaginary;
+	float real;
+};
+
+// Complex adition and multiplication
+complex_num complex_add(complex_num A, complex_num B);
+complex_num complex_multiply(complex_num A, complex_num B);
+
+// Retrieve the phase and magnitude of a complex number (polar form)
+float complex_phase(complex_num A);
+float complex_magnitude(complex_num A);
+
+// Transform polar form to a complex number (phase in radians)
+complex_num complex_transform(float phase, float magnitude);
+
+// Complex conjugate
+complex_num complex_conjugate(complex_num A);
+
+#endif
diff -r 000000000000 -r 6863633bf8a4 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Mar 24 11:22:30 2017 +0000
@@ -0,0 +1,89 @@
+#include "mbed.h"
+#include "DFT.h"
+#include "LookupTables.h"
+#include "complexmath.h"
+#include <math.h>
+
+
+AnalogIn emg1(A0);
+Serial pc(USBTX, USBRX);
+AnalogIn emg2(A1);
+AnalogIn emg3(A2);
+AnalogIn emg4(A3);
+Ticker  ADCTimer;
+bool fftflag = false;
+int counter;
+int PSDmag1;
+int PSDmag2;
+int PSDmag3;
+int PSDmag4;
+float sampleddataemg1[1024];
+float sampleddataemg2[1024];
+float sampleddataemg3[1024];
+float sampleddataemg4[1024];
+
+
+void sampling()
+{
+    while (fftflag == false) {
+        sampleddataemg1[counter] = emg1;
+        sampleddataemg2[counter] = emg2;
+        sampleddataemg3[counter] = emg3;
+        sampleddataemg4[counter] = emg4;
+        counter++;
+        if (counter >= 1024) {
+            counter =0;
+            pc.printf ("EMG data from A0 :[");
+            for (int i=0; i<1024; i++) 
+                pc.printf ("%f,\t",sampleddataemg1[i]);
+            //pc.printf ("EMG data from A3 :[");
+            //for (int i=0; i<1024; i++) 
+            //    pc.printf ("%f,\t",sampleddataemg4[i]);
+            fftflag = true;
+            performFFT(sampleddataemg1, 1024);
+            //pc.printf ("done 1");
+            performFFT(sampleddataemg2, 1024);
+            //pc.printf ("done 2");
+            performFFT(sampleddataemg3, 1024);
+            //pc.printf ("done 3");
+            performFFT(sampleddataemg4, 1024);
+            pc.printf ("\r\n\r\n\r\n post data from A0 :[");
+            for (int i=0; i<1024; i++) 
+                pc.printf ("%f,\t",sampleddataemg1[i]);
+            //pc.printf ("post data from A3 :[");
+            //for (int i=0; i<1024; i++) 
+            //    pc.printf ("%f,\t",sampleddataemg4[i]);
+            //pc.printf ("EMG data from A1 :[");
+            //for (int i=0; i<1024; i++) 
+            //    pc.printf ("%f,\t",sampleddataemg2[i]);
+            //pc.printf ("EMG data from A2 :[");
+            //for (int i=0; i<1024; i++) 
+            //    pc.printf ("%f,\t",sampleddataemg3[i]);
+            //pc.printf ("EMG data from A3 :[");
+            //for (int i=0; i<1024; i++) 
+            //    pc.printf ("%f,\t",sampleddataemg4[i]);   
+             PSDmag1 = calcPSD(sampleddataemg1, 512);
+             pc.printf ("summed magnitude of A0: %d\r\n",PSDmag1);  
+             PSDmag2 = calcPSD(sampleddataemg2, 512);
+             //pc.printf ("summed magnitude of A1: %d\r\n",PSDmag2);  
+             PSDmag3 = calcPSD(sampleddataemg3, 512);
+             //pc.printf ("summed magnitude of A2: %d\r\n",PSDmag3);  
+             PSDmag4 = calcPSD(sampleddataemg4, 512);
+             //pc.printf ("summed magnitude of A3: %d\r\n",PSDmag4);  
+            fftflag = false; // this need to be false for continuous operation, now it is a one-shot kill
+        }
+    }
+}
+
+
+int main()
+{
+    ADCTimer.attach(&sampling, 0.1/1024);
+    pc.baud(19200);
+    while(1) {
+    }
+
+
+
+
+}
diff -r 000000000000 -r 6863633bf8a4 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Mar 24 11:22:30 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/34e6b704fe68
\ No newline at end of file