diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-02-26 08:15:51 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-02-26 08:15:51 +0000 |
| commit | 1fadfdf60bb2c02086c2c9689ea44c73bed41571 (patch) | |
| tree | 2238c3bc011a545212e8a22f75d9af35cc300584 /src/lib | |
| parent | 36fdb78ea9973d1a797171d762802e707577c960 (diff) | |
Pretty dumb smoothing.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/analyse_audio_job.cc | 3 | ||||
| -rw-r--r-- | src/lib/audio_analysis.cc | 28 | ||||
| -rw-r--r-- | src/lib/audio_analysis.h | 2 |
3 files changed, 31 insertions, 2 deletions
diff --git a/src/lib/analyse_audio_job.cc b/src/lib/analyse_audio_job.cc index 588e9fc3d..bcabb6c91 100644 --- a/src/lib/analyse_audio_job.cc +++ b/src/lib/analyse_audio_job.cc @@ -95,8 +95,7 @@ AnalyseAudioJob::audio (shared_ptr<AudioBuffers> b) _current[j][AudioPoint::PEAK] = max (_current[j][AudioPoint::PEAK], fabsf (s)); if ((_done % _samples_per_point) == 0) { - _current[j][AudioPoint::RMS] = 20 * log10 (sqrt (_current[j][AudioPoint::RMS] / _samples_per_point)); - _current[j][AudioPoint::PEAK] = 20 * log10 (_current[j][AudioPoint::PEAK]); + _current[j][AudioPoint::RMS] = sqrt (_current[j][AudioPoint::RMS] / _samples_per_point); _analysis->add_point (j, _current[j]); _current[j] = AudioPoint (); diff --git a/src/lib/audio_analysis.cc b/src/lib/audio_analysis.cc index b29ed1707..0cf08c5bd 100644 --- a/src/lib/audio_analysis.cc +++ b/src/lib/audio_analysis.cc @@ -31,6 +31,8 @@ using std::ofstream; using std::ifstream; using std::vector; using std::cout; +using std::max; +using std::list; AudioPoint::AudioPoint () { @@ -121,3 +123,29 @@ AudioAnalysis::write (string filename) f.close (); boost::filesystem::rename (tmp, filename); } + +float +AudioAnalysis::smooth (list<float> const & data, AudioPoint::Type t) +{ + float val; + + switch (t) { + case AudioPoint::PEAK: + /* XXX: fall-off, or something...? */ + val = -200; + for (list<float>::const_iterator i = data.begin(); i != data.end(); ++i) { + val = max (val, *i); + } + return val; + case AudioPoint::RMS: + val = 0; + for (list<float>::const_iterator i = data.begin(); i != data.end(); ++i) { + val += pow (*i, 2); + } + return sqrt (val / data.size()); + default: + assert (false); + } + + return 0; +} diff --git a/src/lib/audio_analysis.h b/src/lib/audio_analysis.h index c2d8db876..a8cfbdeca 100644 --- a/src/lib/audio_analysis.h +++ b/src/lib/audio_analysis.h @@ -22,6 +22,7 @@ #include <iostream> #include <vector> +#include <list> class AudioPoint { @@ -59,6 +60,7 @@ public: void write (std::string); + static float smooth (std::list<float> const &, AudioPoint::Type); private: std::vector<std::vector<AudioPoint> > _data; |
