annotate dsp/chromagram/Chromagram.h @ 467:1db23b9a8da4

Fix mismatch between time- and frequency-domain versions of the chromagram process method - the frequency-domain one expects fftshifted input and the kernel is set up for that, but the time-domain one wasn't doing it
author Chris Cannam <cannam@all-day-breakfast.com>
date Wed, 29 May 2019 15:56:30 +0100
parents 50a97c8d52ed
children fdaa63607c15
rev   line source
c@225 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
c@225 2
c@225 3 /*
c@225 4 QM DSP Library
c@225 5
c@225 6 Centre for Digital Music, Queen Mary, University of London.
c@309 7 This file 2005-2006 Christian Landone.
c@309 8
c@309 9 This program is free software; you can redistribute it and/or
c@309 10 modify it under the terms of the GNU General Public License as
c@309 11 published by the Free Software Foundation; either version 2 of the
c@309 12 License, or (at your option) any later version. See the file
c@309 13 COPYING included with this distribution for more information.
c@225 14 */
c@225 15
c@225 16 #ifndef CHROMAGRAM_H
c@225 17 #define CHROMAGRAM_H
c@225 18
c@225 19 #include "dsp/transforms/FFT.h"
c@257 20 #include "base/Window.h"
c@225 21 #include "ConstantQ.h"
c@225 22
cannam@465 23 struct ChromaConfig {
cannam@465 24 double FS;
c@225 25 double min;
c@225 26 double max;
c@414 27 int BPO;
c@225 28 double CQThresh;
c@259 29 MathUtilities::NormaliseType normalise;
c@225 30 };
c@225 31
c@225 32 class Chromagram
c@225 33 {
c@225 34
c@225 35 public:
c@225 36 Chromagram( ChromaConfig Config );
c@225 37 ~Chromagram();
cannam@467 38
cannam@467 39 /**
cannam@467 40 * Process a time-domain input signal of length equal to
cannam@467 41 * getFrameSize().
cannam@467 42 *
cannam@467 43 * The returned buffer contains the chromagram values indexed by
cannam@467 44 * bin, with the number of values corresponding to the BPO field
cannam@467 45 * in the ChromaConfig supplied at construction. It is owned by
cannam@467 46 * the Chromagram object and is reused from one process call to
cannam@467 47 * the next.
cannam@467 48 */
cannam@467 49 double *process(const double *data);
cannam@467 50
cannam@467 51 /**
cannam@467 52 * Process a frequency-domain input signal generated from a
cannam@467 53 * time-domain signal of length equal to getFrameSize() that has
cannam@467 54 * been windowed and "fftshifted" to place the zero index in the
cannam@467 55 * centre of the frame. The real and imag buffers must each
cannam@467 56 * contain the full getFrameSize() frequency bins.
cannam@467 57 *
cannam@467 58 * The returned buffer contains the chromagram values indexed by
cannam@467 59 * bin, with the number of values corresponding to the BPO field
cannam@467 60 * in the ChromaConfig supplied at construction. It is owned by
cannam@467 61 * the Chromagram object and is reused from one process call to
cannam@467 62 * the next.
cannam@467 63 */
cannam@467 64 double *process(const double *real, const double *imag);
cannam@467 65
cannam@467 66 void unityNormalise(double* src);
c@225 67
c@225 68 // Complex arithmetic
c@225 69 double kabs( double real, double imag );
c@225 70
c@225 71 // Results
c@414 72 int getK() { return m_uK;}
c@414 73 int getFrameSize() { return m_frameSize; }
c@414 74 int getHopSize() { return m_hopSize; }
c@414 75
c@225 76 private:
c@225 77 int initialise( ChromaConfig Config );
c@225 78 int deInitialise();
c@257 79
c@257 80 Window<double> *m_window;
c@257 81 double *m_windowbuf;
c@225 82
c@225 83 double* m_chromadata;
c@225 84 double m_FMin;
c@225 85 double m_FMax;
c@414 86 int m_BPO;
c@414 87 int m_uK;
c@225 88
c@259 89 MathUtilities::NormaliseType m_normalise;
c@225 90
c@414 91 int m_frameSize;
c@414 92 int m_hopSize;
c@225 93
c@289 94 FFTReal* m_FFT;
c@225 95 ConstantQ* m_ConstantQ;
c@225 96
c@225 97 double* m_FFTRe;
c@225 98 double* m_FFTIm;
c@225 99 double* m_CQRe;
c@225 100 double* m_CQIm;
c@225 101
c@276 102 bool m_skGenerated;
c@225 103 };
c@225 104
c@225 105 #endif