Mercurial > hg > svcore
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) { |