summaryrefslogtreecommitdiff
path: root/gtk2_ardour/fft_result.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2008-03-17 20:54:03 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2008-03-17 20:54:03 +0000
commit997e4b1f9cd7ccfc704b7c035051da7f60d831e7 (patch)
tree1236e40183b677abf4a2882e4cfe8e0a345eb24d /gtk2_ardour/fft_result.cc
parent19a4b990325577fc949ccd5d5fbad4520eb1df56 (diff)
merge with 2.0-ongoing @ rev 3147
git-svn-id: svn://localhost/ardour2/branches/3.0@3152 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/fft_result.cc')
-rw-r--r--gtk2_ardour/fft_result.cc89
1 files changed, 75 insertions, 14 deletions
diff --git a/gtk2_ardour/fft_result.cc b/gtk2_ardour/fft_result.cc
index f5acef92ed..d692b9152b 100644
--- a/gtk2_ardour/fft_result.cc
+++ b/gtk2_ardour/fft_result.cc
@@ -37,8 +37,16 @@ FFTResult::FFTResult(FFTGraph *graph, Gdk::Color color, string trackname)
_averages = 0;
- _data = (float *) malloc(sizeof(float) * _dataSize);
- memset(_data,0,sizeof(float) * _dataSize);
+ _data_avg = (float *) malloc(sizeof(float) * _dataSize);
+ memset(_data_avg,0,sizeof(float) * _dataSize);
+
+ _data_min = (float *) malloc(sizeof(float) * _dataSize);
+ _data_max = (float *) malloc(sizeof(float) * _dataSize);
+
+ for (int i = 0; i < _dataSize; i++) {
+ _data_min[i] = FLT_MAX;
+ _data_max[i] = FLT_MIN;
+ }
_color = color;
_trackname = trackname;
@@ -47,7 +55,34 @@ FFTResult::FFTResult(FFTGraph *graph, Gdk::Color color, string trackname)
void
FFTResult::analyzeWindow(float *window)
{
- _graph->analyze(window, _data);
+ float *_hanning = _graph->_hanning;
+ float *_in = _graph->_in;
+ float *_out = _graph->_out;
+
+ int i;
+ // Copy the data and apply the hanning window
+ for (i = 0; i < _windowSize; i++) {
+ _in[i] = window[ i ] * _hanning[ i ];
+ }
+
+ fftwf_execute(_graph->_plan);
+
+ float b = _out[0] * _out[0];
+
+ _data_avg[0] += b;
+ if (b < _data_min[0]) _data_min[0] = b;
+ if (b > _data_max[0]) _data_max[0] = b;
+
+ for (i=1; i < _dataSize - 1; i++) { // TODO: check with Jesse whether this is really correct
+ b = (_out[i] * _out[i]);
+
+ _data_avg[i] += b; // + (_out[_windowSize-i] * _out[_windowSize-i]);, TODO: thanks to Stefan Kost
+
+ if (_data_min[i] > b) _data_min[i] = b;
+ if (_data_max[i] < b ) _data_max[i] = b;
+ }
+
+
_averages++;
}
@@ -59,21 +94,27 @@ FFTResult::finalize()
_maximum = 0.0;
return;
}
-
+
// Average & scale
for (int i = 0; i < _dataSize; i++) {
- _data[i] /= _averages;
- _data[i] = 10.0f * log10f(_data[i]);
+ _data_avg[i] /= _averages;
+ _data_avg[i] = 10.0f * log10f(_data_avg[i]);
+
+ _data_min[i] = 10.0f * log10f(_data_min[i]);
+ if (_data_min[i] < -10000.0f) {
+ _data_min[i] = -10000.0f;
+ }
+ _data_max[i] = 10.0f * log10f(_data_max[i]);
}
// find min & max
- _minimum = _maximum = _data[0];
+ _minimum = _maximum = _data_avg[0];
for (int i = 1; i < _dataSize; i++) {
- if (_data[i] < _minimum && !isinf(_data[i])) {
- _minimum = _data[i];
- } else if (_data[i] > _maximum && !isinf(_data[i])) {
- _maximum = _data[i];
+ if (_data_avg[i] < _minimum && !isinf(_data_avg[i])) {
+ _minimum = _data_avg[i];
+ } else if (_data_avg[i] > _maximum && !isinf(_data_avg[i])) {
+ _maximum = _data_avg[i];
}
}
@@ -82,16 +123,36 @@ FFTResult::finalize()
FFTResult::~FFTResult()
{
- free(_data);
+ free(_data_avg);
+ free(_data_min);
+ free(_data_max);
}
float
-FFTResult::sampleAt(int x)
+FFTResult::avgAt(int x)
+{
+ if (x < 0 || x>= _dataSize)
+ return 0.0f;
+
+ return _data_avg[x];
+}
+
+float
+FFTResult::minAt(int x)
+{
+ if (x < 0 || x>= _dataSize)
+ return 0.0f;
+
+ return _data_min[x];
+}
+
+float
+FFTResult::maxAt(int x)
{
if (x < 0 || x>= _dataSize)
return 0.0f;
- return _data[x];
+ return _data_max[x];
}