annotate constant-q-cpp/cq/CQInverse.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 CQINVERSE_H
Chris@366 33 #define CQINVERSE_H
Chris@366 34
Chris@366 35 #include "CQBase.h"
Chris@366 36 #include "CQKernel.h"
Chris@366 37
Chris@366 38 class Resampler;
Chris@366 39 class FFTReal;
Chris@366 40
Chris@366 41 /**
Chris@366 42 * Calculate an inverse constant-Q transform. The input must be the
Chris@366 43 * same representation as returned as output of a \ref ConstantQ
Chris@366 44 * object with the same parameters. The output is a time-domain
Chris@366 45 * signal.
Chris@366 46 *
Chris@366 47 * Note that you cannot perform an inverse transform from the
Chris@366 48 * magnitude-only output of \ref CQSpectrogram; you need the complex
Chris@366 49 * valued data from \ref ConstantQ.
Chris@366 50 *
Chris@366 51 * Our implementation of the Constant-Q transform is not exactly
Chris@366 52 * invertible, and this produces only an approximation of the original
Chris@366 53 * signal (see publications for details).
Chris@366 54 */
Chris@366 55 class CQInverse : public CQBase
Chris@366 56 {
Chris@366 57 public:
Chris@366 58 /**
Chris@366 59 * Construct an inverse Constant-Q transform object using the
Chris@366 60 * given transform parameters.
Chris@366 61 */
Chris@366 62 CQInverse(CQParameters params);
Chris@366 63 virtual ~CQInverse();
Chris@366 64
Chris@366 65 // CQBase methods, see CQBase.h for documentation
Chris@366 66 virtual bool isValid() const { return m_kernel && m_kernel->isValid(); }
Chris@366 67 virtual double getSampleRate() const { return m_sampleRate; }
Chris@366 68 virtual int getBinsPerOctave() const { return m_binsPerOctave; }
Chris@366 69 virtual int getOctaves() const { return m_octaves; }
Chris@366 70 virtual int getTotalBins() const { return m_octaves * m_binsPerOctave; }
Chris@366 71 virtual int getColumnHop() const { return m_p.fftHop / m_p.atomsPerFrame; }
Chris@366 72 virtual int getLatency() const { return m_outputLatency; }
Chris@366 73 virtual double getMaxFrequency() const { return m_p.maxFrequency; }
Chris@366 74 virtual double getMinFrequency() const; // actual min, not that passed to ctor
Chris@366 75 virtual double getBinFrequency(double bin) const;
Chris@366 76
Chris@366 77 /**
Chris@366 78 * Given a series of constant-Q columns in the form produced by
Chris@366 79 * the \ref ConstantQ class, return a series of time-domain
Chris@366 80 * samples resulting from approximately inverting the constant-Q
Chris@366 81 * transform.
Chris@366 82 */
Chris@366 83 RealSequence process(const ComplexBlock &);
Chris@366 84
Chris@366 85 /**
Chris@366 86 * Return the remaining time-domain samples following the end of
Chris@366 87 * processing.
Chris@366 88 */
Chris@366 89 RealSequence getRemainingOutput();
Chris@366 90
Chris@366 91 private:
Chris@366 92 const CQParameters m_inparams;
Chris@366 93 const double m_sampleRate;
Chris@366 94 const double m_maxFrequency;
Chris@366 95 const double m_minFrequency;
Chris@366 96 const int m_binsPerOctave;
Chris@366 97
Chris@366 98 int m_octaves;
Chris@366 99 CQKernel *m_kernel;
Chris@366 100 CQKernel::Properties m_p;
Chris@366 101
Chris@366 102 std::vector<Resampler *> m_upsamplers;
Chris@366 103 std::vector<RealSequence> m_buffers;
Chris@366 104 std::vector<RealSequence> m_olaBufs; // fixed-length, for overlap-add
Chris@366 105
Chris@366 106 int m_outputLatency;
Chris@366 107
Chris@366 108 FFTReal *m_fft;
Chris@366 109
Chris@366 110 void initialise();
Chris@366 111 void processOctave(int octave, const ComplexBlock &block);
Chris@366 112 void processOctaveColumn(int octave, const ComplexColumn &column);
Chris@366 113 void overlapAddAndResample(int octave, const RealSequence &);
Chris@366 114 RealSequence drawFromBuffers();
Chris@366 115 };
Chris@366 116
Chris@366 117 #endif