-
Notifications
You must be signed in to change notification settings - Fork 11
/
fftwproxy.cpp
98 lines (80 loc) · 2.02 KB
/
fftwproxy.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
96
97
98
#include "fftwproxy.h"
#include <fftw3.h>
struct FFTWProxyImpl
{
virtual ~FFTWProxyImpl() {};
virtual void executeForward() = 0;
virtual void executeInverse() = 0;
};
struct FFTWProxyImplDouble : public FFTWProxyImpl
{
FFTWProxyImplDouble(int n, double* timespace, gendouble2* freqspace)
{
forwardPlan = fftw_plan_dft_r2c_1d(
n, timespace, (fftw_complex*)freqspace, FFTW_ESTIMATE);
inversePlan = fftw_plan_dft_c2r_1d(
n, (fftw_complex*)freqspace, timespace, FFTW_ESTIMATE);
}
virtual ~FFTWProxyImplDouble()
{
fftw_destroy_plan(forwardPlan);
fftw_destroy_plan(inversePlan);
}
void executeForward()
{
fftw_execute(forwardPlan);
}
void executeInverse()
{
fftw_execute(inversePlan);
}
fftw_plan forwardPlan;
fftw_plan inversePlan;
};
struct FFTWProxyImplFloat : public FFTWProxyImpl
{
FFTWProxyImplFloat(int n, float* timespace, genfloat2* freqspace)
{
forwardPlan = fftwf_plan_dft_r2c_1d(
n, timespace, (fftwf_complex*)freqspace, FFTW_ESTIMATE);
inversePlan = fftwf_plan_dft_c2r_1d(
n, (fftwf_complex*)freqspace, timespace, FFTW_ESTIMATE);
}
virtual ~FFTWProxyImplFloat()
{
fftwf_destroy_plan(forwardPlan);
fftwf_destroy_plan(inversePlan);
}
void executeForward()
{
fftwf_execute(forwardPlan);
}
void executeInverse()
{
fftwf_execute(inversePlan);
}
fftwf_plan forwardPlan;
fftwf_plan inversePlan;
};
FFTWProxy::FFTWProxy(int n, float* timespace, genfloat2* freqspace)
{
size = n;
impl = new FFTWProxyImplFloat(n, timespace, freqspace);
}
FFTWProxy::FFTWProxy(int n, double* timespace, gendouble2* freqspace)
{
size = n;
impl = new FFTWProxyImplDouble(n, timespace, freqspace);
}
FFTWProxy::~FFTWProxy()
{
delete impl;
}
void FFTWProxy::execForward()
{
impl->executeForward();
}
void FFTWProxy::execInverse()
{
impl->executeInverse();
}