summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoRo <dos21h@gmail.com>2021-08-26 09:48:17 +0100
committerZoRo <dos21h@gmail.com>2021-08-26 09:48:17 +0100
commitfeb72389aa4e1070fcbc888280ea65b178176460 (patch)
tree4e8f0561958fb51842a13adec237184a70de276a
parent3834bc793857aae02198d8f4c8a8373957269678 (diff)
downloadNaiveFFT-feb72389aa4e1070fcbc888280ea65b178176460.tar.gz
NaiveFFT-feb72389aa4e1070fcbc888280ea65b178176460.zip
Update source to be compatible with emscripten
-rw-r--r--Build/Makefile5
-rw-r--r--Build/index.html80
-rw-r--r--NaiveFFT/fft.c8
-rw-r--r--NaiveFFT/fft.h19
-rw-r--r--NaiveFFT/main.c8
5 files changed, 110 insertions, 10 deletions
diff --git a/Build/Makefile b/Build/Makefile
index e19df12..f56677d 100644
--- a/Build/Makefile
+++ b/Build/Makefile
@@ -7,10 +7,11 @@ EM_LDFALGS=-s LLD_REPORT_UNDEFINED
make:
$(CC) -c $(SOURCEDIR)/main.c -g3
- $(CC) main.o -o NaiveFFT $(LDFLAGS)
+ $(CC) -c $(SOURCEDIR)/fft.c -g3
+ $(CC) main.o fft.o -o NaiveFFT $(LDFLAGS)
emcc:
- $(EMCC) $(SOURCEDIR)/main.c ../NaiveFFT/fft.c -s WASM=1 -O3 -o index.js $(EM_LDFALGS) -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'
+ $(EMCC) $(SOURCEDIR)/main.c $(SOURCEDIR)/fft.c -s WASM=1 -O3 -o index.js $(EM_LDFALGS) -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'
web:
diff --git a/Build/index.html b/Build/index.html
new file mode 100644
index 0000000..8f510ac
--- /dev/null
+++ b/Build/index.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <title>WebAssembly Example</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ </head>
+ <body>
+
+
+ <!-- Include the JavaScript glue code. -->
+ <!-- This will load the WebAssembly module and run its main. -->
+ <script src="index.js"></script>
+ <script type='text/javascript'>
+ var Module = {};
+ fetch('index.wasm')
+ .then(response =>
+ response.arrayBuffer()
+ ).then(buffer => {
+ Module.canvas = document.getElementById("canvas");
+ Module.wasmBinary = buffer;
+ var script = document.createElement('script');
+ script.src = "index.js";
+ script.onload = function() {
+ console.log("Emscripten boilerplate loaded.");
+ run_dft = Module.cwrap("dft", [],[['float'],['float'],'number','number']);
+ run_fft= Module.cwrap( "fft_1",[],[['float'],['float'],'number','number']);
+
+
+
+ var inputData = document.querySelector('.inputData');
+
+ document.querySelector("#calcButton").onclick = function() {
+ console.log("calc FFT");
+
+ function cArray(size) {
+ var offset = Module._malloc(size * 8);
+ Module.HEAPF64.set(new Float64Array(size), offset / 8);
+ return {
+ "data": Module.HEAPF64.subarray(offset / 8, offset / 8 + size),
+ "offset": offset
+ }
+ }
+
+ var strArr = inputData.value;
+ strArr = strArr.replace(/ +(?= )/g,'');
+ var splArr = strArr.split(" ");
+ if (splArr.some(i => i != parseFloat(i))) {
+ throw i + " is not integer"
+ }
+ //max size 8 values, as thats enought for a demo
+ //https://stackoverflow.com/questions/17883799/how-to-handle-passing-returning-array-pointers-to-emscripten-compiled-code
+
+
+ myArray = cArray(8).fill(0.0);
+
+
+ }
+
+ } //end onload
+ document.body.appendChild(script);
+ });
+
+
+ </script>
+
+ FFT demo
+ <textarea class="inputData">12 12 12</textarea>
+ <button id="calcButton" type="button">Cals</button>
+
+ <script>
+ function calcFFT() {
+ console.log("Calculate FFT")
+ var arrStr = inputData.value;
+ console.log(arrStr)
+ }
+ </script>
+
+ </body>
+</html> \ No newline at end of file
diff --git a/NaiveFFT/fft.c b/NaiveFFT/fft.c
index cfcf3fa..b4c7d33 100644
--- a/NaiveFFT/fft.c
+++ b/NaiveFFT/fft.c
@@ -11,7 +11,7 @@
//calc the fft
-void fft_if(double *x_i, double *x_q, int n, int inv) {
+void KEEPALIVE fft_if(double *x_i, double *x_q, int n, int inv) {
int i=0,j=0,k=0,m=0, irem=0, sign;
double tq,ti;
@@ -109,7 +109,7 @@ void fft_if(double *x_i, double *x_q, int n, int inv) {
#define complex_mul_re(a_re, a_im, b_re, b_im) (a_re * b_re - a_im * b_im)
#define complex_mul_im(a_re, a_im, b_re, b_im) (a_re * b_im + a_im * b_re)
//https://github.com/rshuston/FFT-C/blob/master/libfft/fft.c
-void ffti_shuffle_1(double *x_i, double *x_q, uint64_t n) {
+void KEEPALIVE ffti_shuffle_1(double *x_i, double *x_q, uint64_t n) {
int Nd2 = n>>1;
int Nm1 = n-1;
int i,j;
@@ -156,7 +156,7 @@ void ffti_shuffle_1(double *x_i, double *x_q, uint64_t n) {
j ^= bits;
}
}
-void fft_1(double *x_i, double *x_q, uint64_t n, uint64_t inv) {
+void KEEPALIVE fft_1(double *x_i, double *x_q, uint64_t n, uint64_t inv) {
uint64_t n_log2;
uint64_t r;
uint64_t m, md2;
@@ -225,7 +225,7 @@ void fft_1(double *x_i, double *x_q, uint64_t n, uint64_t inv) {
}
//dft works fine
-void dft(double *x_i, double *x_q, int n, int inv) {
+void KEEPALIVE dft(double *x_i, double *x_q, int n, int inv) {
double Wn,Wk;
//static array
//double Xi[DATA_SIZE],Xq[DATA_SIZE];
diff --git a/NaiveFFT/fft.h b/NaiveFFT/fft.h
index f1ee783..80ae6cc 100644
--- a/NaiveFFT/fft.h
+++ b/NaiveFFT/fft.h
@@ -11,10 +11,21 @@
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
+#include <stdint.h>
+#include <unistd.h>
+#if __EMSCRIPTEN__
+#include <emscripten/emscripten.h>
+#endif
-void fft_if(double *x_i, double *x_q, int n, int inv);
-void ffti_shuffle_1(double *x_i, double *x_q, uint64_t n);
-void fft_1(double *x_i, double *x_q, uint64_t n, uint64_t inv);
-void dft(double *x_i, double *x_q, int n, int inv);
+#ifdef __EMSCRIPTEN__
+#define KEEPALIVE EMSCRIPTEN_KEEPALIVE
+#else
+#define KEEPALIVE
+#endif
+
+void KEEPALIVE fft_if(double *x_i, double *x_q, int n, int inv);
+void KEEPALIVE ffti_shuffle_1(double *x_i, double *x_q, uint64_t n);
+void KEEPALIVE fft_1(double *x_i, double *x_q, uint64_t n, uint64_t inv);
+void KEEPALIVE dft(double *x_i, double *x_q, int n, int inv);
#endif /* fft_h */
diff --git a/NaiveFFT/main.c b/NaiveFFT/main.c
index 036bb79..6372c79 100644
--- a/NaiveFFT/main.c
+++ b/NaiveFFT/main.c
@@ -14,6 +14,10 @@
#include <time.h>
#include <stdint.h>
+#if __EMSCRIPTEN__
+#include <emscripten/emscripten.h>
+#endif
+
#include "fft.h"
//test data array
@@ -26,6 +30,9 @@ double data_q[DATA_SIZE] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f};
int main(int argc, const char * argv[]) {
+#if __EMSCRIPTEN__
+ printf("Wasm NaiveFFT module loaded\n");
+#else
int i;
// insert code here...
@@ -95,5 +102,6 @@ int main(int argc, const char * argv[]) {
strftime(buffer, 32, "%H:%M:%S", tm_info);
puts(buffer);
}
+#endif
return 0;
}