From 3891c733af596666b4ed98765d36226582ad624c Mon Sep 17 00:00:00 2001 From: Sampo Savolainen Date: Sun, 12 Mar 2006 21:58:52 +0000 Subject: First commit on FFT analysis window. Still some functionality missing, but it's mostly done. git-svn-id: svn://localhost/trunk/ardour2@383 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/fft_result.cc | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 gtk2_ardour/fft_result.cc (limited to 'gtk2_ardour/fft_result.cc') diff --git a/gtk2_ardour/fft_result.cc b/gtk2_ardour/fft_result.cc new file mode 100644 index 0000000000..9a55b59cb5 --- /dev/null +++ b/gtk2_ardour/fft_result.cc @@ -0,0 +1,97 @@ +/* + Copyright (C) 2006 Paul Davis + Written by Sampo Savolainen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include +#include +#include +#include + +#include + +using namespace std; + +FFTResult::FFTResult(FFTGraph *graph, Gdk::Color color, string trackname) +{ + _graph = graph; + + _windowSize = _graph->windowSize(); + _dataSize = _windowSize / 2; + + _averages = 0; + + _data = (float *) malloc(sizeof(float) * _dataSize); + memset(_data,0,sizeof(float) * _dataSize); + + _color = color; + _trackname = trackname; +} + +void +FFTResult::analyzeWindow(float *window) +{ + _graph->analyze(window, _data); + _averages++; +} + +void +FFTResult::finalize() +{ + if (_averages == 0) { + _minimum = 0.0; + _maximum = 0.0; + return; + } + + // Average & scale + for (int i = 0; i < _dataSize; i++) { + _data[i] /= _averages; + _data[i] = 10.0f * log10f(_data[i]); + } + + // find min & max + _minimum = _maximum = _data[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]; + } + } + + _averages = 0; +} + +FFTResult::~FFTResult() +{ + free(_data); +} + + +float +FFTResult::sampleAt(int x) +{ + if (x < 0 || x>= _dataSize) + return 0.0f; + + return _data[x]; +} + -- cgit v1.2.3