Mercurial > hg > svcore
comparison transform/FeatureExtractionPluginTransform.cpp @ 122:c1de4b4e9c29
* Switch from fftw3 to fftw3f. I think the efficiency improvement is probably
worth the lower precision, although I ought to do a few more tests.
author | Chris Cannam |
---|---|
date | Thu, 15 Jun 2006 12:28:47 +0000 |
parents | 4170b21773cf |
children | f47f4c7c158c |
comparison
equal
deleted
inserted
replaced
121:7c3e1bc51080 | 122:c1de4b4e9c29 |
---|---|
239 float **buffers = new float*[channelCount]; | 239 float **buffers = new float*[channelCount]; |
240 for (size_t ch = 0; ch < channelCount; ++ch) { | 240 for (size_t ch = 0; ch < channelCount; ++ch) { |
241 buffers[ch] = new float[m_blockSize]; | 241 buffers[ch] = new float[m_blockSize]; |
242 } | 242 } |
243 | 243 |
244 double *fftInput = 0; | 244 float *fftInput = 0; |
245 fftw_complex *fftOutput = 0; | 245 fftwf_complex *fftOutput = 0; |
246 fftw_plan fftPlan = 0; | 246 fftwf_plan fftPlan = 0; |
247 Window<double> windower(HanningWindow, m_blockSize); | 247 Window<float> windower(HanningWindow, m_blockSize); |
248 | 248 |
249 if (m_plugin->getInputDomain() == Vamp::Plugin::FrequencyDomain) { | 249 if (m_plugin->getInputDomain() == Vamp::Plugin::FrequencyDomain) { |
250 | 250 |
251 fftInput = (double *)fftw_malloc(m_blockSize * sizeof(double)); | 251 fftInput = (float *)fftwf_malloc(m_blockSize * sizeof(double)); |
252 fftOutput = (fftw_complex *)fftw_malloc(m_blockSize * sizeof(fftw_complex)); | 252 fftOutput = (fftwf_complex *)fftwf_malloc(m_blockSize * sizeof(fftwf_complex)); |
253 fftPlan = fftw_plan_dft_r2c_1d(m_blockSize, fftInput, fftOutput, | 253 fftPlan = fftwf_plan_dft_r2c_1d(m_blockSize, fftInput, fftOutput, |
254 FFTW_ESTIMATE); | 254 FFTW_ESTIMATE); |
255 if (!fftPlan) { | 255 if (!fftPlan) { |
256 std::cerr << "ERROR: FeatureExtractionPluginTransform::run(): fftw_plan failed! Results will be garbage" << std::endl; | 256 std::cerr << "ERROR: FeatureExtractionPluginTransform::run(): fftw_plan failed! Results will be garbage" << std::endl; |
257 } | 257 } |
258 } | 258 } |
259 | 259 |
295 for (size_t i = 0; i < m_blockSize; ++i) { | 295 for (size_t i = 0; i < m_blockSize; ++i) { |
296 fftInput[i] = buffers[ch][i]; | 296 fftInput[i] = buffers[ch][i]; |
297 } | 297 } |
298 windower.cut(fftInput); | 298 windower.cut(fftInput); |
299 for (size_t i = 0; i < m_blockSize/2; ++i) { | 299 for (size_t i = 0; i < m_blockSize/2; ++i) { |
300 double temp = fftInput[i]; | 300 float temp = fftInput[i]; |
301 fftInput[i] = fftInput[i + m_blockSize/2]; | 301 fftInput[i] = fftInput[i + m_blockSize/2]; |
302 fftInput[i + m_blockSize/2] = temp; | 302 fftInput[i + m_blockSize/2] = temp; |
303 } | 303 } |
304 fftw_execute(fftPlan); | 304 fftwf_execute(fftPlan); |
305 for (size_t i = 0; i < m_blockSize/2; ++i) { | 305 for (size_t i = 0; i < m_blockSize/2; ++i) { |
306 buffers[ch][i*2] = fftOutput[i][0]; | 306 buffers[ch][i*2] = fftOutput[i][0]; |
307 buffers[ch][i*2 + 1] = fftOutput[i][1]; | 307 buffers[ch][i*2 + 1] = fftOutput[i][1]; |
308 } | 308 } |
309 } | 309 } |
325 | 325 |
326 blockFrame += m_stepSize; | 326 blockFrame += m_stepSize; |
327 } | 327 } |
328 | 328 |
329 if (fftPlan) { | 329 if (fftPlan) { |
330 fftw_destroy_plan(fftPlan); | 330 fftwf_destroy_plan(fftPlan); |
331 fftw_free(fftInput); | 331 fftwf_free(fftInput); |
332 fftw_free(fftOutput); | 332 fftwf_free(fftOutput); |
333 } | 333 } |
334 | 334 |
335 Vamp::Plugin::FeatureSet features = m_plugin->getRemainingFeatures(); | 335 Vamp::Plugin::FeatureSet features = m_plugin->getRemainingFeatures(); |
336 | 336 |
337 for (size_t fi = 0; fi < features[m_outputFeatureNo].size(); ++fi) { | 337 for (size_t fi = 0; fi < features[m_outputFeatureNo].size(); ++fi) { |