comparison src/vamp-sdk/FFT.cpp @ 510:8742125177ae

Merge from branch vamp-kiss-naming
author Chris Cannam
date Thu, 08 Feb 2018 15:40:33 +0000
parents 90571dcc371a
children df32b473b9b6
comparison
equal deleted inserted replaced
502:d129bf797f24 510:8742125177ae
49 49
50 #include "FFTimpl.cpp" 50 #include "FFTimpl.cpp"
51 51
52 namespace Vamp { 52 namespace Vamp {
53 53
54 using namespace Kiss;
55
54 void 56 void
55 FFT::forward(unsigned int un, 57 FFT::forward(unsigned int un,
56 const double *ri, const double *ii, 58 const double *ri, const double *ii,
57 double *ro, double *io) 59 double *ro, double *io)
58 { 60 {
59 int n(un); 61 int n(un);
60 Kiss::kiss_fft_cfg c = Kiss::kiss_fft_alloc(n, false, 0, 0); 62 vamp_kiss_fft_cfg c = vamp_kiss_fft_alloc(n, false, 0, 0);
61 Kiss::kiss_fft_cpx *in = new Kiss::kiss_fft_cpx[n]; 63 vamp_kiss_fft_cpx *in = new vamp_kiss_fft_cpx[n];
62 Kiss::kiss_fft_cpx *out = new Kiss::kiss_fft_cpx[n]; 64 vamp_kiss_fft_cpx *out = new vamp_kiss_fft_cpx[n];
63 for (int i = 0; i < n; ++i) { 65 for (int i = 0; i < n; ++i) {
64 in[i].r = ri[i]; 66 in[i].r = ri[i];
65 in[i].i = 0; 67 in[i].i = 0;
66 } 68 }
67 if (ii) { 69 if (ii) {
68 for (int i = 0; i < n; ++i) { 70 for (int i = 0; i < n; ++i) {
69 in[i].i = ii[i]; 71 in[i].i = ii[i];
70 } 72 }
71 } 73 }
72 kiss_fft(c, in, out); 74 vamp_kiss_fft(c, in, out);
73 for (int i = 0; i < n; ++i) { 75 for (int i = 0; i < n; ++i) {
74 ro[i] = out[i].r; 76 ro[i] = out[i].r;
75 io[i] = out[i].i; 77 io[i] = out[i].i;
76 } 78 }
77 Kiss::kiss_fft_free(c); 79 vamp_kiss_fft_free(c);
78 delete[] in; 80 delete[] in;
79 delete[] out; 81 delete[] out;
80 } 82 }
81 83
82 void 84 void
83 FFT::inverse(unsigned int un, 85 FFT::inverse(unsigned int un,
84 const double *ri, const double *ii, 86 const double *ri, const double *ii,
85 double *ro, double *io) 87 double *ro, double *io)
86 { 88 {
87 int n(un); 89 int n(un);
88 Kiss::kiss_fft_cfg c = Kiss::kiss_fft_alloc(n, true, 0, 0); 90 vamp_kiss_fft_cfg c = vamp_kiss_fft_alloc(n, true, 0, 0);
89 Kiss::kiss_fft_cpx *in = new Kiss::kiss_fft_cpx[n]; 91 vamp_kiss_fft_cpx *in = new vamp_kiss_fft_cpx[n];
90 Kiss::kiss_fft_cpx *out = new Kiss::kiss_fft_cpx[n]; 92 vamp_kiss_fft_cpx *out = new vamp_kiss_fft_cpx[n];
91 for (int i = 0; i < n; ++i) { 93 for (int i = 0; i < n; ++i) {
92 in[i].r = ri[i]; 94 in[i].r = ri[i];
93 in[i].i = 0; 95 in[i].i = 0;
94 } 96 }
95 if (ii) { 97 if (ii) {
96 for (int i = 0; i < n; ++i) { 98 for (int i = 0; i < n; ++i) {
97 in[i].i = ii[i]; 99 in[i].i = ii[i];
98 } 100 }
99 } 101 }
100 kiss_fft(c, in, out); 102 vamp_kiss_fft(c, in, out);
101 double scale = 1.0 / double(n); 103 double scale = 1.0 / double(n);
102 for (int i = 0; i < n; ++i) { 104 for (int i = 0; i < n; ++i) {
103 ro[i] = out[i].r * scale; 105 ro[i] = out[i].r * scale;
104 io[i] = out[i].i * scale; 106 io[i] = out[i].i * scale;
105 } 107 }
106 Kiss::kiss_fft_free(c); 108 vamp_kiss_fft_free(c);
107 delete[] in; 109 delete[] in;
108 delete[] out; 110 delete[] out;
109 } 111 }
110 112
111 class FFTComplex::D 113 class FFTComplex::D
112 { 114 {
113 public: 115 public:
114 D(int n) : 116 D(int n) :
115 m_n(n), 117 m_n(n),
116 m_fconf(Kiss::kiss_fft_alloc(n, false, 0, 0)), 118 m_fconf(vamp_kiss_fft_alloc(n, false, 0, 0)),
117 m_iconf(Kiss::kiss_fft_alloc(n, true, 0, 0)), 119 m_iconf(vamp_kiss_fft_alloc(n, true, 0, 0)),
118 m_ci(new Kiss::kiss_fft_cpx[m_n]), 120 m_ci(new vamp_kiss_fft_cpx[m_n]),
119 m_co(new Kiss::kiss_fft_cpx[m_n]) { } 121 m_co(new vamp_kiss_fft_cpx[m_n]) { }
120 122
121 ~D() { 123 ~D() {
122 Kiss::kiss_fftr_free(m_fconf); 124 vamp_kiss_fftr_free(m_fconf);
123 Kiss::kiss_fftr_free(m_iconf); 125 vamp_kiss_fftr_free(m_iconf);
124 delete[] m_ci; 126 delete[] m_ci;
125 delete[] m_co; 127 delete[] m_co;
126 } 128 }
127 129
128 void forward(const double *ci, double *co) { 130 void forward(const double *ci, double *co) {
129 for (int i = 0; i < m_n; ++i) { 131 for (int i = 0; i < m_n; ++i) {
130 m_ci[i].r = ci[i*2]; 132 m_ci[i].r = ci[i*2];
131 m_ci[i].i = ci[i*2+1]; 133 m_ci[i].i = ci[i*2+1];
132 } 134 }
133 Kiss::kiss_fft(m_fconf, m_ci, m_co); 135 vamp_kiss_fft(m_fconf, m_ci, m_co);
134 for (int i = 0; i < m_n; ++i) { 136 for (int i = 0; i < m_n; ++i) {
135 co[i*2] = m_co[i].r; 137 co[i*2] = m_co[i].r;
136 co[i*2+1] = m_co[i].i; 138 co[i*2+1] = m_co[i].i;
137 } 139 }
138 } 140 }
140 void inverse(const double *ci, double *co) { 142 void inverse(const double *ci, double *co) {
141 for (int i = 0; i < m_n; ++i) { 143 for (int i = 0; i < m_n; ++i) {
142 m_ci[i].r = ci[i*2]; 144 m_ci[i].r = ci[i*2];
143 m_ci[i].i = ci[i*2+1]; 145 m_ci[i].i = ci[i*2+1];
144 } 146 }
145 Kiss::kiss_fft(m_iconf, m_ci, m_co); 147 vamp_kiss_fft(m_iconf, m_ci, m_co);
146 double scale = 1.0 / double(m_n); 148 double scale = 1.0 / double(m_n);
147 for (int i = 0; i < m_n; ++i) { 149 for (int i = 0; i < m_n; ++i) {
148 co[i*2] = m_co[i].r * scale; 150 co[i*2] = m_co[i].r * scale;
149 co[i*2+1] = m_co[i].i * scale; 151 co[i*2+1] = m_co[i].i * scale;
150 } 152 }
151 } 153 }
152 154
153 private: 155 private:
154 int m_n; 156 int m_n;
155 Kiss::kiss_fft_cfg m_fconf; 157 vamp_kiss_fft_cfg m_fconf;
156 Kiss::kiss_fft_cfg m_iconf; 158 vamp_kiss_fft_cfg m_iconf;
157 Kiss::kiss_fft_cpx *m_ci; 159 vamp_kiss_fft_cpx *m_ci;
158 Kiss::kiss_fft_cpx *m_co; 160 vamp_kiss_fft_cpx *m_co;
159 }; 161 };
160 162
161 FFTComplex::FFTComplex(unsigned int n) : 163 FFTComplex::FFTComplex(unsigned int n) :
162 m_d(new D(n)) 164 m_d(new D(n))
163 { 165 {
183 class FFTReal::D 185 class FFTReal::D
184 { 186 {
185 public: 187 public:
186 D(int n) : 188 D(int n) :
187 m_n(n), 189 m_n(n),
188 m_fconf(Kiss::kiss_fftr_alloc(n, false, 0, 0)), 190 m_fconf(vamp_kiss_fftr_alloc(n, false, 0, 0)),
189 m_iconf(Kiss::kiss_fftr_alloc(n, true, 0, 0)), 191 m_iconf(vamp_kiss_fftr_alloc(n, true, 0, 0)),
190 m_ri(new Kiss::kiss_fft_scalar[m_n]), 192 m_ri(new vamp_kiss_fft_scalar[m_n]),
191 m_ro(new Kiss::kiss_fft_scalar[m_n]), 193 m_ro(new vamp_kiss_fft_scalar[m_n]),
192 m_freq(new Kiss::kiss_fft_cpx[n/2+1]) { } 194 m_freq(new vamp_kiss_fft_cpx[n/2+1]) { }
193 195
194 ~D() { 196 ~D() {
195 Kiss::kiss_fftr_free(m_fconf); 197 vamp_kiss_fftr_free(m_fconf);
196 Kiss::kiss_fftr_free(m_iconf); 198 vamp_kiss_fftr_free(m_iconf);
197 delete[] m_ri; 199 delete[] m_ri;
198 delete[] m_ro; 200 delete[] m_ro;
199 delete[] m_freq; 201 delete[] m_freq;
200 } 202 }
201 203
202 void forward(const double *ri, double *co) { 204 void forward(const double *ri, double *co) {
203 for (int i = 0; i < m_n; ++i) { 205 for (int i = 0; i < m_n; ++i) {
204 // in case kiss_fft_scalar is float 206 // in case vamp_kiss_fft_scalar is float
205 m_ri[i] = ri[i]; 207 m_ri[i] = ri[i];
206 } 208 }
207 Kiss::kiss_fftr(m_fconf, m_ri, m_freq); 209 vamp_kiss_fftr(m_fconf, m_ri, m_freq);
208 int hs = m_n/2 + 1; 210 int hs = m_n/2 + 1;
209 for (int i = 0; i < hs; ++i) { 211 for (int i = 0; i < hs; ++i) {
210 co[i*2] = m_freq[i].r; 212 co[i*2] = m_freq[i].r;
211 co[i*2+1] = m_freq[i].i; 213 co[i*2+1] = m_freq[i].i;
212 } 214 }
216 int hs = m_n/2 + 1; 218 int hs = m_n/2 + 1;
217 for (int i = 0; i < hs; ++i) { 219 for (int i = 0; i < hs; ++i) {
218 m_freq[i].r = ci[i*2]; 220 m_freq[i].r = ci[i*2];
219 m_freq[i].i = ci[i*2+1]; 221 m_freq[i].i = ci[i*2+1];
220 } 222 }
221 Kiss::kiss_fftri(m_iconf, m_freq, m_ro); 223 vamp_kiss_fftri(m_iconf, m_freq, m_ro);
222 double scale = 1.0 / double(m_n); 224 double scale = 1.0 / double(m_n);
223 for (int i = 0; i < m_n; ++i) { 225 for (int i = 0; i < m_n; ++i) {
224 ro[i] = m_ro[i] * scale; 226 ro[i] = m_ro[i] * scale;
225 } 227 }
226 } 228 }
227 229
228 private: 230 private:
229 int m_n; 231 int m_n;
230 Kiss::kiss_fftr_cfg m_fconf; 232 vamp_kiss_fftr_cfg m_fconf;
231 Kiss::kiss_fftr_cfg m_iconf; 233 vamp_kiss_fftr_cfg m_iconf;
232 Kiss::kiss_fft_scalar *m_ri; 234 vamp_kiss_fft_scalar *m_ri;
233 Kiss::kiss_fft_scalar *m_ro; 235 vamp_kiss_fft_scalar *m_ro;
234 Kiss::kiss_fft_cpx *m_freq; 236 vamp_kiss_fft_cpx *m_freq;
235 }; 237 };
236 238
237 FFTReal::FFTReal(unsigned int n) : 239 FFTReal::FFTReal(unsigned int n) :
238 m_d(new D(n)) 240 m_d(new D(n))
239 { 241 {