comparison transform/FeatureExtractionPluginTransform.cpp @ 67:eb530055ed55

* Add support for frequency-domain inputs to Vamp plugins
author Chris Cannam
date Fri, 31 Mar 2006 17:40:14 +0000
parents 7afcfe666910
children 8e8c2981a189
comparison
equal deleted inserted replaced
66:7afcfe666910 67:eb530055ed55
19 #include "plugin/FeatureExtractionPluginFactory.h" 19 #include "plugin/FeatureExtractionPluginFactory.h"
20 #include "plugin/PluginXml.h" 20 #include "plugin/PluginXml.h"
21 #include "vamp-sdk/Plugin.h" 21 #include "vamp-sdk/Plugin.h"
22 22
23 #include "base/Model.h" 23 #include "base/Model.h"
24 #include "base/Window.h"
24 #include "model/SparseOneDimensionalModel.h" 25 #include "model/SparseOneDimensionalModel.h"
25 #include "model/SparseTimeValueModel.h" 26 #include "model/SparseTimeValueModel.h"
26 #include "model/DenseThreeDimensionalModel.h" 27 #include "model/DenseThreeDimensionalModel.h"
27 #include "model/DenseTimeValueModel.h" 28 #include "model/DenseTimeValueModel.h"
29
30 #include <fftw3.h>
28 31
29 #include <iostream> 32 #include <iostream>
30 33
31 FeatureExtractionPluginTransform::FeatureExtractionPluginTransform(Model *inputModel, 34 FeatureExtractionPluginTransform::FeatureExtractionPluginTransform(Model *inputModel,
32 QString pluginId, 35 QString pluginId,
201 m_plugin->initialise(channelCount, stepSize, blockSize); 204 m_plugin->initialise(channelCount, stepSize, blockSize);
202 205
203 float **buffers = new float*[channelCount]; 206 float **buffers = new float*[channelCount];
204 for (size_t ch = 0; ch < channelCount; ++ch) { 207 for (size_t ch = 0; ch < channelCount; ++ch) {
205 buffers[ch] = new float[blockSize]; 208 buffers[ch] = new float[blockSize];
209 }
210
211 double *fftInput = 0;
212 fftw_complex *fftOutput = 0;
213 fftw_plan fftPlan = 0;
214 Window<double> windower(HanningWindow, blockSize);
215
216 if (m_plugin->getInputDomain() == Vamp::Plugin::FrequencyDomain) {
217
218 fftInput = (double *)fftw_malloc(blockSize * sizeof(double));
219 fftOutput = (fftw_complex *)fftw_malloc(blockSize * sizeof(fftw_complex));
220 fftPlan = fftw_plan_dft_r2c_1d(blockSize, fftInput, fftOutput,
221 FFTW_ESTIMATE);
222 if (!fftPlan) {
223 std::cerr << "ERROR: FeatureExtractionPluginTransform::run(): fftw_plan failed! Results will be garbage" << std::endl;
224 }
206 } 225 }
207 226
208 size_t startFrame = m_input->getStartFrame(); 227 size_t startFrame = m_input->getStartFrame();
209 size_t endFrame = m_input->getEndFrame(); 228 size_t endFrame = m_input->getEndFrame();
210 size_t blockFrame = startFrame; 229 size_t blockFrame = startFrame;
238 buffers[ch][got++] = 0.0; 257 buffers[ch][got++] = 0.0;
239 } 258 }
240 } 259 }
241 } 260 }
242 261
262 if (fftPlan) {
263 for (size_t ch = 0; ch < channelCount; ++ch) {
264 for (size_t i = 0; i < blockSize; ++i) {
265 fftInput[i] = buffers[ch][i];
266 }
267 windower.cut(fftInput);
268 for (size_t i = 0; i < blockSize/2; ++i) {
269 double temp = fftInput[i];
270 fftInput[i] = fftInput[i + blockSize/2];
271 fftInput[i + blockSize/2] = temp;
272 }
273 fftw_execute(fftPlan);
274 for (size_t i = 0; i < blockSize/2; ++i) {
275 buffers[ch][i*2] = fftOutput[i][0];
276 buffers[ch][i*2 + 1] = fftOutput[i][1];
277 }
278 }
279 }
280
243 Vamp::Plugin::FeatureSet features = m_plugin->process 281 Vamp::Plugin::FeatureSet features = m_plugin->process
244 (buffers, Vamp::RealTime::frame2RealTime(blockFrame, sampleRate)); 282 (buffers, Vamp::RealTime::frame2RealTime(blockFrame, sampleRate));
245 283
246 for (size_t fi = 0; fi < features[m_outputFeatureNo].size(); ++fi) { 284 for (size_t fi = 0; fi < features[m_outputFeatureNo].size(); ++fi) {
247 Vamp::Plugin::Feature feature = 285 Vamp::Plugin::Feature feature =
253 setCompletion(completion); 291 setCompletion(completion);
254 prevCompletion = completion; 292 prevCompletion = completion;
255 } 293 }
256 294
257 blockFrame += stepSize; 295 blockFrame += stepSize;
296 }
297
298 if (fftPlan) {
299 fftw_destroy_plan(fftPlan);
300 fftw_free(fftInput);
301 fftw_free(fftOutput);
258 } 302 }
259 303
260 Vamp::Plugin::FeatureSet features = m_plugin->getRemainingFeatures(); 304 Vamp::Plugin::FeatureSet features = m_plugin->getRemainingFeatures();
261 305
262 for (size_t fi = 0; fi < features[m_outputFeatureNo].size(); ++fi) { 306 for (size_t fi = 0; fi < features[m_outputFeatureNo].size(); ++fi) {