summaryrefslogtreecommitdiff
path: root/libs/qm-dsp/dsp/phasevocoder/PhaseVocoder.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/qm-dsp/dsp/phasevocoder/PhaseVocoder.h')
-rw-r--r--libs/qm-dsp/dsp/phasevocoder/PhaseVocoder.h62
1 files changed, 50 insertions, 12 deletions
diff --git a/libs/qm-dsp/dsp/phasevocoder/PhaseVocoder.h b/libs/qm-dsp/dsp/phasevocoder/PhaseVocoder.h
index 8a76335d41..20242175f0 100644
--- a/libs/qm-dsp/dsp/phasevocoder/PhaseVocoder.h
+++ b/libs/qm-dsp/dsp/phasevocoder/PhaseVocoder.h
@@ -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
@@ -18,25 +18,63 @@
class FFTReal;
-class PhaseVocoder
+class PhaseVocoder
{
public:
- PhaseVocoder( unsigned int size );
+ 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