annotate src/FeatureConditioner.cpp @ 146:214b72d55796 noise

Update unit tests
author Chris Cannam
date Fri, 16 Jan 2015 16:48:55 +0000
parents cfba9aec7569
children d1bc89794cd4
rev   line source
Chris@103 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@103 2
Chris@103 3 /*
Chris@103 4 Vamp feature extraction plugin using the MATCH audio alignment
Chris@103 5 algorithm.
Chris@103 6
Chris@103 7 Centre for Digital Music, Queen Mary, University of London.
Chris@103 8
Chris@103 9 This program is free software; you can redistribute it and/or
Chris@103 10 modify it under the terms of the GNU General Public License as
Chris@103 11 published by the Free Software Foundation; either version 2 of the
Chris@103 12 License, or (at your option) any later version. See the file
Chris@103 13 COPYING included with this distribution for more information.
Chris@103 14 */
Chris@103 15
Chris@103 16 #include "FeatureConditioner.h"
Chris@103 17
Chris@103 18 #include <iostream>
Chris@130 19 #include <cmath>
Chris@103 20
Chris@103 21 using namespace std;
Chris@103 22
Chris@140 23 //#define DEBUG_FEATURE_CONDITIONER 1
Chris@140 24
Chris@140 25 FeatureConditioner::FeatureConditioner(Parameters parameters) :
Chris@140 26 m_params(parameters),
Chris@140 27 m_ltAverage(0.0)
Chris@140 28 {
Chris@140 29 #ifdef DEBUG_FEATURE_CONDITIONER
Chris@140 30 cerr << "*** FeatureConditioner: norm = " << parameters.norm
Chris@140 31 << ", order = " << parameters.order
Chris@140 32 << ", silenceThreshold = " << parameters.silenceThreshold
Chris@140 33 << ", decay = " << parameters.decay << endl;
Chris@140 34 #endif
Chris@140 35 }
Chris@140 36
Chris@103 37 vector<double>
Chris@103 38 FeatureConditioner::process(const vector<double> &feature)
Chris@103 39 {
Chris@103 40 if (m_prev.empty()) {
Chris@103 41 m_prev.resize(feature.size(), 0.0);
Chris@103 42 }
Chris@103 43 if (m_prev.size() != feature.size()) {
Chris@103 44 cerr << "ERROR: FeatureConditioner::process: feature size "
Chris@103 45 << feature.size() << " differs from previous feature size "
Chris@103 46 << m_prev.size() << endl;
Chris@103 47 return feature;
Chris@103 48 }
Chris@103 49
Chris@103 50 int size = feature.size();
Chris@103 51
Chris@103 52 vector<double> out(size, 0.0);
Chris@103 53
Chris@103 54 double totalEnergy = 0;
Chris@116 55
Chris@116 56 switch (m_params.order) {
Chris@116 57
Chris@116 58 case OutputRectifiedDerivative:
Chris@103 59 for (int i = 0; i < size; i++) {
Chris@103 60 totalEnergy += feature[i];
Chris@103 61 if (feature[i] > m_prev[i]) {
Chris@103 62 out[i] = feature[i] - m_prev[i];
Chris@103 63 } else {
Chris@103 64 out[i] = 0;
Chris@103 65 }
Chris@103 66 }
Chris@116 67 break;
Chris@116 68
Chris@116 69 case OutputDerivative:
Chris@103 70 for (int i = 0; i < size; i++) {
Chris@116 71 totalEnergy += feature[i];
Chris@130 72 out[i] = fabs(feature[i] - m_prev[i]);
Chris@116 73 }
Chris@116 74 break;
Chris@116 75
Chris@116 76 case OutputFeatures:
Chris@116 77 for (int i = 0; i < size; i++) {
Chris@116 78 totalEnergy += feature[i];
Chris@103 79 out[i] = feature[i];
Chris@103 80 }
Chris@116 81 break;
Chris@103 82 }
Chris@103 83
Chris@139 84 if (m_ltAverage == 0.0) {
Chris@103 85 m_ltAverage = totalEnergy;
Chris@103 86 } else {
Chris@103 87 double decay = m_params.decay;
Chris@103 88 m_ltAverage = m_ltAverage * decay + totalEnergy * (1.0 - decay);
Chris@103 89 }
Chris@103 90
Chris@103 91 if (totalEnergy <= m_params.silenceThreshold) {
Chris@103 92 for (int i = 0; i < size; i++) {
Chris@103 93 out[i] = 0;
Chris@103 94 }
Chris@103 95 } else if (m_params.norm == NormaliseToSum1) {
Chris@103 96 for (int i = 0; i < size; i++) {
Chris@103 97 out[i] /= totalEnergy;
Chris@103 98 }
Chris@103 99 } else if (m_params.norm == NormaliseToLTAverage) {
Chris@103 100 for (int i = 0; i < size; i++) {
Chris@103 101 out[i] /= m_ltAverage;
Chris@103 102 }
Chris@103 103 }
Chris@103 104
Chris@103 105 m_prev = feature;
Chris@103 106 return out;
Chris@103 107 }
Chris@103 108