Mercurial > hg > silvet
comparison constant-q-cpp/cq/CQInverse.h @ 366:5d0a2ebb4d17
Bring dependent libraries in to repo
author | Chris Cannam |
---|---|
date | Fri, 24 Jun 2016 14:47:45 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
365:112766f4c34b | 366:5d0a2ebb4d17 |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
2 /* | |
3 Constant-Q library | |
4 Copyright (c) 2013-2014 Queen Mary, University of London | |
5 | |
6 Permission is hereby granted, free of charge, to any person | |
7 obtaining a copy of this software and associated documentation | |
8 files (the "Software"), to deal in the Software without | |
9 restriction, including without limitation the rights to use, copy, | |
10 modify, merge, publish, distribute, sublicense, and/or sell copies | |
11 of the Software, and to permit persons to whom the Software is | |
12 furnished to do so, subject to the following conditions: | |
13 | |
14 The above copyright notice and this permission notice shall be | |
15 included in all copies or substantial portions of the Software. | |
16 | |
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
18 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
20 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | |
21 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |
22 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
23 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
24 | |
25 Except as contained in this notice, the names of the Centre for | |
26 Digital Music; Queen Mary, University of London; and Chris Cannam | |
27 shall not be used in advertising or otherwise to promote the sale, | |
28 use or other dealings in this Software without prior written | |
29 authorization. | |
30 */ | |
31 | |
32 #ifndef CQINVERSE_H | |
33 #define CQINVERSE_H | |
34 | |
35 #include "CQBase.h" | |
36 #include "CQKernel.h" | |
37 | |
38 class Resampler; | |
39 class FFTReal; | |
40 | |
41 /** | |
42 * Calculate an inverse constant-Q transform. The input must be the | |
43 * same representation as returned as output of a \ref ConstantQ | |
44 * object with the same parameters. The output is a time-domain | |
45 * signal. | |
46 * | |
47 * Note that you cannot perform an inverse transform from the | |
48 * magnitude-only output of \ref CQSpectrogram; you need the complex | |
49 * valued data from \ref ConstantQ. | |
50 * | |
51 * Our implementation of the Constant-Q transform is not exactly | |
52 * invertible, and this produces only an approximation of the original | |
53 * signal (see publications for details). | |
54 */ | |
55 class CQInverse : public CQBase | |
56 { | |
57 public: | |
58 /** | |
59 * Construct an inverse Constant-Q transform object using the | |
60 * given transform parameters. | |
61 */ | |
62 CQInverse(CQParameters params); | |
63 virtual ~CQInverse(); | |
64 | |
65 // CQBase methods, see CQBase.h for documentation | |
66 virtual bool isValid() const { return m_kernel && m_kernel->isValid(); } | |
67 virtual double getSampleRate() const { return m_sampleRate; } | |
68 virtual int getBinsPerOctave() const { return m_binsPerOctave; } | |
69 virtual int getOctaves() const { return m_octaves; } | |
70 virtual int getTotalBins() const { return m_octaves * m_binsPerOctave; } | |
71 virtual int getColumnHop() const { return m_p.fftHop / m_p.atomsPerFrame; } | |
72 virtual int getLatency() const { return m_outputLatency; } | |
73 virtual double getMaxFrequency() const { return m_p.maxFrequency; } | |
74 virtual double getMinFrequency() const; // actual min, not that passed to ctor | |
75 virtual double getBinFrequency(double bin) const; | |
76 | |
77 /** | |
78 * Given a series of constant-Q columns in the form produced by | |
79 * the \ref ConstantQ class, return a series of time-domain | |
80 * samples resulting from approximately inverting the constant-Q | |
81 * transform. | |
82 */ | |
83 RealSequence process(const ComplexBlock &); | |
84 | |
85 /** | |
86 * Return the remaining time-domain samples following the end of | |
87 * processing. | |
88 */ | |
89 RealSequence getRemainingOutput(); | |
90 | |
91 private: | |
92 const CQParameters m_inparams; | |
93 const double m_sampleRate; | |
94 const double m_maxFrequency; | |
95 const double m_minFrequency; | |
96 const int m_binsPerOctave; | |
97 | |
98 int m_octaves; | |
99 CQKernel *m_kernel; | |
100 CQKernel::Properties m_p; | |
101 | |
102 std::vector<Resampler *> m_upsamplers; | |
103 std::vector<RealSequence> m_buffers; | |
104 std::vector<RealSequence> m_olaBufs; // fixed-length, for overlap-add | |
105 | |
106 int m_outputLatency; | |
107 | |
108 FFTReal *m_fft; | |
109 | |
110 void initialise(); | |
111 void processOctave(int octave, const ComplexBlock &block); | |
112 void processOctaveColumn(int octave, const ComplexColumn &column); | |
113 void overlapAddAndResample(int octave, const RealSequence &); | |
114 RealSequence drawFromBuffers(); | |
115 }; | |
116 | |
117 #endif |