00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef MARSYAS_F0ANALYSIS_H
00020 #define MARSYAS_F0ANALYSIS_H
00021
00022 #include "MarSystem.h"
00023
00024 namespace Marsyas
00025 {
00041 class F0Analysis: public MarSystem
00042 {
00043 public:
00044 F0Analysis(mrs_string inName);
00045 F0Analysis(const F0Analysis& inToCopy);
00046
00047 ~F0Analysis();
00048
00049 MarSystem* clone() const;
00050
00051 void addControls();
00052 void myUpdate(MarControlPtr inSender);
00053 void myProcess(realvec& inVec, realvec& outVec);
00054
00055 private:
00056
00057 MarControlPtr ctrl_SampleRate_;
00058 MarControlPtr ctrl_NrOfHarmonics_;
00059 MarControlPtr ctrl_F0Weight_;
00060 MarControlPtr ctrl_Attenuation_;
00061 MarControlPtr ctrl_Tolerance_;
00062 MarControlPtr ctrl_LowestF0_;
00063 MarControlPtr ctrl_Compression_;
00064
00065
00066 mrs_real SampleRate_;
00067 mrs_natural NrOfHarmonics_;
00068 mrs_real F0Weight_;
00069 mrs_real Attenuation_;
00070 mrs_real Tolerance_;
00071 mrs_real LowestF0_;
00072 mrs_real Compression_;
00073
00074 mrs_real ChordEvidence_;
00075
00076
00077 typedef std::map<double,double,std::less<double> > FreqMap;
00078 typedef std::map<double,double,std::greater<float> > HarmMap;
00079 typedef std::map<double,std::vector<double>,std::less<double> > F2Fs;
00080
00081 bool FindCandidateF0s(const realvec& inPeaks,
00082 HarmMap& outHarmSums, F2Fs& outF0ToFks) const;
00083 bool SelectUnrelatedF0s(const realvec& inPeaks, const HarmMap inHarmSums,
00084 const F2Fs& inF0ToFks, realvec& outNoteEvidences);
00085
00086 mrs_real ComputePowerOfF0(const FreqMap inPeaks, const F2Fs& inF0ToFks, double inF0) const;
00087 mrs_real ComputePowerOfInput(const FreqMap inPeaks) const;
00088 mrs_real ComputePowerOfHyp(const FreqMap inPeaks, const F2Fs& inF0ToFks,
00089 realvec& inNoteEvidence) const;
00090 };
00091
00092 }
00093
00094 #endif