-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmyFFT.cpp
95 lines (92 loc) · 3.21 KB
/
myFFT.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <avr/pgmspace.h>
#include "myFFT.h"
#include <Arduino.h>
#define pi 3.141592654
void myDFT(double* re, double* im, int N, int Fs){
int re2[N], im2[N];
for (int i = 0; i < N; i++){
double temp_re = 0, temp_im = 0;
for (int j = 0; j < N; j++){
temp_re += re[j]*cos(-2*pi*i*j/N);
temp_im += re[j]*sin(-2*pi*i*j/N);
}
re2[i] = temp_re;
im2[i] = temp_im;
}
for (int i = 0; i < N; i++){
re[i] = re2[i];
im[i] = im2[i];
}
}
void myFFT(double* nXr, double* nXi, double real[], double imag[], int N, int h, int sam_gap){
/* Variables:
nXr: real Freq
nXi: imagined Freq
r[]: real signal
i[]: imagined signal
N: # of samples
h: signal starting point
sam_gap: signal sampling gap
*/
if (N == 1){
nXr[0] = real[h];
nXi[0] = imag[h];
return;
}else{
double nXr1[N/2], nXi1[N/2], nXr2[N/2], nXi2[N/2];
// Interval recursion
myFFT(nXr1, nXi1, real, imag, N/2, h, sam_gap*2);
myFFT(nXr2, nXi2, real, imag, N/2, h+sam_gap, sam_gap*2);
for (int i = 0; i < (N/2); i++){
// t <- X_k
double temp_re = nXr1[i];
double temp_im = nXi1[i];
double temp_re_iN2 = nXr2[i];
double temp_im_iN2 = nXi2[i];
// X_k <- t + exp(-2*pi*i*k/N) X_(k+N/2)
nXr[i] = temp_re + cos(-2*pi*i/N)*temp_re_iN2 - sin(-2*pi*i/N)*temp_im_iN2;
nXi[i] = temp_im + cos(-2*pi*i/N)*temp_im_iN2 + sin(-2*pi*i/N)*temp_re_iN2;
// X_(k+N/2) <- t - exp(-2*pi*i*k/N) X_(k+N/2)
nXr[i+N/2] = temp_re - (cos(-2*pi*i/N)*temp_re_iN2 - sin(-2*pi*i/N)*temp_im_iN2);
nXi[i+N/2] = temp_im - (cos(-2*pi*i/N)*temp_im_iN2 + sin(-2*pi*i/N)*temp_re_iN2);
}
}
}
void myFFT2(double* nXr, double* nXi, int fst, double real[], double imag[], int N, int h, int sam_gap){
/* Variables:
nXr: real Freq
nXi: imagined Freq
fst: Freq starting point
r[]: real signal
i[]: imagined signal
N: # of samples
h: signal starting point
sam_gap: signal sampling gap
*/
if (N == 1){
nXr[fst] = real[h];
nXi[fst] = imag[h];
return;
}else{
// double nXr1[N/2], nXi1[N/2], nXr2[N/2], nXi2[N/2];
// Interval recursion
myFFT2(nXr, nXi, fst, real, imag, N/2, h, sam_gap*2);
myFFT2(nXr, nXi, fst+N/2, real, imag, N/2, h+sam_gap, sam_gap*2);
for (int i = 0; i < (N/2); i++){
// t <- X_k
double temp_re = nXr[i+fst];
double temp_im = nXi[i+fst];
double temp_re_iN2 = nXr[i+fst+N/2];
double temp_im_iN2 = nXi[i+fst+N/2];
// Calculation temp
double temp1 = cos(-2*pi*i/N)*temp_re_iN2 - sin(-2*pi*i/N)*temp_im_iN2;
double temp2 = cos(-2*pi*i/N)*temp_im_iN2 + sin(-2*pi*i/N)*temp_re_iN2;
// X_k <- t + exp(-2*pi*i*k/N) X_(k+N/2)
nXr[i+fst] = temp_re + temp1;
nXi[i+fst] = temp_im + temp2;
// X_(k+N/2) <- t - exp(-2*pi*i*k/N) X_(k+N/2)
nXr[i+fst+N/2] = temp_re - temp1;
nXi[i+fst+N/2] = temp_im - temp2;
}
}
}