00001 #ifndef INCLUDE_ANALYZER_H
00002 #define INCLUDE_ANALYZER_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <memory>
00036 #include <vector>
00037 #include "LinearEnvelope.h"
00038 #include "Partial.h"
00039 #include "PartialList.h"
00040 #include "SpectralPeaks.h"
00041
00042
00043 namespace Loris {
00044
00045 class Envelope;
00046 class LinearEnvelopeBuilder;
00047
00048
00049
00050
00098
00099 class Analyzer
00100 {
00101
00102 public:
00103
00104
00105
00112 explicit Analyzer( double resolutionHz );
00113
00123 Analyzer( double resolutionHz, double windowWidthHz );
00124
00130 Analyzer( const Analyzer & other );
00131
00133 ~Analyzer( void );
00134
00140 Analyzer & operator=( const Analyzer & rhs );
00141
00142
00143
00151 void configure( double resolutionHz );
00152
00169 void configure( double resolutionHz, double windowWidthHz );
00170
00171
00172
00179 void analyze( const std::vector<double> & vec, double srate );
00180
00189 void analyze( const double * bufBegin, const double * bufEnd, double srate );
00190
00191
00192
00202 void analyze( const std::vector<double> & vec, double srate,
00203 const Envelope & reference );
00204
00216 void analyze( const double * bufBegin, const double * bufEnd, double srate,
00217 const Envelope & reference );
00218
00219
00220
00223 double ampFloor( void ) const;
00224
00229 double cropTime( void ) const;
00230
00233 double freqDrift( void ) const;
00234
00237 double freqFloor( void ) const;
00238
00241 double freqResolution( void ) const;
00242
00246 double hopTime( void ) const;
00247
00254 double sidelobeLevel( void ) const;
00255
00258 double windowWidth( void ) const;
00259
00266 bool phaseCorrect( void ) const;
00267
00268
00269
00270
00275 void setAmpFloor( double x );
00276
00283 void setCropTime( double x );
00284
00289 void setFreqDrift( double x );
00290
00295 void setFreqFloor( double x );
00296
00302 void setFreqResolution( double x );
00303
00308 void setHopTime( double x );
00309
00318 void setSidelobeLevel( double x );
00319
00324 void setWindowWidth( double x );
00325
00332 void setPhaseCorrect( bool TF = true );
00333
00334
00335
00336
00337 enum { Default_ResidueBandwidth_RegionWidth = 2000,
00338 Default_ConvergenceBandwidth_TolerancePct = 10 };
00339
00350 void storeResidueBandwidth( double regionWidth = Default_ResidueBandwidth_RegionWidth );
00351
00364 void storeConvergenceBandwidth( double tolerancePct =
00365 0.01 * (double)Default_ConvergenceBandwidth_TolerancePct );
00366
00369 void storeNoBandwidth( void );
00370
00374 bool bandwidthIsResidue( void ) const;
00375
00379 bool bandwidthIsConvergence( void ) const;
00380
00385 double bwRegionWidth( void ) const;
00386
00391 double bwConvergenceTolerance( void ) const;
00392
00397 bool associateBandwidth( void ) const
00398 { return bandwidthIsResidue() || bandwidthIsConvergence(); }
00399
00401 void setBwRegionWidth( double x )
00402 {
00403 if ( x != 0 )
00404 {
00405 storeResidueBandwidth( x );
00406 }
00407 else
00408 {
00409 storeNoBandwidth();
00410 }
00411 }
00412
00413
00414
00415
00418 PartialList & partials( void );
00419
00422 const PartialList & partials( void ) const;
00423
00424
00425
00426 enum { Default_FundamentalEnv_ThreshDb = -60,
00427 Default_FundamentalEnv_ThreshHz = 8000 };
00428
00446 void buildFundamentalEnv( double fmin, double fmax,
00447 double threshDb = Default_FundamentalEnv_ThreshDb,
00448 double threshHz = Default_FundamentalEnv_ThreshHz );
00449
00450
00457 const LinearEnvelope & fundamentalEnv( void ) const;
00458
00463 const LinearEnvelope & ampEnv( void ) const;
00464
00465
00466
00467
00468
00469
00470
00471 void buildAmpEnv( bool TF = true ) { TF = TF; }
00472 void buildFundamentalEnv( bool TF = true ) { TF = TF; }
00473
00474
00475
00476 private:
00477
00478 double m_freqResolution;
00479
00480
00481
00482 double m_ampFloor;
00483
00484
00485 double m_windowWidth;
00486
00487
00488
00489
00490 double m_freqFloor;
00491
00492
00493 double m_freqDrift;
00494
00495
00496
00497 double m_hopTime;
00498
00499
00500 double m_cropTime;
00501
00502
00503
00504 double m_bwRegionWidth;
00505
00506
00507
00508
00509
00510
00511 double m_sidelobeLevel;
00512
00513
00514 bool m_phaseCorrect;
00515
00516
00517 PartialList m_partials;
00518
00521 std::auto_ptr< LinearEnvelopeBuilder > m_f0Builder;
00522
00525 std::auto_ptr< LinearEnvelopeBuilder > m_ampEnvBuilder;
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00538
00539
00542
00543
00546
00547
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561 Peaks::iterator thinPeaks( Peaks & peaks, double frameTime );
00562
00563
00564
00565
00566
00567
00568
00569
00570 void fixBandwidth( Peaks & peaks );
00571
00572 };
00573
00574 }
00575
00576 #endif