Mercurial > hg > qm-dsp
diff dsp/phasevocoder/PhaseVocoder.h @ 347:e3dedded9c4d
Merge from pvoc branch
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Fri, 04 Oct 2013 16:43:44 +0100 |
parents | 5eb9c2387108 |
children | a586888bc06c |
line wrap: on
line diff
--- a/dsp/phasevocoder/PhaseVocoder.h Tue Oct 01 15:15:59 2013 +0100 +++ b/dsp/phasevocoder/PhaseVocoder.h Fri Oct 04 16:43:44 2013 +0100 @@ -4,7 +4,7 @@ QM DSP Library Centre for Digital Music, Queen Mary, University of London. - This file 2005-2006 Christian Landone. + This file 2005-2006 Christian Landone, copyright 2013 QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -21,22 +21,61 @@ class PhaseVocoder { public: - PhaseVocoder( unsigned int size ); + //!!! review: size must be a power of two, or not? + PhaseVocoder(int size, int hop); virtual ~PhaseVocoder(); - void process( double* src, double* mag, double* theta); + /** + * Given one frame of time-domain samples, FFT and return the + * magnitudes, instantaneous phases, and unwrapped phases. + * + * src must have size values (where size is the frame size value + * as passed to the PhaseVocoder constructor), and should have + * been windowed as necessary by the caller (but not fft-shifted). + * + * mag, phase, and unwrapped must each be non-NULL and point to + * enough space for size/2 + 1 values. The redundant conjugate + * half of the output is not returned. + */ + void processTimeDomain(const double *src, + double *mag, double *phase, double *unwrapped); + + /** + * Given one frame of frequency-domain samples, return the + * magnitudes, instantaneous phases, and unwrapped phases. + * + * reals and imags must each contain size/2+1 values (where size + * is the frame size value as passed to the PhaseVocoder + * constructor). + * + * mag, phase, and unwrapped must each be non-NULL and point to + * enough space for size/2+1 values. + */ + void processFrequencyDomain(const double *reals, const double *imags, + double *mag, double *phase, double *unwrapped); + + /** + * Reset the stored phases to zero. Note that this may be + * necessary occasionally (depending on the application) to avoid + * loss of floating-point precision in the accumulated unwrapped + * phase values as they grow. + */ + void reset(); protected: - void getPhase(unsigned int size, double *theta, double *real, double *imag); -// void coreFFT( unsigned int NumSamples, double *RealIn, double* ImagIn, double *RealOut, double *ImagOut); - void getMagnitude( unsigned int size, double* mag, double* real, double* imag); - void FFTShift( unsigned int size, double* src); + void FFTShift(double *src); + void getMagnitudes(double *mag); + void getPhases(double *theta); + void unwrapPhases(double *theta, double *unwrapped); - unsigned int m_n; + int m_n; + int m_hop; FFTReal *m_fft; - double *m_imagOut; - double *m_realOut; - + double *m_time; + double *m_imag; + double *m_real; + double *m_phase; + double *m_unwrapped; }; #endif