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) {