Mercurial > hg > vamp-plugin-sdk
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 { |