-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfft.c
81 lines (69 loc) · 2.02 KB
/
fft.c
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
#include "fft.h"
#include "complex.c"
void BinaryReverse(int array[]);
void RFFT(int input[],ComplexNumber output[])
{
ComplexNumber temp;
int level,buttterflyInsideIndex,butterflyIndex,index;
int butterflyWidth,butterflyCount;
BinaryReverse(input);
for(index=0;index<LENGTH;index++)
{
output[index].real = input[index];
output[index].imaginary = 0;
}
for(level=1;level<=ORDER;level++)
{
butterflyWidth = 1<<(level-1);
butterflyCount = 1<<(ORDER-level);
for(butterflyIndex=0;butterflyIndex<butterflyCount;butterflyIndex++)
{
for(buttterflyInsideIndex=0;buttterflyInsideIndex<butterflyWidth;buttterflyInsideIndex++)
{
index = buttterflyInsideIndex+2*butterflyWidth*butterflyIndex;
temp = ComplexMultiply(output[index+butterflyWidth],TwiddleFactor(buttterflyInsideIndex*butterflyCount));
output[index+butterflyWidth] = ComplexReduce(output[index],temp);
output[index] = ComplexAdd (output[index],temp);
}
}
}
}
void BinaryReverse(int array[])
{
int index,bitIndex;
int indexReverse,lowOperator,highOperator,low,high;
for(index=0;index<LENGTH;index++)
{
indexReverse = index;
for(bitIndex=0;bitIndex<ORDER/2;bitIndex++)
{
lowOperator = 1 << bitIndex;
highOperator = 1 << (ORDER-1-bitIndex);
low = index & lowOperator;
high = index & highOperator;
if(low)
{
indexReverse |= highOperator;
}
else
{
indexReverse &= ~highOperator;
}
if(high)
{
indexReverse |= lowOperator;
}
else
{
indexReverse &= ~lowOperator;
}
}
if(index < indexReverse)
{
int temp;
temp = array[index];
array[index] = array[indexReverse];
array[indexReverse] = temp;
}
}
}