comparison Yin.cpp @ 117:1b75e5fd4b99 tony

sorted out precise timing, chose parameters
author matthiasm
date Mon, 23 Mar 2015 17:28:34 +0000
parents 7ef7f6e90966
children 7cbf40306c10
comparison
equal deleted inserted replaced
116:e9b99e85b929 117:1b75e5fd4b99
23 #include <cmath> 23 #include <cmath>
24 #include <complex> 24 #include <complex>
25 25
26 using std::vector; 26 using std::vector;
27 27
28 Yin::Yin(size_t frameSize, size_t inputSampleRate, double thresh) : 28 Yin::Yin(size_t frameSize, size_t inputSampleRate, double thresh, bool fast) :
29 m_frameSize(frameSize), 29 m_frameSize(frameSize),
30 m_inputSampleRate(inputSampleRate), 30 m_inputSampleRate(inputSampleRate),
31 m_thresh(thresh), 31 m_thresh(thresh),
32 m_threshDistr(2), 32 m_threshDistr(2),
33 m_yinBufferSize(frameSize/2) 33 m_yinBufferSize(frameSize/2),
34 m_fast(fast)
34 { 35 {
35 if (frameSize & (frameSize-1)) { 36 if (frameSize & (frameSize-1)) {
36 // throw "N must be a power of two"; 37 // throw "N must be a power of two";
37 } 38 }
38 } 39 }
45 Yin::process(const double *in) const { 46 Yin::process(const double *in) const {
46 47
47 double* yinBuffer = new double[m_yinBufferSize]; 48 double* yinBuffer = new double[m_yinBufferSize];
48 49
49 // calculate aperiodicity function for all periods 50 // calculate aperiodicity function for all periods
50 YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); 51 if (m_fast) YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize);
52 else YinUtil::slowDifference(in, yinBuffer, m_yinBufferSize);
53
51 YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); 54 YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize);
52 55
53 int tau = 0; 56 int tau = 0;
54 tau = YinUtil::absoluteThreshold(yinBuffer, m_yinBufferSize, m_thresh); 57 tau = YinUtil::absoluteThreshold(yinBuffer, m_yinBufferSize, m_thresh);
55 58
84 Yin::processProbabilisticYin(const double *in) const { 87 Yin::processProbabilisticYin(const double *in) const {
85 88
86 double* yinBuffer = new double[m_yinBufferSize]; 89 double* yinBuffer = new double[m_yinBufferSize];
87 90
88 // calculate aperiodicity function for all periods 91 // calculate aperiodicity function for all periods
89 YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize); 92 if (m_fast) YinUtil::fastDifference(in, yinBuffer, m_yinBufferSize);
93 else YinUtil::slowDifference(in, yinBuffer, m_yinBufferSize);
94
90 YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize); 95 YinUtil::cumulativeDifference(yinBuffer, m_yinBufferSize);
91 96
92 vector<double> peakProbability = YinUtil::yinProb(yinBuffer, m_threshDistr, m_yinBufferSize); 97 vector<double> peakProbability = YinUtil::yinProb(yinBuffer, m_threshDistr, m_yinBufferSize);
93 98
94 // calculate overall "probability" from peak probability 99 // calculate overall "probability" from peak probability
138 m_frameSize = parameter; 143 m_frameSize = parameter;
139 m_yinBufferSize = m_frameSize/2; 144 m_yinBufferSize = m_frameSize/2;
140 return 0; 145 return 0;
141 } 146 }
142 147
143 // int 148 int
144 // Yin::setRemoveUnvoiced(bool parameter) 149 Yin::setFast(bool parameter)
145 // { 150 {
146 // m_removeUnvoiced = parameter; 151 m_fast = parameter;
147 // return 0; 152 return 0;
148 // } 153 }