[beast] TOOLS: speedup bsefextract by precomputing the blackman window
- From: Stefan Westerfeld <stw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [beast] TOOLS: speedup bsefextract by precomputing the blackman window
- Date: Sat, 29 Jan 2011 13:39:42 +0000 (UTC)
commit dfbde95afa5d772308ad836c085e80d7ea06d232
Author: Stefan Westerfeld <stefan space twc de>
Date: Sat Jan 29 14:37:57 2011 +0100
TOOLS: speedup bsefextract by precomputing the blackman window
tools/bsefextract.cc | 27 ++++++++++++++++++++-------
1 files changed, 20 insertions(+), 7 deletions(-)
---
diff --git a/tools/bsefextract.cc b/tools/bsefextract.cc
index c22b646..8fca57e 100644
--- a/tools/bsefextract.cc
+++ b/tools/bsefextract.cc
@@ -303,22 +303,33 @@ struct SpectrumFeature : public Feature
{
vector< vector<double> > spectrum;
vector< vector<double> > joined_spectrum;
+ vector< double > window;
SpectrumFeature() :
Feature ("--spectrum", "generate 30ms sliced frequency spectrums")
{
}
+ void
+ init_window (size_t size)
+ {
+ window.resize (size);
+
+ for (size_t i = 0; i < size; i++)
+ window[i] = bse_window_blackman (2.0 * i / size - 1.0); /* the bse blackman window is defined in range [-1, 1] */
+ }
+
vector<double>
- build_frequency_vector (GslLong size,
- double *samples)
+ build_frequency_vector (double *samples)
{
+ const size_t size = window.size();
+ assert (size > 0);
+
vector<double> fvector;
double in[size], c[size + 2], *im;
- gint i;
- for (i = 0; i < size; i++)
- in[i] = bse_window_blackman (2.0 * i / size - 1.0) * samples[i]; /* the bse blackman window is defined in range [-1, 1] */
+ for (size_t i = 0; i < size; i++)
+ in[i] = window[i] * samples[i];
gsl_power2_fftar (size, in, c);
c[size] = c[1];
@@ -326,7 +337,7 @@ struct SpectrumFeature : public Feature
c[1] = 0;
im = c + 1;
- for (i = 0; i <= size >> 1; i++)
+ for (size_t i = 0; i <= size >> 1; i++)
{
double abs = sqrt (c[i << 1] * c[i << 1] + im[i << 1] * im[i << 1]);
/* FIXME: is this the correct normalization? */
@@ -396,6 +407,8 @@ struct SpectrumFeature : public Feature
if (spectrum.size()) /* don't compute the same feature twice */
return;
+ init_window (4096);
+
double file_size_ms = signal.time_ms (signal.length());
for (double offset_ms = 0; offset_ms < file_size_ms; offset_ms += 30) /* extract a feature vector every 30 ms */
@@ -418,7 +431,7 @@ struct SpectrumFeature : public Feature
if (!skip)
{
- vector<double> fvector = build_frequency_vector (4096, samples);
+ vector<double> fvector = build_frequency_vector (samples);
spectrum.push_back (collapse_frequency_vector (fvector, signal.mix_freq(), 50, 1.6));
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]