diff dsp/phasevocoder/PhaseVocoder.h @ 340:c99d83236f0d

Do actual phase unwrapping in the phase vocoder!
author Chris Cannam <c.cannam@qmul.ac.uk>
date Wed, 02 Oct 2013 15:05:34 +0100
parents d5014ab8b0e5
children 2020c73dc997
line wrap: on
line diff
--- a/dsp/phasevocoder/PhaseVocoder.h	Wed Oct 02 15:04:38 2013 +0100
+++ b/dsp/phasevocoder/PhaseVocoder.h	Wed Oct 02 15:05:34 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,44 @@
 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 process(double *src, 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_imag;
+    double *m_real;
+    double *m_phase;
+    double *m_unwrapped;
 };
 
 #endif