Mercurial > hg > vamp-fanchirp
changeset 25:8e57d2f41926 maxpartial
Experiment at limiting number of partials (for speed). Interacts badly with harmonic correction, so doesn't work at the mo
author | Chris Cannam |
---|---|
date | Thu, 04 Oct 2018 15:42:03 +0100 |
parents | 430c730ae912 |
children | |
files | FChTransformF0gram.cpp FChTransformF0gram.h |
diffstat | 2 files changed, 25 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/FChTransformF0gram.cpp Thu Oct 04 15:22:23 2018 +0100 +++ b/FChTransformF0gram.cpp Thu Oct 04 15:42:03 2018 +0100 @@ -26,7 +26,7 @@ using namespace breakfastquay; -#define DEBUG +//#define DEBUG #define MAX(x, y) (((x) > (y)) ? (x) : (y)) @@ -58,6 +58,7 @@ m_f0_params.f0min = 80.0; m_f0_params.num_octs = 4; m_f0_params.num_f0s_per_oct = 192; + m_f0_params.max_partials = 200; m_f0_params.prefer = true; m_f0_params.prefer_mean = 60; m_f0_params.prefer_stdev = 18; @@ -330,6 +331,18 @@ f0s_per_oct.quantizeStep = 1.0; list.push_back(f0s_per_oct); + ParameterDescriptor f0s_max_partials; + f0s_max_partials.identifier = "f0s_max_partials"; + f0s_max_partials.name = "Max partials per f0"; + f0s_max_partials.description = "Maximum number of partials to take into account for each f0 value. 0 = no limit (up to max frequency)."; + f0s_max_partials.unit = ""; + f0s_max_partials.minValue = 0; + f0s_max_partials.maxValue = 500; + f0s_max_partials.defaultValue = 200; + f0s_max_partials.isQuantized = true; + f0s_max_partials.quantizeStep = 10; + list.push_back(f0s_max_partials); + ParameterDescriptor f0_prefer_fun; f0_prefer_fun.identifier = "f0_prefer_fun"; f0_prefer_fun.name = "Use f0 weighting"; @@ -405,6 +418,8 @@ return m_f0_params.num_octs; } else if (identifier == "f0s_per_oct") { return m_f0_params.num_f0s_per_oct; + } else if (identifier == "f0s_max_partials") { + return m_f0_params.max_partials; } else if (identifier == "f0_prefer_fun") { return m_f0_params.prefer ? 1.0 : 0.0; } else if (identifier == "f0_prefer_mean") { @@ -443,6 +458,8 @@ m_f0_params.num_octs = value; } else if (identifier == "f0s_per_oct") { m_f0_params.num_f0s_per_oct = value; + } else if (identifier == "f0s_max_partials") { + m_f0_params.max_partials = int(roundf(value)); } else if (identifier == "f0_prefer_fun") { m_f0_params.prefer = (value > 0.5); } else if (identifier == "f0_prefer_mean") { @@ -596,6 +613,11 @@ m_glogs_f0[i] = (m_f0_params.f0min/5.0)*pow(2.0,(double)i/(double)m_f0_params.num_f0s_per_oct); // for every f0 compute number of partials less or equal than m_fmax. m_glogs_n[i] = m_fmax*factor/m_glogs_f0[i]; + if (m_f0_params.max_partials > 0) { + if (m_glogs_n[i] > m_f0_params.max_partials) { + m_glogs_n[i] = m_f0_params.max_partials; + } + } m_glogs_index[i] = m_glogs_harmonic_count; m_glogs_harmonic_count += m_glogs_n[i]; } @@ -1010,7 +1032,7 @@ // Median, sigma $ weights correction m_glogs[i + i_warp*m_glogs_num_f0s] = (m_glogs[i + i_warp*m_glogs_num_f0s]-m_glogs_median_correction[i-m_glogs_init_f0s])*m_glogs_sigma_correction[i-m_glogs_init_f0s]*m_glogs_f0_preference_weights[i-m_glogs_init_f0s]; } - + // Look for maximum value to determine best direction for (int i = m_glogs_init_f0s; i < m_glogs_num_f0s-m_f0_params.num_f0s_per_oct; i++) { if (m_glogs[i + i_warp*m_glogs_num_f0s] > max_glogs) {
--- a/FChTransformF0gram.h Thu Oct 04 15:22:23 2018 +0100 +++ b/FChTransformF0gram.h Thu Oct 04 15:42:03 2018 +0100 @@ -108,6 +108,7 @@ double f0min; // minimun fundamental frequency int num_octs; // number of octaves int num_f0s_per_oct; // number of f0s per octave + int max_partials; // maximum partial count per f0 (0 = unlimited up to max freq) bool prefer; // whether to use a f0 preference guassian function int prefer_mean; // mean of f0 preference function (MIDI number for C4) int prefer_stdev; // stdev of f0 preference function (stdev in MIDI numbers)