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();
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
for (int i = 0; i < n; ++i) {
|
||||
|
||||
@@ -45,21 +45,21 @@ public:
|
||||
|
||||
struct Parameters {
|
||||
int fftSize;
|
||||
int binCount;
|
||||
double sampleRate;
|
||||
Parameters(int _fftSize, double _sampleRate) :
|
||||
fftSize(_fftSize), sampleRate(_sampleRate) { }
|
||||
Parameters(int _fftSize, int _binCount, double _sampleRate) :
|
||||
fftSize(_fftSize), binCount(_binCount), sampleRate(_sampleRate) { }
|
||||
};
|
||||
|
||||
BinSegmenter(Parameters parameters) :
|
||||
m_parameters(parameters),
|
||||
m_binCount(m_parameters.fftSize/2 + 1),
|
||||
m_numeric(m_binCount, 0),
|
||||
m_classFilter(m_binCount / 64)
|
||||
m_numeric(m_parameters.binCount, 0),
|
||||
m_classFilter(16)
|
||||
{
|
||||
}
|
||||
|
||||
Segmentation segment(const BinClassifier::Classification *classification) {
|
||||
int n = m_binCount;
|
||||
int n = m_parameters.binCount;
|
||||
for (int i = 0; i < n; ++i) {
|
||||
switch (classification[i]) {
|
||||
case BinClassifier::Classification::Harmonic:
|
||||
@@ -79,12 +79,10 @@ public:
|
||||
}
|
||||
}
|
||||
double nyquist = m_parameters.sampleRate / 2.0;
|
||||
int top = binForFrequency(16000.0);
|
||||
if (top >= n) top = n-1;
|
||||
double f1 = nyquist;
|
||||
double f2 = nyquist;
|
||||
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 (!inPercussive) {
|
||||
inPercussive = true;
|
||||
@@ -103,7 +101,6 @@ public:
|
||||
|
||||
protected:
|
||||
Parameters m_parameters;
|
||||
int m_binCount;
|
||||
std::vector<int> m_numeric;
|
||||
MovingMedian<int> m_classFilter;
|
||||
|
||||
|
||||
@@ -43,12 +43,20 @@ R3StretcherImpl::R3StretcherImpl(Parameters parameters,
|
||||
m_prevOuthop(1),
|
||||
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
|
||||
(m_guideConfiguration.classificationFftSize,
|
||||
m_parameters.sampleRate);
|
||||
classificationBins, m_parameters.sampleRate);
|
||||
|
||||
BinClassifier::Parameters classifierParameters
|
||||
(m_guideConfiguration.classificationFftSize / 2 + 1,
|
||||
9, 1, 10, 2.0, 2.0, 1.0e-7);
|
||||
(classificationBins, 9, 1, 10, 2.0, 2.0, 1.0e-7);
|
||||
|
||||
int inRingBufferSize = m_guideConfiguration.longestFftSize * 2;
|
||||
int outRingBufferSize = m_guideConfiguration.longestFftSize * 16;
|
||||
|
||||
Reference in New Issue
Block a user