Don't run median filters for higher frequencies than we're going to use anyway
This commit is contained in:
@@ -98,7 +98,9 @@ public:
|
|||||||
m_hFilters->reset();
|
m_hFilters->reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void classify(const double *const mag, Classification *classification) {
|
void classify(const double *const mag, // input, of at least binCount bins
|
||||||
|
Classification *classification) // output, of binCount bins
|
||||||
|
{
|
||||||
const int n = m_parameters.binCount;
|
const int n = m_parameters.binCount;
|
||||||
|
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
|
|||||||
@@ -45,21 +45,21 @@ public:
|
|||||||
|
|
||||||
struct Parameters {
|
struct Parameters {
|
||||||
int fftSize;
|
int fftSize;
|
||||||
|
int binCount;
|
||||||
double sampleRate;
|
double sampleRate;
|
||||||
Parameters(int _fftSize, double _sampleRate) :
|
Parameters(int _fftSize, int _binCount, double _sampleRate) :
|
||||||
fftSize(_fftSize), sampleRate(_sampleRate) { }
|
fftSize(_fftSize), binCount(_binCount), sampleRate(_sampleRate) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
BinSegmenter(Parameters parameters) :
|
BinSegmenter(Parameters parameters) :
|
||||||
m_parameters(parameters),
|
m_parameters(parameters),
|
||||||
m_binCount(m_parameters.fftSize/2 + 1),
|
m_numeric(m_parameters.binCount, 0),
|
||||||
m_numeric(m_binCount, 0),
|
m_classFilter(16)
|
||||||
m_classFilter(m_binCount / 64)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Segmentation segment(const BinClassifier::Classification *classification) {
|
Segmentation segment(const BinClassifier::Classification *classification) {
|
||||||
int n = m_binCount;
|
int n = m_parameters.binCount;
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
switch (classification[i]) {
|
switch (classification[i]) {
|
||||||
case BinClassifier::Classification::Harmonic:
|
case BinClassifier::Classification::Harmonic:
|
||||||
@@ -79,12 +79,10 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
double nyquist = m_parameters.sampleRate / 2.0;
|
double nyquist = m_parameters.sampleRate / 2.0;
|
||||||
int top = binForFrequency(16000.0);
|
|
||||||
if (top >= n) top = n-1;
|
|
||||||
double f1 = nyquist;
|
double f1 = nyquist;
|
||||||
double f2 = nyquist;
|
double f2 = nyquist;
|
||||||
bool inPercussive = false;
|
bool inPercussive = false;
|
||||||
for (int i = top; i > 0; --i) {
|
for (int i = n - 1; i > 0; --i) {
|
||||||
if (m_numeric[i] == 1) { // percussive
|
if (m_numeric[i] == 1) { // percussive
|
||||||
if (!inPercussive) {
|
if (!inPercussive) {
|
||||||
inPercussive = true;
|
inPercussive = true;
|
||||||
@@ -103,7 +101,6 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
Parameters m_parameters;
|
Parameters m_parameters;
|
||||||
int m_binCount;
|
|
||||||
std::vector<int> m_numeric;
|
std::vector<int> m_numeric;
|
||||||
MovingMedian<int> m_classFilter;
|
MovingMedian<int> m_classFilter;
|
||||||
|
|
||||||
|
|||||||
@@ -43,12 +43,20 @@ R3StretcherImpl::R3StretcherImpl(Parameters parameters,
|
|||||||
m_prevOuthop(1),
|
m_prevOuthop(1),
|
||||||
m_draining(false)
|
m_draining(false)
|
||||||
{
|
{
|
||||||
|
double maxClassifierFrequency = 16000.0;
|
||||||
|
if (maxClassifierFrequency > m_parameters.sampleRate/2) {
|
||||||
|
maxClassifierFrequency = m_parameters.sampleRate/2;
|
||||||
|
}
|
||||||
|
int classificationBins =
|
||||||
|
int(floor(m_guideConfiguration.classificationFftSize *
|
||||||
|
maxClassifierFrequency / m_parameters.sampleRate));
|
||||||
|
|
||||||
BinSegmenter::Parameters segmenterParameters
|
BinSegmenter::Parameters segmenterParameters
|
||||||
(m_guideConfiguration.classificationFftSize,
|
(m_guideConfiguration.classificationFftSize,
|
||||||
m_parameters.sampleRate);
|
classificationBins, m_parameters.sampleRate);
|
||||||
|
|
||||||
BinClassifier::Parameters classifierParameters
|
BinClassifier::Parameters classifierParameters
|
||||||
(m_guideConfiguration.classificationFftSize / 2 + 1,
|
(classificationBins, 9, 1, 10, 2.0, 2.0, 1.0e-7);
|
||||||
9, 1, 10, 2.0, 2.0, 1.0e-7);
|
|
||||||
|
|
||||||
int inRingBufferSize = m_guideConfiguration.longestFftSize * 2;
|
int inRingBufferSize = m_guideConfiguration.longestFftSize * 2;
|
||||||
int outRingBufferSize = m_guideConfiguration.longestFftSize * 16;
|
int outRingBufferSize = m_guideConfiguration.longestFftSize * 16;
|
||||||
|
|||||||
Reference in New Issue
Block a user