annotate constant-q-cpp/cq/ConstantQ.h @ 372:af71cbdab621 tip

Update bqvec code
author Chris Cannam
date Tue, 19 Nov 2019 10:13:32 +0000
parents 5d0a2ebb4d17
children
rev   line source
Chris@366 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@366 2 /*
Chris@366 3 Constant-Q library
Chris@366 4 Copyright (c) 2013-2014 Queen Mary, University of London
Chris@366 5
Chris@366 6 Permission is hereby granted, free of charge, to any person
Chris@366 7 obtaining a copy of this software and associated documentation
Chris@366 8 files (the "Software"), to deal in the Software without
Chris@366 9 restriction, including without limitation the rights to use, copy,
Chris@366 10 modify, merge, publish, distribute, sublicense, and/or sell copies
Chris@366 11 of the Software, and to permit persons to whom the Software is
Chris@366 12 furnished to do so, subject to the following conditions:
Chris@366 13
Chris@366 14 The above copyright notice and this permission notice shall be
Chris@366 15 included in all copies or substantial portions of the Software.
Chris@366 16
Chris@366 17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Chris@366 18 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Chris@366 19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Chris@366 20 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
Chris@366 21 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Chris@366 22 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Chris@366 23 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Chris@366 24
Chris@366 25 Except as contained in this notice, the names of the Centre for
Chris@366 26 Digital Music; Queen Mary, University of London; and Chris Cannam
Chris@366 27 shall not be used in advertising or otherwise to promote the sale,
Chris@366 28 use or other dealings in this Software without prior written
Chris@366 29 authorization.
Chris@366 30 */
Chris@366 31
Chris@366 32 #ifndef CONSTANTQ_H
Chris@366 33 #define CONSTANTQ_H
Chris@366 34
Chris@366 35 #include "CQBase.h"
Chris@366 36 #include "CQParameters.h"
Chris@366 37 #include "CQKernel.h"
Chris@366 38
Chris@366 39 class Resampler;
Chris@366 40 class FFTReal;
Chris@366 41
Chris@366 42 /**
Chris@366 43 * Calculate a complex sparse constant-Q representation from
Chris@366 44 * time-domain input. The input of each \ref process call is a single
Chris@366 45 * frame of time-domain samples; the output is a series of columns of
Chris@366 46 * varying height. See \ref process for details.
Chris@366 47 *
Chris@366 48 * For a real (magnitude-only) interpolated dense representation, see
Chris@366 49 * CQSpectrogram.
Chris@366 50 */
Chris@366 51 class ConstantQ : public CQBase
Chris@366 52 {
Chris@366 53 public:
Chris@366 54 /**
Chris@366 55 * Construct a complex Constant-Q transform object using the given
Chris@366 56 * transform parameters.
Chris@366 57 */
Chris@366 58 ConstantQ(CQParameters params);
Chris@366 59 virtual ~ConstantQ();
Chris@366 60
Chris@366 61 // CQBase methods, see CQBase.h for documentation
Chris@366 62 virtual bool isValid() const { return m_kernel && m_kernel->isValid(); }
Chris@366 63 virtual double getSampleRate() const { return m_sampleRate; }
Chris@366 64 virtual int getBinsPerOctave() const { return m_binsPerOctave; }
Chris@366 65 virtual int getOctaves() const { return m_octaves; }
Chris@366 66 virtual int getTotalBins() const { return m_octaves * m_binsPerOctave; }
Chris@366 67 virtual int getColumnHop() const { return m_p.fftHop / m_p.atomsPerFrame; }
Chris@366 68 virtual int getLatency() const { return m_outputLatency; }
Chris@366 69 virtual double getMaxFrequency() const { return m_p.maxFrequency; }
Chris@366 70 virtual double getMinFrequency() const;
Chris@366 71 virtual double getBinFrequency(double bin) const; // bin may be nonintegral
Chris@366 72
Chris@366 73 /**
Chris@366 74 * Given a series of time-domain samples, return a series of
Chris@366 75 * constant-Q columns. Any samples left over (that did not fit
Chris@366 76 * into a constant-Q processing block) are saved for the next call
Chris@366 77 * to process or getRemainingBlocks.
Chris@366 78 *
Chris@366 79 * The input is assumed to be a single frame of time-domain sample
Chris@366 80 * values, such that consecutive calls to \ref process receive
Chris@366 81 * contiguous frames from the source signal. Each frame may be of
Chris@366 82 * any length in samples.
Chris@366 83 *
Chris@366 84 * Each output column contains a series of constant-Q bin values
Chris@366 85 * ordered from highest to lowest frequency.
Chris@366 86 *
Chris@366 87 * Output columns are of varying height: each will contain at
Chris@366 88 * least getBinsPerOctave() values, because the highest-frequency
Chris@366 89 * octave is always present, but a second octave (if requested)
Chris@366 90 * will appear only in alternate columns, a third octave only in
Chris@366 91 * every fourth column, and so on.
Chris@366 92 *
Chris@366 93 * If you need a format in which all columns are of equal height
Chris@366 94 * and every bin contains a value, use \ref CQSpectrogram instead
Chris@366 95 * of ConstantQ.
Chris@366 96 */
Chris@366 97 ComplexBlock process(const RealSequence &);
Chris@366 98
Chris@366 99 /**
Chris@366 100 * Return the remaining constant-Q columns following the end of
Chris@366 101 * processing. Any buffered input is padded so as to ensure that
Chris@366 102 * all input provided to process() will have been returned.
Chris@366 103 */
Chris@366 104 ComplexBlock getRemainingOutput();
Chris@366 105
Chris@366 106 private:
Chris@366 107 const CQParameters m_inparams;
Chris@366 108 const double m_sampleRate;
Chris@366 109 const double m_maxFrequency;
Chris@366 110 const double m_minFrequency;
Chris@366 111 const int m_binsPerOctave;
Chris@366 112
Chris@366 113 int m_octaves;
Chris@366 114 CQKernel *m_kernel;
Chris@366 115 CQKernel::Properties m_p;
Chris@366 116 int m_bigBlockSize;
Chris@366 117
Chris@366 118 std::vector<Resampler *> m_decimators;
Chris@366 119 std::vector<RealSequence> m_buffers;
Chris@366 120
Chris@366 121 int m_outputLatency;
Chris@366 122
Chris@366 123 FFTReal *m_fft;
Chris@366 124
Chris@366 125 void initialise();
Chris@366 126 ComplexBlock processOctaveBlock(int octave);
Chris@366 127 };
Chris@366 128
Chris@366 129 #endif
Chris@366 130