Mercurial > hg > pyin
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 } |