summaryrefslogtreecommitdiff
path: root/src/loris/Analyzer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/loris/Analyzer.h')
-rw-r--r--src/loris/Analyzer.h500
1 files changed, 292 insertions, 208 deletions
diff --git a/src/loris/Analyzer.h b/src/loris/Analyzer.h
index 58ece87..9effdc5 100644
--- a/src/loris/Analyzer.h
+++ b/src/loris/Analyzer.h
@@ -1,8 +1,8 @@
#ifndef INCLUDE_ANALYZER_H
#define INCLUDE_ANALYZER_H
/*
- * This is the Loris C++ Class Library, implementing analysis,
- * manipulation, and synthesis of digitized sounds using the Reassigned
+ * This is the Loris C++ Class Library, implementing analysis,
+ * manipulation, and synthesis of digitized sounds using the Reassigned
* Bandwidth-Enhanced Additive Sound Model.
*
* Loris is Copyright (c) 1999-2010 by Kelly Fitz and Lippold Haken
@@ -34,6 +34,7 @@
*/
#include <memory>
#include <vector>
+#include <cmath>
#include "LinearEnvelope.h"
#include "Partial.h"
#include "PartialList.h"
@@ -43,42 +44,127 @@
namespace Loris {
class Envelope;
-class LinearEnvelopeBuilder;
-// oooo, this is nasty, need to fix it!
-// class SpectralPeak;
-// typedef std::vector< SpectralPeak > Peaks;
+
+// ---------------------------------------------------------------------------
+// LinearEnvelopeBuilder
+// ---------------------------------------------------------------------------
+// Base class for envelope builders that add a point (possibly) at each
+// analysis frame.
+//
+// TODO: make a dictionary of these things and allow clients to add their
+// own envelope builders and builder functions, and retrieve them after
+// analysis.
+class LinearEnvelopeBuilder
+{
+public:
+ virtual ~LinearEnvelopeBuilder( void ) {}
+ virtual LinearEnvelopeBuilder * clone( void ) const = 0;
+ virtual void build( const Peaks & peaks, double frameTime ) = 0;
+
+ const LinearEnvelope & envelope( void ) const { return mEnvelope; }
+
+ // reset (clear) envelope, override if necesssary:
+ virtual void reset( void ) { mEnvelope.clear(); }
+
+protected:
+
+ LinearEnvelope mEnvelope; // build this
+};
+
+
+// ---------------------------------------------------------------------------
+// FundamentalBuilder - for constructing an F0 envelope during analysis
+// ---------------------------------------------------------------------------
+class FundamentalBuilder : public LinearEnvelopeBuilder
+{
+ std::auto_ptr< Envelope > mFminEnv;
+ std::auto_ptr< Envelope > mFmaxEnv;
+
+ double mAmpThresh, mFreqThresh;
+
+ std::vector< double > amplitudes, frequencies;
+
+ const double mMinConfidence; // 0.9, this could be made a parameter,
+ // or raised to make estimates smoother
+
+public:
+ FundamentalBuilder( double fmin, double fmax, double threshDb = -60, double threshHz = 8000 ) :
+ mFminEnv( new LinearEnvelope( fmin ) ),
+ mFmaxEnv( new LinearEnvelope( fmax ) ),
+ mAmpThresh( std::pow( 10., 0.05*(threshDb) ) ),
+ mFreqThresh( threshHz ),
+ mMinConfidence( 0.9 )
+ {}
+
+ FundamentalBuilder( const Envelope & fmin, const Envelope & fmax,
+ double threshDb = -60, double threshHz = 8000 ) :
+ mFminEnv( fmin.clone() ),
+ mFmaxEnv( fmax.clone() ),
+ mAmpThresh( std::pow( 10., 0.05*(threshDb) ) ),
+ mFreqThresh( threshHz ),
+ mMinConfidence( 0.9 )
+ {}
+
+ FundamentalBuilder( const FundamentalBuilder & rhs ) :
+ mFminEnv( rhs.mFminEnv->clone() ),
+ mFmaxEnv( rhs.mFmaxEnv->clone() ),
+ mAmpThresh( rhs.mAmpThresh ),
+ mFreqThresh( rhs.mFreqThresh ),
+ mMinConfidence( rhs.mMinConfidence )
+ {}
+
+
+ FundamentalBuilder * clone( void ) const { return new FundamentalBuilder(*this); }
+
+ void build( const Peaks & peaks, double frameTime );
+};
+
+
+// ---------------------------------------------------------------------------
+// AmpEnvBuilder - for constructing an amplitude envelope during analysis
+// ---------------------------------------------------------------------------
+class AmpEnvBuilder : public LinearEnvelopeBuilder
+{
+public:
+ AmpEnvBuilder( void ) {}
+
+ AmpEnvBuilder * clone( void ) const { return new AmpEnvBuilder(*this); }
+
+ void build( const Peaks & peaks, double frameTime );
+
+};
// ---------------------------------------------------------------------------
// class Analyzer
//
//! Class Analyzer represents a configuration of parameters for
//! performing Reassigned Bandwidth-Enhanced Additive Analysis
-//! of sampled sounds. The analysis process yields a collection
+//! of sampled sounds. The analysis process yields a collection
//! of Partials, each having a trio of synchronous, non-uniformly-
-//! sampled breakpoint envelopes representing the time-varying
+//! sampled breakpoint envelopes representing the time-varying
//! frequency, amplitude, and noisiness of a single bandwidth-
//! enhanced sinusoid. These Partials are accumulated in the
//! Analyzer.
//!
-//! The core analysis parameter is the frequency resolution, the
-//! minimum instantaneous frequency spacing between partials. Most
-//! other parameters are initially configured according to this
+//! The core analysis parameter is the frequency resolution, the
+//! minimum instantaneous frequency spacing between partials. Most
+//! other parameters are initially configured according to this
//! parameter (and the analysis window width, if specified).
//! Subsequent parameter mutations are independent.
-//!
+//!
//! Bandwidth enhancement:
//! Two different strategies are available for computing bandwidth
-//! (or noisiness) envelope:
-//!
+//! (or noisiness) envelope:
+//!
//! One strategy is to construct bandwidth envelopes during analysis
-//! by associating residual energy in the spectrum (after peak
-//! extraction) with the selected spectral peaks that are used
+//! by associating residual energy in the spectrum (after peak
+//! extraction) with the selected spectral peaks that are used
//! to construct Partials. This is the original bandwidth enhancement
//! algorithm, and bandwidth envelopes constructed in this way may
-//! be suitable for use in bandwidth-enhanced synthesis.
-//!
-//! Another stategy is to construct bandwidth envelopes during
-//! analysis by storing the mixed derivative of short-time phase,
+//! be suitable for use in bandwidth-enhanced synthesis.
+//!
+//! Another stategy is to construct bandwidth envelopes during
+//! analysis by storing the mixed derivative of short-time phase,
//! scaled and shifted so that a value of 0 corresponds
//! to a pure sinusoid, and a value of 1 corresponds to a
//! bandwidth-enhanced sinusoid with maximal energy spread
@@ -86,17 +172,17 @@ class LinearEnvelopeBuilder;
//! are not suitable for bandwidth-enhanced synthesis, be sure
//! to set the bandwidth to 0, or to disable bandwidth enhancement
//! before rendering.
-//!
+//!
//! The Analyzer may be configured to use either of these two
//! strategies for bandwidth-enhanced analysis, or to construct
//! no bandwidth envelopes at all. If unspecified, the default
//! Analyzer configuration uses spectral residue to construct
//! bandwidth envelopes.
-//!
+//!
//! \sa storeResidueBandwidth, storeConvergenceBandwidth, storeNoBandwidth
-//!
-//! For more information about Reassigned Bandwidth-Enhanced
-//! Analysis and the Reassigned Bandwidth-Enhanced Additive Sound
+//!
+//! For more information about Reassigned Bandwidth-Enhanced
+//! Analysis and the Reassigned Bandwidth-Enhanced Additive Sound
//! Model, refer to the Loris website: www.cerlsoundgroup.org/Loris/.
//
class Analyzer
@@ -106,74 +192,74 @@ public:
// -- construction --
- //! Construct a new Analyzer configured with the given
- //! frequency resolution (minimum instantaneous frequency
- //! difference between Partials). All other Analyzer parameters
- //! are computed from the specified frequency resolution.
- //!
+ //! Construct a new Analyzer configured with the given
+ //! frequency resolution (minimum instantaneous frequency
+ //! difference between Partials). All other Analyzer parameters
+ //! are computed from the specified frequency resolution.
+ //!
//! \param resolutionHz is the frequency resolution in Hz.
explicit Analyzer( double resolutionHz );
-
- //! Construct a new Analyzer configured with the given
- //! frequency resolution (minimum instantaneous frequency
+
+ //! Construct a new Analyzer configured with the given
+ //! frequency resolution (minimum instantaneous frequency
//! difference between Partials) and analysis window width
- //! (main lobe, zero-to-zero). All other Analyzer parameters
- //! are computed from the specified resolution and window width.
- //!
+ //! (main lobe, zero-to-zero). All other Analyzer parameters
+ //! are computed from the specified resolution and window width.
+ //!
//! \param resolutionHz is the frequency resolution in Hz.
//! \param windowWidthHz is the main lobe width of the Kaiser
//! analysis window in Hz.
Analyzer( double resolutionHz, double windowWidthHz );
//! Construct a new Analyzer configured with the given time-varying
- //! frequency resolution (minimum instantaneous frequency
+ //! frequency resolution (minimum instantaneous frequency
//! difference between Partials) and analysis window width
- //! (main lobe, zero-to-zero). All other Analyzer parameters
- //! are computed from the specified resolution and window width.
- //!
+ //! (main lobe, zero-to-zero). All other Analyzer parameters
+ //! are computed from the specified resolution and window width.
+ //!
//! \param resolutionHz is the frequency resolution in Hz.
//! \param windowWidthHz is the main lobe width of the Kaiser
//! analysis window in Hz.
Analyzer( const Envelope & resolutionEnv, double windowWidthHz );
//! Construct a new Analyzer having identical
- //! parameter configuration to another Analyzer.
- //! The list of collected Partials is not copied.
- //!
- //! \param other is the Analyzer to copy.
+ //! parameter configuration to another Analyzer.
+ //! The list of collected Partials is not copied.
+ //!
+ //! \param other is the Analyzer to copy.
Analyzer( const Analyzer & other );
//! Destroy this Analyzer.
~Analyzer( void );
//! Construct a new Analyzer having identical
- //! parameter configuration to another Analyzer.
- //! The list of collected Partials is not copied.
- //!
- //! \param rhs is the Analyzer to copy.
+ //! parameter configuration to another Analyzer.
+ //! The list of collected Partials is not copied.
+ //!
+ //! \param rhs is the Analyzer to copy.
Analyzer & operator=( const Analyzer & rhs );
// -- configuration --
- //! Configure this Analyzer with the given frequency resolution
- //! (minimum instantaneous frequency difference between Partials,
- //! in Hz). All other Analyzer parameters are (re-)computed from the
+ //! Configure this Analyzer with the given frequency resolution
+ //! (minimum instantaneous frequency difference between Partials,
+ //! in Hz). All other Analyzer parameters are (re-)computed from the
//! frequency resolution, including the window width, which is
- //! twice the resolution.
- //!
+ //! twice the resolution.
+ //!
//! \param resolutionHz is the frequency resolution in Hz.
void configure( double resolutionHz );
- //! Configure this Analyzer with the given frequency resolution
+ //! Configure this Analyzer with the given frequency resolution
//! (minimum instantaneous frequency difference between Partials)
- //! and analysis window width (main lobe, zero-to-zero, in Hz).
- //! All other Analyzer parameters are (re-)computed from the
- //! frequency resolution and window width.
- //!
+ //! and analysis window width (main lobe, zero-to-zero, in Hz).
+ //! All other Analyzer parameters are (re-)computed from the
+ //! frequency resolution and window width.
+ //!
//! \param resolutionHz is the frequency resolution in Hz.
//! \param windowWidthHz is the main lobe width of the Kaiser
//! analysis window in Hz.
- //!
+ //!
//! There are three categories of analysis parameters:
//! - the resolution, and params that are usually related to (or
//! identical to) the resolution (frequency floor and drift)
@@ -182,17 +268,17 @@ public:
//! - independent parameters (bw region width and amp floor)
void configure( double resolutionHz, double windowWidthHz );
- //! Configure this Analyzer with the given time-varying frequency resolution
+ //! Configure this Analyzer with the given time-varying frequency resolution
//! (minimum instantaneous frequency difference between Partials)
- //! and analysis window width (main lobe, zero-to-zero, in Hz).
- //! All other Analyzer parameters are (re-)computed from the
- //! frequency resolution and window width.
- //!
- //! \param resolutionEnv is the time-varying frequency resolution
+ //! and analysis window width (main lobe, zero-to-zero, in Hz).
+ //! All other Analyzer parameters are (re-)computed from the
+ //! frequency resolution and window width.
+ //!
+ //! \param resolutionEnv is the time-varying frequency resolution
//! in Hz.
//! \param windowWidthHz is the main lobe width of the Kaiser
//! analysis window in Hz.
- //!
+ //!
//! There are three categories of analysis parameters:
//! - the resolution, and params that are usually related to (or
//! identical to) the resolution (frequency floor and drift)
@@ -200,31 +286,31 @@ public:
//! identical to) the window width (hop and crop times)
//! - independent parameters (bw region width and amp floor)
//
- void configure( const Envelope & resolutionEnv, double windowWidthHz );
-
+ void configure( const Envelope & resolutionEnv, double windowWidthHz );
+
// -- analysis --
- //! Analyze a vector of (mono) samples at the given sample rate
- //! (in Hz) and store the extracted Partials in the Analyzer's
- //! PartialList (std::list of Partials).
- //!
+ //! Analyze a vector of (mono) samples at the given sample rate
+ //! (in Hz) and store the extracted Partials in the Analyzer's
+ //! PartialList (std::list of Partials).
+ //!
//! \param vec is a vector of floating point samples
- //! \param srate is the sample rate of the samples in the vector
+ //! \param srate is the sample rate of the samples in the vector
void analyze( const std::vector<double> & vec, double srate );
-
- //! Analyze a range of (mono) samples at the given sample rate
+
+ //! Analyze a range of (mono) samples at the given sample rate
//! (in Hz) and store the extracted Partials in the Analyzer's
- //! PartialList (std::list of Partials).
- //!
+ //! PartialList (std::list of Partials).
+ //!
//! \param bufBegin is a pointer to a buffer of floating point samples
- //! \param bufEnd is (one-past) the end of a buffer of floating point
+ //! \param bufEnd is (one-past) the end of a buffer of floating point
//! samples
//! \param srate is the sample rate of the samples in the buffer
void analyze( const double * bufBegin, const double * bufEnd, double srate );
-
+
// -- tracking analysis --
- //! Analyze a vector of (mono) samples at the given sample rate
+ //! Analyze a vector of (mono) samples at the given sample rate
//! (in Hz) and store the extracted Partials in the Analyzer's
//! PartialList (std::list of Partials). Use the specified envelope
//! as a frequency reference for Partial tracking.
@@ -233,29 +319,27 @@ public:
//! \param srate is the sample rate of the samples in the vector
//! \param reference is an Envelope having the approximate
//! frequency contour expected of the resulting Partials.
- void analyze( const std::vector<double> & vec, double srate,
+ void analyze( const std::vector<double> & vec, double srate,
const Envelope & reference );
-
- //! Analyze a range of (mono) samples at the given sample rate
+
+ //! Analyze a range of (mono) samples at the given sample rate
//! (in Hz) and store the extracted Partials in the Analyzer's
//! PartialList (std::list of Partials). Use the specified envelope
//! as a frequency reference for Partial tracking.
- //!
+ //!
//! \param bufBegin is a pointer to a buffer of floating point samples
- //! \param bufEnd is (one-past) the end of a buffer of floating point
+ //! \param bufEnd is (one-past) the end of a buffer of floating point
//! samples
//! \param srate is the sample rate of the samples in the buffer
//! \param reference is an Envelope having the approximate
//! frequency contour expected of the resulting Partials.
- void analyze( const double * bufBegin, const double * bufEnd, double srate,
- const Envelope & reference );
+ virtual void analyze( const double * bufBegin, const double * bufEnd, double srate,
+ const Envelope & reference );
- void analyze_peaks( const std::vector<double> & vec, double srate );
-
// -- parameter access --
- //! Return the amplitude floor (lowest detected spectral amplitude),
- //! in (negative) dB, for this Analyzer.
+ //! Return the amplitude floor (lowest detected spectral amplitude),
+ //! in (negative) dB, for this Analyzer.
double ampFloor( void ) const;
//! Return the crop time (maximum temporal displacement of a time-
@@ -264,40 +348,40 @@ public:
//! for this Analyzer.
double cropTime( void ) const;
- //! Return the maximum allowable frequency difference between
- //! consecutive Breakpoints in a Partial envelope for this Analyzer.
+ //! Return the maximum allowable frequency difference between
+ //! consecutive Breakpoints in a Partial envelope for this Analyzer.
double freqDrift( void ) const;
- //! Return the frequency floor (minimum instantaneous Partial
- //! frequency), in Hz, for this Analyzer.
+ //! Return the frequency floor (minimum instantaneous Partial
+ //! frequency), in Hz, for this Analyzer.
double freqFloor( void ) const;
-
- //! Return the frequency resolution (minimum instantaneous frequency
+
+ //! Return the frequency resolution (minimum instantaneous frequency
//! difference between Partials) for this Analyzer at the specified
//! time in seconds. If no time is specified, then the initial resolution
//! (at 0 seconds) is returned.
- //!
- //! \param time is the time in seconds at which to evaluate the
+ //!
+ //! \param time is the time in seconds at which to evaluate the
//! frequency resolution
- double freqResolution( double time = 0.0 ) const;
+ double freqResolution( double time = 0.0 ) const;
- //! Return the hop time (which corresponds approximately to the
- //! average density of Partial envelope Breakpoint data) for this
+ //! Return the hop time (which corresponds approximately to the
+ //! average density of Partial envelope Breakpoint data) for this
//! Analyzer.
double hopTime( void ) const;
//! Return the sidelobe attenutation level for the Kaiser analysis window in
- //! positive dB. Larger numbers (e.g. 90) give very good sidelobe
- //! rejection but cause the window to be longer in time. Smaller numbers
+ //! positive dB. Larger numbers (e.g. 90) give very good sidelobe
+ //! rejection but cause the window to be longer in time. Smaller numbers
//! (like 60) raise the level of the sidelobes, increasing the likelihood
//! of frequency-domain interference, but allow the window to be shorter
//! in time.
double sidelobeLevel( void ) const;
- //! Return the frequency-domain main lobe width (measured between
- //! zero-crossings) of the analysis window used by this Analyzer.
+ //! Return the frequency-domain main lobe width (measured between
+ //! zero-crossings) of the analysis window used by this Analyzer.
double windowWidth( void ) const;
-
+
//! Return true if the phases and frequencies of the constructed
//! partials should be modified to be consistent at the end of the
//! analysis, and false otherwise. (Default is true.)
@@ -306,66 +390,66 @@ public:
// -- parameter mutation --
- //! Set the amplitude floor (lowest detected spectral amplitude), in
- //! (negative) dB, for this Analyzer.
- //!
- //! \param x is the new value of this parameter.
+ //! Set the amplitude floor (lowest detected spectral amplitude), in
+ //! (negative) dB, for this Analyzer.
+ //!
+ //! \param x is the new value of this parameter.
void setAmpFloor( double x );
//! Set the crop time (maximum temporal displacement of a time-
//! frequency data point from the time-domain center of the analysis
//! window, beyond which data points are considered "unreliable")
//! for this Analyzer.
- //!
- //! \param x is the new value of this parameter.
+ //!
+ //! \param x is the new value of this parameter.
void setCropTime( double x );
- //! Set the maximum allowable frequency difference between
- //! consecutive Breakpoints in a Partial envelope for this Analyzer.
- //!
- //! \param x is the new value of this parameter.
+ //! Set the maximum allowable frequency difference between
+ //! consecutive Breakpoints in a Partial envelope for this Analyzer.
+ //!
+ //! \param x is the new value of this parameter.
void setFreqDrift( double x );
- //! Set the frequency floor (minimum instantaneous Partial
+ //! Set the frequency floor (minimum instantaneous Partial
//! frequency), in Hz, for this Analyzer.
- //!
- //! \param x is the new value of this parameter.
+ //!
+ //! \param x is the new value of this parameter.
void setFreqFloor( double x );
- //! Set the frequency resolution (minimum instantaneous frequency
- //! difference between Partials) for this Analyzer. (Does not cause
- //! other parameters to be recomputed.)
- //!
- //! \param x is the new value of this parameter.
+ //! Set the frequency resolution (minimum instantaneous frequency
+ //! difference between Partials) for this Analyzer. (Does not cause
+ //! other parameters to be recomputed.)
+ //!
+ //! \param x is the new value of this parameter.
void setFreqResolution( double x );
-
- //! Set the time-varying frequency resolution (minimum instantaneous frequency
- //! difference between Partials) for this Analyzer. (Does not cause
- //! other parameters to be recomputed.)
- //!
- //! \param e is the envelope to copy for this parameter.
- void setFreqResolution( const Envelope & e );
+
+ //! Set the time-varying frequency resolution (minimum instantaneous frequency
+ //! difference between Partials) for this Analyzer. (Does not cause
+ //! other parameters to be recomputed.)
+ //!
+ //! \param e is the envelope to copy for this parameter.
+ void setFreqResolution( const Envelope & e );
//! Set the hop time (which corresponds approximately to the average
//! density of Partial envelope Breakpoint data) for this Analyzer.
- //!
- //! \param x is the new value of this parameter.
+ //!
+ //! \param x is the new value of this parameter.
void setHopTime( double x );
//! Set the sidelobe attenutation level for the Kaiser analysis window in
- //! positive dB. More negative numbers (e.g. -90) give very good sidelobe
- //! rejection but cause the window to be longer in time. Less negative
+ //! positive dB. More negative numbers (e.g. -90) give very good sidelobe
+ //! rejection but cause the window to be longer in time. Less negative
//! numbers raise the level of the sidelobes, increasing the likelihood
//! of frequency-domain interference, but allow the window to be shorter
//! in time.
- //!
- //! \param x is the new value of this parameter.
+ //!
+ //! \param x is the new value of this parameter.
void setSidelobeLevel( double x );
- //! Set the frequency-domain main lobe width (measured between
- //! zero-crossings) of the analysis window used by this Analyzer.
- //!
- //! \param x is the new value of this parameter.
+ //! Set the frequency-domain main lobe width (measured between
+ //! zero-crossings) of the analysis window used by this Analyzer.
+ //!
+ //! \param x is the new value of this parameter.
void setWindowWidth( double x );
//! Indicate whether the phases and frequencies of the constructed
@@ -375,54 +459,54 @@ public:
//! \param TF is a flag indicating whether or not to construct
//! phase-corrected Partials
void setPhaseCorrect( bool TF = true );
-
-
+
+
// -- bandwidth envelope specification --
enum { Default_ResidueBandwidth_RegionWidth = 2000,
Default_ConvergenceBandwidth_TolerancePct = 10 };
-
+
//! Construct Partial bandwidth envelopes during analysis
//! by associating residual energy in the spectrum (after
//! peak extraction) with the selected spectral peaks that
- //! are used to construct Partials.
+ //! are used to construct Partials.
//!
//! This is the default bandwidth-enhancement strategy.
- //!
- //! \param regionWidth is the width (in Hz) of the bandwidth
+ //!
+ //! \param regionWidth is the width (in Hz) of the bandwidth
//! association regions used by this process, must be positive.
//! If unspecified, a default value is used.
void storeResidueBandwidth( double regionWidth = Default_ResidueBandwidth_RegionWidth );
-
+
//! Construct Partial bandwidth envelopes during analysis
- //! by storing the mixed derivative of short-time phase,
+ //! by storing the mixed derivative of short-time phase,
//! scaled and shifted so that a value of 0 corresponds
//! to a pure sinusoid, and a value of 1 corresponds to a
//! bandwidth-enhanced sinusoid with maximal energy spread
//! (minimum sinusoidal convergence).
//!
- //! \param tolerance is the amount of range over which the
- //! mixed derivative indicator should be allowed to drift away
+ //! \param tolerance is the amount of range over which the
+ //! mixed derivative indicator should be allowed to drift away
//! from a pure sinusoid before saturating. This range is mapped
- //! to bandwidth values on the range [0,1]. Must be positive and
+ //! to bandwidth values on the range [0,1]. Must be positive and
//! not greater than 1. If unspecified, a default value is used.
- void storeConvergenceBandwidth( double tolerancePct =
+ void storeConvergenceBandwidth( double tolerancePct =
0.01 * (double)Default_ConvergenceBandwidth_TolerancePct );
-
- //! Disable bandwidth envelope construction. Bandwidth
+
+ //! Disable bandwidth envelope construction. Bandwidth
//! will be zero for all Breakpoints in all Partials.
void storeNoBandwidth( void );
-
+
//! Return true if this Analyzer is configured to compute
//! bandwidth envelopes using the spectral residue after
//! peaks have been identified, and false otherwise.
bool bandwidthIsResidue( void ) const;
-
+
//! Return true if this Analyzer is configured to compute
//! bandwidth envelopes using the mixed derivative convergence
//! indicator, and false otherwise.
bool bandwidthIsConvergence( void ) const;
-
+
//! Return the width (in Hz) of the Bandwidth Association regions
//! used by this Analyzer, only if the spectral residue method is
//! used to compute bandwidth envelopes. Return zero if the mixed
@@ -436,45 +520,45 @@ public:
double bwConvergenceTolerance( void ) const;
//! Return true if bandwidth envelopes are to be constructed
- //! by any means, that is, if either bandwidthIsResidue() or
+ //! by any means, that is, if either bandwidthIsResidue() or
//! bandwidthIsConvergence() are true. Otherwise, return
//! false.
bool associateBandwidth( void ) const
{ return bandwidthIsResidue() || bandwidthIsConvergence(); }
- //! Deprecated, use storeResidueBandwidth or storeNoBandwidth instead.
- void setBwRegionWidth( double x )
- {
+ //! Deprecated, use storeResidueBandwidth or storeNoBandwidth instead.
+ void setBwRegionWidth( double x )
+ {
if ( x != 0 )
{
- storeResidueBandwidth( x );
+ storeResidueBandwidth( x );
}
else
{
storeNoBandwidth();
}
}
-
+
// -- PartialList access --
- //! Return a mutable reference to this Analyzer's list of
- //! analyzed Partials.
+ //! Return a mutable reference to this Analyzer's list of
+ //! analyzed Partials.
PartialList & partials( void );
- //! Return an immutable (const) reference to this Analyzer's
- //! list of analyzed Partials.
+ //! Return an immutable (const) reference to this Analyzer's
+ //! list of analyzed Partials.
const PartialList & partials( void ) const;
// -- envelope access --
- enum { Default_FundamentalEnv_ThreshDb = -60,
+ enum { Default_FundamentalEnv_ThreshDb = -60,
Default_FundamentalEnv_ThreshHz = 8000 };
- //! Specify parameters for constructing a fundamental frequency
- //! envelope for the analyzed sound during analysis. The fundamental
- //! frequency estimate can be accessed by fundamentalEnv() after the
- //! analysis is complete.
+ //! Specify parameters for constructing a fundamental frequency
+ //! envelope for the analyzed sound during analysis. The fundamental
+ //! frequency estimate can be accessed by fundamentalEnv() after the
+ //! analysis is complete.
//!
//! By default, a fundamental envelope is estimated during analysis
//! between the frequency resolution and 1.5 times the resolution.
@@ -488,9 +572,9 @@ public:
//! \param threshHz is the upper bound on the frequency of a spectral
//! peak that will constribute to the fundamental frequency estimate.
//! Default is 8 kHz.
- void buildFundamentalEnv( double fmin, double fmax,
- double threshDb = Default_FundamentalEnv_ThreshDb,
- double threshHz = Default_FundamentalEnv_ThreshHz );
+ void buildFundamentalEnv( double fmin, double fmax,
+ double threshDb = Default_FundamentalEnv_ThreshDb,
+ double threshHz = Default_FundamentalEnv_ThreshHz );
//! Return the fundamental frequency estimate envelope constructed
@@ -503,10 +587,10 @@ public:
//! Return the overall amplitude estimate envelope constructed
//! during the most recent analysis performed by this Analyzer.
const LinearEnvelope & ampEnv( void ) const;
-
-
+
+
// -- legacy support --
-
+
// Fundamental and amplitude envelopes are always constructed during
// analysis, these members do nothing, and are retained for backwards
// compatibility.
@@ -515,51 +599,51 @@ public:
// -- private member variables --
-private:
+protected:
- std::auto_ptr< Envelope > m_freqResolutionEnv;
+ std::auto_ptr< Envelope > m_freqResolutionEnv;
//! in Hz, minimum instantaneous frequency distance;
//! this is the core parameter, others are, by default,
//! computed from this one
-
+
double m_ampFloor; //! dB, relative to full amplitude sine wave, absolute
//! amplitude threshold (negative)
-
+
double m_windowWidth; //! in Hz, width of main lobe; this might be more
//! conveniently presented as window length, but
//! the main lobe width more explicitly highlights
//! the critical interaction with resolution
-
- // std::auto_ptr< Envelope > m_freqFloorEnv;
+
+ // std::auto_ptr< Envelope > m_freqFloorEnv;
double m_freqFloor; //! lowest frequency (Hz) component extracted
//! in spectral analysis
-
- double m_freqDrift; //! the maximum frequency (Hz) difference between two
+
+ double m_freqDrift; //! the maximum frequency (Hz) difference between two
//! consecutive Breakpoints that will be linked to
//! form a Partial
-
+
double m_hopTime; //! in seconds, time between analysis windows in
//! successive spectral analyses
-
+
double m_cropTime; //! in seconds, maximum time correction for a spectral
//! component to be considered reliable, and to be eligible
//! for extraction and for Breakpoint formation
-
- double m_bwAssocParam; //! formerly, width in Hz of overlapping bandwidth
+
+ double m_bwAssocParam; //! formerly, width in Hz of overlapping bandwidth
//! association regions, or zero if bandwidth association
//! is disabled, now a catch-all bandwidth association
//! parameter that, if negative, indicates the tolerance (%)
//! level used to construct bandwidth envelopes from the
//! mixed phase derivative indicator
-
- double m_sidelobeLevel; //! sidelobe attenutation level for the Kaiser analysis
+
+ double m_sidelobeLevel; //! sidelobe attenutation level for the Kaiser analysis
//! window, in positive dB
-
+
bool m_phaseCorrect; //! flag indicating that phases/frequencies should be
//! made consistent at the end of the analysis
-
+
PartialList m_partials; //! collect Partials here
-
+
//! builder object for constructing a fundamental frequency
//! estimate during analysis
std::auto_ptr< LinearEnvelopeBuilder > m_f0Builder;
@@ -573,22 +657,22 @@ private:
/*
// These members make up the sequence of operations in an
- // analysis. If analysis were ever to be made into a
+ // analysis. If analysis were ever to be made into a
// template method, these would be the operations that
// derived classes could override. Or each of these could
// be represented by a strategy class.
//! Compute the spectrum of the next sequence of samples.
void computeSpectrum( void );
-
+
//! Identify and select the spectral components that will be
- //! used to form Partials.
+ //! used to form Partials.
void selectPeaks( void );
-
+
//! Compute the bandwidth coefficients for the Breakpoints
- //! that are going to be used to form Partials.
+ //! that are going to be used to form Partials.
void associateBandwidth( void );
-
+
//! Construct Partials from extracted spectral components.
//! Partials are built up frame by frame by appending
//! Breakpoints to Partials under construction, and giving
@@ -598,21 +682,21 @@ private:
// Reject peaks that are too close in frequency to a louder peak that is
// being retained, and peaks that are too quiet. Peaks that are retained,
// but are quiet enough to be in the specified fadeRange should be faded.
- //
+ //
// Rejected peaks are placed at the end of the peak collection.
// Return the first position in the collection containing a rejected peak,
// or the end of the collection if no peaks are rejected.
Peaks::iterator thinPeaks( Peaks & peaks, double frameTime );
-
- // Fix the bandwidth value stored in the specified Peaks.
+
+ // Fix the bandwidth value stored in the specified Peaks.
// This function is invoked if the spectral residue method is
// not used to compute bandwidth (that method overwrites the
- // bandwidth already). If the convergence method is used to
+ // bandwidth already). If the convergence method is used to
// compute bandwidth, the appropriate scaling is applied
// to the stored mixed phase derivative. Otherwise, the
// Peak bandwidth is set to zero.
void fixBandwidth( Peaks & peaks );
-
+
}; // end of class Analyzer
} // end of namespace Loris