diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2011-03-02 12:37:39 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2011-03-02 12:37:39 +0000 |
commit | 3deba1921bcf5bddd8bea9846a203c92b6c9239d (patch) | |
tree | 8b2e00405337396918ff28e282df14e958b84bb9 /libs/qm-dsp/dsp/tonal/TonalEstimator.h | |
parent | fa41cfef580b2c8c04adec5b47d6cfa415ca6251 (diff) |
add queen mary DSP library
git-svn-id: svn://localhost/ardour2/branches/3.0@9029 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/qm-dsp/dsp/tonal/TonalEstimator.h')
-rw-r--r-- | libs/qm-dsp/dsp/tonal/TonalEstimator.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/libs/qm-dsp/dsp/tonal/TonalEstimator.h b/libs/qm-dsp/dsp/tonal/TonalEstimator.h new file mode 100644 index 0000000000..f555ef9e3b --- /dev/null +++ b/libs/qm-dsp/dsp/tonal/TonalEstimator.h @@ -0,0 +1,105 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + QM DSP Library + + Centre for Digital Music, Queen Mary, University of London. + This file copyright 2006 Martin Gasser. + + 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. See the file + COPYING included with this distribution for more information. +*/ + +#ifndef _TONALESTIMATOR_ +#define _TONALESTIMATOR_ + + +#include <valarray> +#include <numeric> +#include <algorithm> +#include <iostream> + +class ChromaVector : public std::valarray<double> +{ +public: + ChromaVector(size_t uSize = 12) : std::valarray<double>() + { resize(uSize, 0.0f); } + + virtual ~ChromaVector() {}; + + void printDebug() + { + for (int i = 0; i < size(); i++) + { + std::cout << (*this)[i] << ";"; + } + + std::cout << std::endl; + } + + void normalizeL1() + { + // normalize the chroma vector (L1 norm) + double dSum = 0.0; + + for (size_t i = 0; i < 12; (dSum += std::abs((*this)[i++]))) ; + for (size_t i = 0; i < 12; dSum > 0.0000001?((*this)[i] /= dSum):(*this)[i]=0.0, i++) ; + + } + + void clear() + { + for (size_t i = 0; i < 12; ++i) (*this)[i] = 0.0; + } + + +}; + +class TCSVector : public std::valarray<double> +{ +public: + TCSVector() : std::valarray<double>() + { resize(6, 0.0f); } + + virtual ~TCSVector() {}; + + void printDebug() + { + for (int i = 0; i < size(); i++) + { + std::cout << (*this)[i] << ";"; + } + + std::cout << std::endl; + } + + double magnitude() const + { + double dMag = 0.0; + + for (size_t i = 0; i < 6; i++) + { + dMag += std::pow((*this)[i], 2.0); + } + + return std::sqrt(dMag); + } + +}; + + + +class TonalEstimator +{ +public: + TonalEstimator(); + virtual ~TonalEstimator(); + TCSVector transform2TCS(const ChromaVector& rVector); +protected: + std::valarray< std::valarray<double> > m_Basis; +}; + +#endif // _TONALESTIMATOR_ |