c@119: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ c@119: /* c@119: Constant-Q library c@119: Copyright (c) 2013-2014 Queen Mary, University of London c@119: c@119: Permission is hereby granted, free of charge, to any person c@119: obtaining a copy of this software and associated documentation c@119: files (the "Software"), to deal in the Software without c@119: restriction, including without limitation the rights to use, copy, c@119: modify, merge, publish, distribute, sublicense, and/or sell copies c@119: of the Software, and to permit persons to whom the Software is c@119: furnished to do so, subject to the following conditions: c@119: c@119: The above copyright notice and this permission notice shall be c@119: included in all copies or substantial portions of the Software. c@119: c@119: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, c@119: EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF c@119: MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND c@119: NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY c@119: CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF c@119: CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION c@119: WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. c@119: c@119: Except as contained in this notice, the names of the Centre for c@119: Digital Music; Queen Mary, University of London; and Chris Cannam c@119: shall not be used in advertising or otherwise to promote the sale, c@119: use or other dealings in this Software without prior written c@119: authorization. c@119: */ c@119: c@119: #ifndef RESAMPLER_H c@119: #define RESAMPLER_H c@119: c@119: #include c@119: c@119: /** c@119: * Resampler resamples a stream from one integer sample rate to c@119: * another (arbitrary) rate, using a kaiser-windowed sinc filter. The c@119: * results and performance are pretty similar to libraries such as c@119: * libsamplerate, though this implementation does not support c@119: * time-varying ratios (the ratio is fixed on construction). c@119: * c@119: * See also Decimator, which is faster and rougher but supports only c@119: * power-of-two downsampling factors. c@119: */ c@119: class Resampler c@119: { c@119: public: c@119: /** c@119: * Construct a Resampler to resample from sourceRate to c@119: * targetRate. c@119: */ c@119: Resampler(int sourceRate, int targetRate); c@119: c@119: /** c@119: * Construct a Resampler to resample from sourceRate to c@119: * targetRate, using the given filter parameters. c@119: */ c@119: Resampler(int sourceRate, int targetRate, c@119: double snr, double bandwidth); c@119: c@119: virtual ~Resampler(); c@119: c@119: /** c@119: * Read n input samples from src and write resampled data to c@119: * dst. The return value is the number of samples written, which c@119: * will be no more than ceil((n * targetRate) / sourceRate). The c@119: * caller must ensure the dst buffer has enough space for the c@119: * samples returned. c@119: */ c@119: int process(const double *src, double *dst, int n); c@119: c@119: /** c@119: * Read n input samples from src and return resampled data by c@119: * value. c@119: */ c@119: std::vector process(const double *src, int n); c@119: c@119: /** c@119: * Return the number of samples of latency at the output due by c@119: * the filter. (That is, the output will be delayed by this number c@119: * of samples relative to the input.) c@119: */ c@119: int getLatency() const { return m_latency; } c@119: c@119: /** c@119: * Carry out a one-off resample of a single block of n c@119: * samples. The output is latency-compensated. c@119: */ c@119: static std::vector resample c@119: (int sourceRate, int targetRate, const double *data, int n); c@119: c@119: private: c@119: int m_sourceRate; c@119: int m_targetRate; c@119: int m_gcd; c@119: int m_filterLength; c@119: int m_latency; c@119: double m_peakToPole; c@119: c@119: struct Phase { c@119: int nextPhase; c@119: std::vector filter; c@119: int drop; c@119: }; c@119: c@119: Phase *m_phaseData; c@119: int m_phase; c@119: std::vector m_buffer; c@119: int m_bufferOrigin; c@119: c@119: void initialise(double, double); c@119: double reconstructOne(); c@119: }; c@119: c@119: #endif c@119: