Mercurial > hg > qm-dsp
annotate dsp/tonal/TonalEstimator.cpp @ 30:a251fb0de594
* Make MFCC able to accept already-FFT'd input, and simplify API a bit
* Add log power value to MFCC, restore windowing, and avoid some heap allocs
* In HMM, bail out of iteration if loglik hits NaN
author | cannam |
---|---|
date | Fri, 18 Jan 2008 13:24:12 +0000 |
parents | d7116e3183f8 |
children | e5907ae6de17 |
rev | line source |
---|---|
cannam@0 | 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ |
cannam@0 | 2 |
cannam@0 | 3 /* |
cannam@0 | 4 QM DSP Library |
cannam@0 | 5 |
cannam@0 | 6 Centre for Digital Music, Queen Mary, University of London. |
cannam@0 | 7 This file copyright 2006 Martin Gasser. |
cannam@0 | 8 All rights reserved. |
cannam@0 | 9 */ |
cannam@0 | 10 |
cannam@0 | 11 #include "TonalEstimator.h" |
cannam@0 | 12 |
cannam@0 | 13 #include <cmath> |
cannam@0 | 14 #include <iostream> |
cannam@0 | 15 |
cannam@0 | 16 #ifndef PI |
cannam@0 | 17 #define PI (3.14159265358979232846) |
cannam@0 | 18 #endif |
cannam@0 | 19 |
cannam@0 | 20 TonalEstimator::TonalEstimator() |
cannam@0 | 21 { |
cannam@0 | 22 m_Basis.resize(6); |
cannam@0 | 23 |
cannam@0 | 24 int i = 0; |
cannam@0 | 25 |
cannam@0 | 26 |
cannam@0 | 27 // circle of fifths |
cannam@0 | 28 m_Basis[i].resize(12); |
cannam@0 | 29 for (int iP = 0; iP < 12; iP++) |
cannam@0 | 30 { |
cannam@0 | 31 m_Basis[i][iP] = std::sin( (7.0 / 6.0) * iP * PI); |
cannam@0 | 32 } |
cannam@0 | 33 |
cannam@0 | 34 i++; |
cannam@0 | 35 |
cannam@0 | 36 m_Basis[i].resize(12); |
cannam@0 | 37 for (int iP = 0; iP < 12; iP++) |
cannam@0 | 38 { |
cannam@0 | 39 m_Basis[i][iP] = std::cos( (7.0 / 6.0) * iP * PI); |
cannam@0 | 40 } |
cannam@0 | 41 |
cannam@0 | 42 i++; |
cannam@0 | 43 |
cannam@0 | 44 |
cannam@0 | 45 // circle of major thirds |
cannam@0 | 46 m_Basis[i].resize(12); |
cannam@0 | 47 for (int iP = 0; iP < 12; iP++) |
cannam@0 | 48 { |
cannam@0 | 49 m_Basis[i][iP] = 0.6 * std::sin( (2.0 / 3.0) * iP * PI); |
cannam@0 | 50 } |
cannam@0 | 51 |
cannam@0 | 52 i++; |
cannam@0 | 53 |
cannam@0 | 54 m_Basis[i].resize(12); |
cannam@0 | 55 for (int iP = 0; iP < 12; iP++) |
cannam@0 | 56 { |
cannam@0 | 57 m_Basis[i][iP] = 0.6 * std::cos( (2.0 / 3.0) * iP * PI); |
cannam@0 | 58 } |
cannam@0 | 59 |
cannam@0 | 60 i++; |
cannam@0 | 61 |
cannam@0 | 62 |
cannam@0 | 63 // circle of minor thirds |
cannam@0 | 64 m_Basis[i].resize(12); |
cannam@0 | 65 for (int iP = 0; iP < 12; iP++) |
cannam@0 | 66 { |
cannam@0 | 67 m_Basis[i][iP] = 1.1 * std::sin( (3.0 / 2.0) * iP * PI); |
cannam@0 | 68 } |
cannam@0 | 69 |
cannam@0 | 70 i++; |
cannam@0 | 71 |
cannam@0 | 72 m_Basis[i].resize(12); |
cannam@0 | 73 for (int iP = 0; iP < 12; iP++) |
cannam@0 | 74 { |
cannam@0 | 75 m_Basis[i][iP] = 1.1 * std::cos( (3.0 / 2.0) * iP * PI); |
cannam@0 | 76 } |
cannam@0 | 77 |
cannam@0 | 78 } |
cannam@0 | 79 |
cannam@0 | 80 TonalEstimator::~TonalEstimator() |
cannam@0 | 81 { |
cannam@0 | 82 } |
cannam@0 | 83 |
cannam@0 | 84 TCSVector TonalEstimator::transform2TCS(const ChromaVector& rVector) |
cannam@0 | 85 { |
cannam@0 | 86 TCSVector vaRetVal; |
cannam@0 | 87 vaRetVal.resize(6, 0.0); |
cannam@0 | 88 |
cannam@0 | 89 for (int i = 0; i < 6; i++) |
cannam@0 | 90 { |
cannam@0 | 91 for (int iP = 0; iP < 12; iP++) |
cannam@0 | 92 { |
cannam@0 | 93 vaRetVal[i] += m_Basis[i][iP] * rVector[iP]; |
cannam@0 | 94 } |
cannam@0 | 95 } |
cannam@0 | 96 |
cannam@0 | 97 return vaRetVal; |
cannam@0 | 98 } |