annotate src/EM.h @ 167:416b555df3b2 finetune

More on returning fine tuning (but we're treating different shifts of the same pitch as different notes at the moment which is not right)
author Chris Cannam
date Tue, 20 May 2014 17:49:07 +0100
parents 7979fa40c9f7
children 237d41a0f69d
rev   line source
Chris@34 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@34 2
Chris@34 3 /*
Chris@34 4 Silvet
Chris@34 5
Chris@34 6 A Vamp plugin for note transcription.
Chris@34 7 Centre for Digital Music, Queen Mary University of London.
Chris@34 8
Chris@34 9 This program is free software; you can redistribute it and/or
Chris@34 10 modify it under the terms of the GNU General Public License as
Chris@34 11 published by the Free Software Foundation; either version 2 of the
Chris@34 12 License, or (at your option) any later version. See the file
Chris@34 13 COPYING included with this distribution for more information.
Chris@34 14 */
Chris@34 15
Chris@34 16 #ifndef SILVET_EM_H
Chris@34 17 #define SILVET_EM_H
Chris@34 18
Chris@34 19 #include <vector>
Chris@34 20
Chris@161 21 class InstrumentPack;
Chris@161 22
Chris@34 23 class EM
Chris@34 24 {
Chris@34 25 public:
Chris@161 26 EM(const InstrumentPack *pack, bool useShifts); // pack must outlive me
Chris@34 27 ~EM();
Chris@34 28
Chris@125 29 int getBinCount() const { return m_binCount; }
Chris@125 30 int getNoteCount() const { return m_noteCount; }
Chris@91 31 int getSourceCount() const { return m_sourceCount; }
Chris@166 32 int getShiftCount() const { return m_shiftCount; }
Chris@34 33
Chris@125 34 /**
Chris@125 35 * Carry out one iteration using the given column as input. The
Chris@125 36 * column must have getBinCount() values.
Chris@125 37 */
Chris@92 38 void iterate(const double *column);
Chris@91 39
Chris@125 40 /**
Chris@125 41 * Return the estimated distribution after the current iteration.
Chris@125 42 * Like the input, this will have getBinCount() values.
Chris@125 43 */
Chris@151 44 const float *getEstimate() const {
Chris@38 45 return m_estimate;
Chris@38 46 }
Chris@125 47
Chris@125 48 /**
Chris@125 49 * Return the pitch distribution for the current estimate. The
Chris@125 50 * returned array has getNoteCount() values.
Chris@125 51 */
Chris@151 52 const float *getPitchDistribution() const {
Chris@38 53 return m_pitches;
Chris@38 54 }
Chris@125 55
Chris@125 56 /**
Chris@125 57 * Return the source distribution for the current estimate. The
Chris@125 58 * returned pointer refers to getSourceCount() arrays of
Chris@125 59 * getNoteCount() values.
Chris@125 60 */
Chris@151 61 const float *const *getSources() const {
Chris@38 62 return m_sources;
Chris@38 63 }
Chris@166 64
Chris@166 65 /**
Chris@166 66 * Return the shift distribution for the current estimate. The
Chris@166 67 * returned pointer refers to getShiftCount() arrays of
Chris@166 68 * getNoteCount() values.
Chris@166 69 */
Chris@166 70 const float *const *getShifts() const {
Chris@166 71 return m_shifts;
Chris@166 72 }
Chris@38 73
Chris@34 74 private:
Chris@161 75 const InstrumentPack *m_pack;
Chris@161 76
Chris@151 77 float *m_pitches;
Chris@151 78 float **m_shifts;
Chris@151 79 float **m_sources;
Chris@55 80
Chris@151 81 float *m_updatePitches;
Chris@151 82 float **m_updateShifts;
Chris@151 83 float **m_updateSources;
Chris@34 84
Chris@151 85 float *m_estimate;
Chris@151 86 float *m_q;
Chris@55 87
Chris@83 88 const int m_noteCount;
Chris@83 89 const int m_shiftCount; // 1 + 2 * max template shift
Chris@83 90 const int m_binCount;
Chris@91 91 const int m_sourceCount;
Chris@55 92
Chris@151 93 const float m_pitchSparsity;
Chris@151 94 const float m_sourceSparsity;
Chris@36 95
Chris@83 96 const int m_lowestPitch;
Chris@83 97 const int m_highestPitch;
Chris@35 98
Chris@151 99 void normaliseColumn(float *column, int size);
Chris@151 100 void normaliseGrid(float **grid, int size1, int size2);
Chris@35 101
Chris@151 102 void expectation(const float *column); // size is m_binCount
Chris@151 103 void maximisation(const float *column); // size is m_binCount
Chris@36 104
Chris@151 105 const float *templateFor(int instrument, int note, int shift);
Chris@45 106 void rangeFor(int instrument, int &minPitch, int &maxPitch);
Chris@45 107 bool inRange(int instrument, int pitch);
Chris@34 108 };
Chris@34 109
Chris@34 110 #endif