annotate dsp/keydetection/GetKeyMode.h @ 515:08bcc06c38ec tip master

Remove fast-math
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 28 Jan 2020 15:27:37 +0000
parents 3f0a96460c33
children
rev   line source
cannam@484 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@475 2 /*
cannam@475 3 Copyright (c) 2005 Centre for Digital Music ( C4DM )
cannam@475 4 Queen Mary Univesrity of London
cannam@475 5
cannam@475 6 This program is free software; you can redistribute it and/or
cannam@475 7 modify it under the terms of the GNU General Public License as
cannam@475 8 published by the Free Software Foundation; either version 2 of the
cannam@475 9 License, or (at your option) any later version. See the file
cannam@475 10 COPYING included with this distribution for more information.
cannam@475 11 */
cannam@475 12
cannam@489 13 #ifndef QM_DSP_GETKEYMODE_H
cannam@489 14 #define QM_DSP_GETKEYMODE_H
cannam@475 15
cannam@509 16 class Decimator;
cannam@509 17 class Chromagram;
cannam@475 18
cannam@475 19 class GetKeyMode
cannam@475 20 {
cannam@475 21 public:
cannam@509 22 struct Config {
cannam@509 23 double sampleRate;
cannam@509 24 float tuningFrequency;
cannam@509 25 double hpcpAverage;
cannam@509 26 double medianAverage;
cannam@509 27 int frameOverlapFactor; // 1 = none (default, fast, but means
cannam@509 28 // we skip a fair bit of input data);
cannam@509 29 // 8 = normal chroma overlap
cannam@509 30 int decimationFactor;
cannam@509 31
cannam@509 32 Config(double _sampleRate, float _tuningFrequency) :
cannam@509 33 sampleRate(_sampleRate),
cannam@509 34 tuningFrequency(_tuningFrequency),
cannam@509 35 hpcpAverage(10),
cannam@509 36 medianAverage(10),
cannam@509 37 frameOverlapFactor(1),
cannam@509 38 decimationFactor(8) {
cannam@509 39 }
cannam@509 40 };
cannam@509 41
cannam@509 42 GetKeyMode(Config config);
cannam@475 43
cannam@478 44 virtual ~GetKeyMode();
cannam@475 45
cannam@509 46 /**
cannam@509 47 * Process a single time-domain input sample frame of length
cannam@509 48 * getBlockSize(). Successive calls should provide overlapped data
cannam@509 49 * with an advance of getHopSize() between frames.
cannam@509 50 *
cannam@509 51 * Return a key index in the range 0-24, where 0 indicates no key
cannam@509 52 * detected, 1 is C major, and 13 is C minor.
cannam@509 53 */
cannam@509 54 int process(double *pcmData);
cannam@475 55
cannam@509 56 /**
cannam@509 57 * Return a pointer to an internal 24-element array containing the
cannam@509 58 * correlation of the chroma vector generated in the last
cannam@509 59 * process() call against the stored key profiles for the 12 major
cannam@509 60 * and 12 minor keys, where index 0 is C major and 12 is C minor.
cannam@509 61 */
cannam@509 62 double *getKeyStrengths();
cannam@475 63
cannam@509 64 int getBlockSize() {
cannam@509 65 return m_chromaFrameSize * m_decimationFactor;
cannam@509 66 }
cannam@509 67 int getHopSize() {
cannam@509 68 return m_chromaHopSize * m_decimationFactor;
cannam@509 69 }
cannam@475 70
cannam@475 71 protected:
cannam@509 72 double krumCorr(const double *pDataNorm, const double *pProfileNorm,
cannam@509 73 int shiftProfile, int length);
cannam@475 74
cannam@478 75 double m_hpcpAverage;
cannam@478 76 double m_medianAverage;
cannam@499 77 int m_decimationFactor;
cannam@475 78
cannam@499 79 // Decimator (fixed)
cannam@499 80 Decimator* m_decimator;
cannam@475 81
cannam@499 82 // Chromagram object
cannam@499 83 Chromagram* m_chroma;
cannam@475 84
cannam@499 85 // Chromagram output pointer
cannam@499 86 double* m_chrPointer;
cannam@475 87
cannam@499 88 // Framesize
cannam@499 89 int m_chromaFrameSize;
cannam@475 90
cannam@499 91 // Hop
cannam@499 92 int m_chromaHopSize;
cannam@475 93
cannam@499 94 int m_chromaBufferSize;
cannam@499 95 int m_medianWinSize;
cannam@478 96
cannam@499 97 int m_bufferIndex;
cannam@499 98 int m_chromaBufferFilling;
cannam@499 99 int m_medianBufferFilling;
cannam@475 100
cannam@499 101 double* m_decimatedBuffer;
cannam@499 102 double* m_chromaBuffer;
cannam@499 103 double* m_meanHPCP;
cannam@475 104
cannam@499 105 double* m_majProfileNorm;
cannam@499 106 double* m_minProfileNorm;
cannam@499 107 double* m_majCorr;
cannam@499 108 double* m_minCorr;
cannam@499 109 int* m_medianFilterBuffer;
cannam@499 110 int* m_sortedBuffer;
cannam@475 111
cannam@478 112 double *m_keyStrengths;
cannam@475 113 };
cannam@475 114
cannam@499 115 #endif // !defined QM_DSP_GETKEYMODE_H