00001 #ifndef INCLUDE_PARTIALUTILS_H
00002 #define INCLUDE_PARTIALUTILS_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 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 #include "Envelope.h"
00044 #include "Partial.h"
00045 
00046 #include <functional>
00047 #include <utility>
00048 
00049 
00050 namespace Loris {
00051 
00052 namespace PartialUtils {
00053 
00054 
00055 
00056 
00057 
00058 
00066 class PartialMutator : public std::unary_function< Partial, void >
00067 {
00068 public:
00069 
00071         PartialMutator( double x );
00072 
00075         PartialMutator( const Envelope & e );
00076 
00078         PartialMutator( const PartialMutator & rhs );
00079 
00081         virtual ~PartialMutator( void );
00082         
00086         PartialMutator & operator=( const PartialMutator & rhs );
00087         
00091         virtual void operator()( Partial & p ) const = 0;
00092 
00093 protected:
00094 
00097         Envelope * env;         
00098 };
00099 
00100 
00101 
00102 
00105 
00106 class AmplitudeScaler : public PartialMutator
00107 {
00108 public:
00109 
00111         AmplitudeScaler( double x ) : PartialMutator( x ) {}
00112         
00115         AmplitudeScaler( const Envelope & e ) : PartialMutator( e ) {}
00116         
00119         void operator()( Partial & p ) const;
00120 };
00121 
00122 
00123 
00124 
00131 
00132 template< class Arg >
00133 void scaleAmplitude( Partial & p, const Arg & arg )
00134 {
00135         AmplitudeScaler scaler( arg );
00136         scaler( p );
00137 }
00138 
00139 
00140 
00141 
00149 
00150 template< class Iter, class Arg >
00151 void scaleAmplitude( Iter b, Iter e, const Arg & arg )
00152 {
00153         AmplitudeScaler scaler( arg );
00154         while ( b != e )
00155         {
00156                 scaler( *b++ );
00157         }
00158 }
00159 
00160 
00161 
00162 
00165 
00166 class BandwidthScaler : public PartialMutator
00167 {
00168 public:
00169 
00171         BandwidthScaler( double x ) : PartialMutator( x ) {}
00172 
00175         BandwidthScaler( const Envelope & e ) : PartialMutator( e ) {}
00176         
00179         void operator()( Partial & p ) const;
00180 };
00181 
00182 
00183 
00184 
00191 
00192 template< class Arg >
00193 void scaleBandwidth( Partial & p, const Arg & arg )
00194 {
00195         BandwidthScaler scaler( arg );
00196         scaler( p );
00197 }
00198 
00199 
00200 
00201 
00209 
00210 template< class Iter, class Arg >
00211 void scaleBandwidth( Iter b, Iter e, const Arg & arg )
00212 {
00213         BandwidthScaler scaler( arg );
00214         while ( b != e )
00215         {
00216                 scaler( *b++ );
00217         }
00218 }
00219 
00220 
00221 
00222 
00225 
00226 class BandwidthSetter : public PartialMutator
00227 {
00228 public:
00229 
00231         BandwidthSetter( double x ) : PartialMutator( x ) {}
00232 
00235         BandwidthSetter( const Envelope & e ) : PartialMutator( e ) {}
00236         
00239         void operator()( Partial & p ) const;
00240 };
00241 
00242 
00243 
00244 
00251 
00252 template< class Arg >
00253 void setBandwidth( Partial & p, const Arg & arg )
00254 {
00255         BandwidthSetter setter( arg );
00256         setter( p );
00257 }
00258 
00259 
00260 
00261 
00269 
00270 template< class Iter, class Arg >
00271 void setBandwidth( Iter b, Iter e, const Arg & arg )
00272 {
00273         BandwidthSetter setter( arg );
00274         while ( b != e )
00275         {
00276                 setter( *b++ );
00277         }
00278 }
00279 
00280 
00281 
00282 
00285 
00286 class FrequencyScaler : public PartialMutator
00287 {
00288 public:
00289 
00291         FrequencyScaler( double x ) : PartialMutator( x ) {}
00292         
00295         FrequencyScaler( const Envelope & e ) : PartialMutator( e ) {}
00296         
00299         void operator()( Partial & p ) const;
00300 };
00301 
00302 
00303 
00304 
00311 
00312 template< class Arg >
00313 void scaleFrequency( Partial & p, const Arg & arg )
00314 {
00315         FrequencyScaler scaler( arg );
00316         scaler( p );
00317 }
00318 
00319 
00320 
00321 
00329 
00330 template< class Iter, class Arg >
00331 void scaleFrequency( Iter b, Iter e, const Arg & arg )
00332 {
00333         FrequencyScaler scaler( arg );
00334         while ( b != e )
00335         {
00336                 scaler( *b++ );
00337         }
00338 }
00339 
00340 
00341 
00342 
00345 
00346 class NoiseRatioScaler : public PartialMutator
00347 {
00348 public:
00349 
00351         NoiseRatioScaler( double x ) : PartialMutator( x ) {}
00352 
00355         NoiseRatioScaler( const Envelope & e ) : PartialMutator( e ) {}
00356         
00359         void operator()( Partial & p ) const;
00360 };
00361 
00362 
00363 
00364 
00371 
00372 template< class Arg >
00373 void scaleNoiseRatio( Partial & p, const Arg & arg )
00374 {
00375         NoiseRatioScaler scaler( arg );
00376         scaler( p );
00377 }
00378 
00379 
00380 
00381 
00389 
00390 template< class Iter, class Arg >
00391 void scaleNoiseRatio( Iter b, Iter e, const Arg & arg )
00392 {
00393         NoiseRatioScaler scaler( arg );
00394         while ( b != e )
00395         {
00396                 scaler( *b++ );
00397         }
00398 }
00399 
00400 
00401 
00402 
00406 
00407 class PitchShifter : public PartialMutator
00408 {
00409 public:
00410 
00412         PitchShifter( double x ) : PartialMutator( x ) {}
00413 
00416         PitchShifter( const Envelope & e ) : PartialMutator( e ) {}
00417         
00420         void operator()( Partial & p ) const;
00421 };
00422 
00423 
00424 
00425 
00433 
00434 template< class Arg >
00435 void shiftPitch( Partial & p, const Arg & arg )
00436 {
00437         PitchShifter shifter( arg );
00438         shifter( p );
00439 }
00440 
00441 
00442 
00443 
00452 
00453 template< class Iter, class Arg >
00454 void shiftPitch( Iter b, Iter e, const Arg & arg )
00455 {
00456         PitchShifter shifter( arg );
00457         while ( b != e )
00458         {
00459                 shifter( *b++ );
00460         }
00461 }
00462 
00463 
00464 
00465 
00466 
00467 
00468 
00471 class Cropper
00472 {
00473 public:
00474 
00478         Cropper( double t1, double t2 ) : 
00479                 minTime( std::min( t1, t2 ) ),
00480                 maxTime( std::max( t1, t2 ) )
00481         {
00482         }
00483         
00488         void operator()( Partial & p ) const;
00489         
00490 private:
00491         double minTime, maxTime;
00492 };
00493 
00494 
00495 
00496 
00508 
00509 inline
00510 void crop( Partial & p, double t1, double t2 )
00511 {
00512         Cropper cropper( t1, t2 );
00513         cropper( p );
00514 }
00515 
00516 
00517 
00518 
00531 
00532 template< class Iter >
00533 void crop( Iter b, Iter e, double t1, double t2 )
00534 {
00535         Cropper cropper( t1, t2 );
00536         while ( b != e )
00537         {
00538                 cropper( *b++ );
00539         }
00540 }
00541 
00542 
00543 
00544 
00547 
00548 class TimeShifter
00549 {
00550 public:
00551 
00553         TimeShifter( double x ) : offset( x ) {}
00554         
00557         void operator()( Partial & p ) const;
00558         
00559 private:
00560         double offset;
00561 };
00562 
00563 
00564 
00565 
00571 
00572 inline
00573 void shiftTime( Partial & p, double offset )
00574 {
00575         TimeShifter shifter( offset );
00576         shifter( p );
00577 }
00578 
00579 
00580 
00581 
00588 
00589 template< class Iter >
00590 void shiftTime( Iter b, Iter e, double offset )
00591 {
00592         TimeShifter shifter( offset );
00593         while ( b != e )
00594         {
00595                 shifter( *b++ );
00596         }
00597 }
00598         
00599 
00600 
00601 
00605 
00606 template < typename Iterator >
00607 std::pair< double, double > 
00608 timeSpan( Iterator begin, Iterator end ) 
00609 {
00610         double tmin = 0., tmax = 0.;
00611         if ( begin != end )
00612         {
00613                 Iterator it = begin;
00614                 tmin = it->startTime();
00615                 tmax = it->endTime();
00616                 while( it != end )
00617                 {
00618                         tmin = std::min( tmin, it->startTime() );
00619                         tmax = std::max( tmax, it->endTime() );
00620                         ++it;
00621                 }
00622         }
00623         return std::make_pair( tmin, tmax );
00624 }
00625 
00626 
00627 
00628 
00634 
00635 double peakAmplitude( const Partial & p );
00636 
00637 
00638 
00639 
00645 
00646 double avgAmplitude( const Partial & p );
00647 
00648 
00649 
00650 
00656 
00657 double avgFrequency( const Partial & p );
00658 
00659 
00660 
00661 
00668 
00669 double weightedAvgFrequency( const Partial & p );
00670 
00671 
00672 
00673 
00674 
00675 
00689 
00690 void fixPhaseBefore( Partial & p, double t );
00691 
00692 
00693 
00694 
00711 
00712 template < class Iter >
00713 void fixPhaseBefore( Iter b, Iter e, double t )
00714 {
00715     while ( b != e )
00716     {
00717         fixPhaseBefore( *b, t );
00718         ++b;
00719     }
00720 }
00721 
00722 
00723 
00724 
00737 
00738 void fixPhaseAfter( Partial & p, double t );
00739 
00740 
00741 
00742 
00758 
00759 template < class Iter >
00760 void fixPhaseAfter( Iter b, Iter e, double t )
00761 {
00762     while ( b != e )
00763     {
00764         fixPhaseAfter( *b, t );
00765         ++b;
00766     }
00767 }
00768 
00769 
00770 
00771 
00789 
00790 void fixPhaseForward( Partial & p, double tbeg, double tend );
00791 
00792 
00793 
00794 
00814 
00815 template < class Iter >
00816 void fixPhaseForward( Iter b, Iter e, double tbeg, double tend )
00817 {
00818     while ( b != e )
00819     {
00820         fixPhaseForward( *b, tbeg, tend );
00821         ++b;
00822     }
00823 }
00824 
00825 
00826 
00827 
00828 
00845 
00846 void fixPhaseAt( Partial & p, double t );
00847 
00848 
00849 
00850 
00870 
00871 template < class Iter >
00872 void fixPhaseAt( Iter b, Iter e, double t )
00873 {
00874     while ( b != e )
00875     {
00876         fixPhaseAt( *b, t );
00877         ++b;
00878     }
00879 }
00880 
00881 
00882 
00883 
00912 
00913 void fixPhaseBetween( Partial & p, double t1, double t2 );
00914 
00915 
00916 
00917 
00948 
00949 template < class Iter >
00950 void fixPhaseBetween( Iter b, Iter e, double t1, double t2 )
00951 {
00952     while ( b != e )
00953     {
00954         fixPhaseBetween( *b, t1, t2 );
00955         ++b;
00956     }
00957 }
00958 
00959 
00960         
00961 
00962 
00963 
00964 
00965 
00969 
00970 class isDurationLess : public std::unary_function< const Partial, bool >
00971 {
00972 public:
00974         isDurationLess( double x ) : mDurationSecs(x) {}
00975 
00977         bool operator()( const Partial & p ) const 
00978                 { return p.duration() < mDurationSecs; }
00979                 
00981         bool operator()( const Partial * p ) const 
00982                 { return p->duration() < mDurationSecs; }
00983         
00984 private:        
00985         double mDurationSecs;
00986 };
00987 
00988 
00989 
00990 
00993 
00994 class isLabelEqual : public std::unary_function< const Partial, bool >
00995 {
00996 public:
00998         isLabelEqual( int l ) : label(l) {}
00999         
01001         bool operator()( const Partial & p ) const 
01002                 { return p.label() == label; }
01003                 
01005         bool operator()( const Partial * p ) const 
01006                 { return p->label() == label; }
01007 
01008 private:        
01009         int label;
01010 };
01011         
01012 
01013 
01014 
01017 
01018 class isLabelGreater : public std::unary_function< const Partial, bool >
01019 {
01020 public:
01022         isLabelGreater( int l ) : label(l) {}
01023         
01025         bool operator()( const Partial & p ) const 
01026                 { return p.label() > label; }
01027                 
01029         bool operator()( const Partial * p ) const 
01030                 { return p->label() > label; }
01031 
01032 private:        
01033         int label;
01034 };
01035                 
01036 
01037 
01038 
01041 
01042 class isLabelLess : public std::unary_function< const Partial, bool >
01043 {
01044 public:
01046         isLabelLess( int l ) : label(l) {}
01047         
01049         bool operator()( const Partial & p ) const 
01050                 { return p.label() < label; }
01051                 
01053         bool operator()( const Partial * p ) const 
01054                 { return p->label() < label; }
01055 
01056 private:        
01057         int label;
01058 };
01059                 
01060 
01061 
01062 
01066 
01067 class isPeakLess : public std::unary_function< const Partial, bool >
01068 {
01069 public:
01071         isPeakLess( double x ) : thresh(x) {}
01072 
01074         bool operator()( const Partial & p ) const 
01075                 { return peakAmplitude( p ) < thresh; }
01076         
01078         bool operator()( const Partial * p ) const 
01079                 { return peakAmplitude( *p ) < thresh; }
01080 
01081 private:        
01082         double thresh;
01083 };
01084 
01085 
01086 
01087 
01088 
01089 
01093 
01094 class compareLabelLess : 
01095         public std::binary_function< const Partial, const Partial, bool >
01096 {
01097 public:
01101         bool operator()( const Partial & lhs, const Partial & rhs ) const 
01102                 { return lhs.label() < rhs.label(); }
01103 
01107         bool operator()( const Partial * lhs, const Partial * rhs ) const 
01108                 { return lhs->label() < rhs->label(); }
01109 };
01110 
01111 
01112 
01113 
01117 
01118 class compareDurationLess : 
01119         public std::binary_function< const Partial, const Partial, bool >
01120 {
01121 public:
01125         bool operator()( const Partial & lhs, const Partial & rhs ) const 
01126                 { return lhs.duration() < rhs.duration(); }
01127 
01131         bool operator()( const Partial * lhs, const Partial * rhs ) const 
01132                 { return lhs->duration() < rhs->duration(); }
01133 };
01134 
01135 
01136 
01137 
01141 
01142 class compareDurationGreater : 
01143         public std::binary_function< const Partial, const Partial, bool >
01144 {
01145 public:
01149         bool operator()( const Partial & lhs, const Partial & rhs ) const 
01150                 { return lhs.duration() > rhs.duration(); }
01151 
01155         bool operator()( const Partial * lhs, const Partial * rhs ) const 
01156                 { return lhs->duration() > rhs->duration(); }
01157 };
01158 
01159 
01160 
01161 
01165 
01166 class compareStartTimeLess : 
01167         public std::binary_function< const Partial, const Partial, bool >
01168 {
01169 public:
01173         bool operator()( const Partial & lhs, const Partial & rhs ) const 
01174                 { return lhs.startTime() < rhs.startTime(); }
01175 
01179         bool operator()( const Partial * lhs, const Partial * rhs ) const 
01180                 { return lhs->startTime() < rhs->startTime(); }
01181 };
01182 
01183 
01184 
01185 }       
01186 
01187 }       
01188 
01189 #endif