annotate constant-q-cpp/cq/CQSpectrogram.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 CQSPECTROGRAM_H
Chris@366 33 #define CQSPECTROGRAM_H
Chris@366 34
Chris@366 35 #include "ConstantQ.h"
Chris@366 36
Chris@366 37 /**
Chris@366 38 * Calculate a dense constant-Q magnitude spectrogram from time-domain
Chris@366 39 * input. The input of each \ref process call is a single frame of
Chris@366 40 * time-domain samples; the output is a series of fixed-height
Chris@366 41 * columns. See \ref process for details.
Chris@366 42 *
Chris@366 43 * If you need the full complex-valued constant-Q output, you must use
Chris@366 44 * the \ref ConstantQ class instead.
Chris@366 45 */
Chris@366 46 class CQSpectrogram : public CQBase
Chris@366 47 {
Chris@366 48 public:
Chris@366 49 enum Interpolation {
Chris@366 50 /// leave empty cells as zero
Chris@366 51 InterpolateZeros,
Chris@366 52 /// replace empty cells with a repeat of the previous column
Chris@366 53 InterpolateHold,
Chris@366 54 /// perform linear interpolation between consecutive time cells
Chris@366 55 InterpolateLinear,
Chris@366 56 };
Chris@366 57
Chris@366 58 /**
Chris@366 59 * Construct a Constant-Q magnitude spectrogram object using the
Chris@366 60 * given transform parameters.
Chris@366 61 */
Chris@366 62 CQSpectrogram(CQParameters params, Interpolation interpolation);
Chris@366 63 virtual ~CQSpectrogram();
Chris@366 64
Chris@366 65 // CQBase methods, see CQBase.h for documentation
Chris@366 66 virtual bool isValid() const { return m_cq.isValid(); }
Chris@366 67 virtual double getSampleRate() const { return m_cq.getSampleRate(); }
Chris@366 68 virtual int getBinsPerOctave() const { return m_cq.getBinsPerOctave(); }
Chris@366 69 virtual int getOctaves() const { return m_cq.getOctaves(); }
Chris@366 70 virtual int getTotalBins() const { return m_cq.getTotalBins(); }
Chris@366 71 virtual int getColumnHop() const { return m_cq.getColumnHop(); }
Chris@366 72 virtual int getLatency() const { return m_cq.getLatency(); }
Chris@366 73 virtual double getMaxFrequency() const { return m_cq.getMaxFrequency(); }
Chris@366 74 virtual double getMinFrequency() const { return m_cq.getMinFrequency(); }
Chris@366 75 virtual double getBinFrequency(double bin) const { return m_cq.getBinFrequency(bin); }
Chris@366 76
Chris@366 77 /**
Chris@366 78 * Given a series of time-domain samples, return a series of
Chris@366 79 * constant-Q magnitude columns. Any samples left over (that did
Chris@366 80 * not fit into a constant-Q processing block) are saved for the
Chris@366 81 * next call to process or getRemainingBlocks.
Chris@366 82 *
Chris@366 83 * The input is assumed to be a single frame of time-domain sample
Chris@366 84 * values, such that consecutive calls to \ref process receive
Chris@366 85 * contiguous frames from the source signal. Each frame may be of
Chris@366 86 * any length in samples.
Chris@366 87 *
Chris@366 88 * Each output column contains a series of constant-Q bin value
Chris@366 89 * magnitudes, ordered from highest to lowest frequency.
Chris@366 90 *
Chris@366 91 * The columns are all of the same height, but they might not all
Chris@366 92 * be populated, depending on the interpolation mode: in
Chris@366 93 * InterpolateZeros mode, the lower octaves (which are spaced more
Chris@366 94 * widely in the raw constant-Q than the highest octave) will
Chris@366 95 * contain zeros for the undefined values, but in the other
Chris@366 96 * interpolation modes every cell will be filled.
Chris@366 97 *
Chris@366 98 * To obtain raw, complex constant-Q bin values, use the ConstantQ
Chris@366 99 * class.
Chris@366 100 */
Chris@366 101 RealBlock process(const RealSequence &);
Chris@366 102
Chris@366 103 /**
Chris@366 104 * Return the remaining constant-Q magnitude columns following the
Chris@366 105 * end of processing. Any buffered input is padded so as to ensure
Chris@366 106 * that all input provided to process() will have been returned.
Chris@366 107 */
Chris@366 108 RealBlock getRemainingOutput();
Chris@366 109
Chris@366 110 private:
Chris@366 111 ConstantQ m_cq;
Chris@366 112 Interpolation m_interpolation;
Chris@366 113
Chris@366 114 RealBlock m_buffer;
Chris@366 115 RealBlock postProcess(const ComplexBlock &, bool insist);
Chris@366 116 RealBlock fetchHold(bool insist);
Chris@366 117 RealBlock fetchLinear(bool insist);
Chris@366 118 RealBlock linearInterpolated(const RealBlock &, int, int);
Chris@366 119 RealColumn m_prevColumn;
Chris@366 120 };
Chris@366 121
Chris@366 122 #endif