Don't run median filters for higher frequencies than we're going to use anyway

This commit is contained in:
Chris Cannam
2022-06-07 11:05:50 +01:00
parent 1bfd02c6f3
commit 8ed709d274
3 changed files with 21 additions and 14 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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;