From f027a59fa490e1ca521a0f4a8ff5a23522a980b7 Mon Sep 17 00:00:00 2001 From: Chris Cannam Date: Mon, 8 Aug 2022 16:55:53 +0100 Subject: [PATCH] I don't like adjusting the rational approximation - it changes (even if only nominally) the effective ratio based on quality. I think this is more appropriate --- src/common/BQResampler.cpp | 27 ++++++++++++++++++--------- src/common/BQResampler.h | 2 +- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/common/BQResampler.cpp b/src/common/BQResampler.cpp index 384e159..a3ae269 100644 --- a/src/common/BQResampler.cpp +++ b/src/common/BQResampler.cpp @@ -122,7 +122,7 @@ BQResampler::QualityParams::QualityParams(Quality q) k_snr = 70.0; k_transition = 0.2; cut = 0.9; - rational_max = 48000; + length_max = 576000; break; case FastestTolerable: p_multiple = 62; @@ -130,7 +130,7 @@ BQResampler::QualityParams::QualityParams(Quality q) k_snr = 90.0; k_transition = 0.05; cut = 0.975; - rational_max = 96000; + length_max = 1024000; break; case Best: p_multiple = 122; @@ -138,7 +138,7 @@ BQResampler::QualityParams::QualityParams(Quality q) k_snr = 100.0; k_transition = 0.01; cut = 0.995; - rational_max = 192000; + length_max = 0; break; } } @@ -378,12 +378,7 @@ BQResampler::pick_params(double ratio) const { // Farey algorithm, see // https://www.johndcook.com/blog/2010/10/20/best-rational-approximation/ - int max_denom; - if (m_dynamism == RatioMostlyFixed) { - max_denom = 192000; - } else { - max_denom = m_qparams.rational_max; - } + int max_denom = 192000; double a = 0.0, b = 1.0, c = 1.0, d = 0.0; double pa = a, pb = b, pc = c, pd = d; double eps = 1e-9; @@ -500,6 +495,20 @@ BQResampler::state_for_ratio(BQResampler::state &target_state, target_state.filter_length = int(parameters.peak_to_zero * m_qparams.p_multiple + 1); + if (m_qparams.length_max > 0 && + target_state.filter_length > m_qparams.length_max) { + int reduced_multiple = + int(floor(double(m_qparams.length_max) / parameters.peak_to_zero)); + int reduced_length = + int(parameters.peak_to_zero * reduced_multiple + 1); + if (m_debug_level > 0) { + cerr << "BQResampler: reducing filter length from " + << target_state.filter_length << " to " + << reduced_length << " based on quality settings" << endl; + } + target_state.filter_length = reduced_length; + } + if (target_state.filter_length % 2 == 0) { ++target_state.filter_length; } diff --git a/src/common/BQResampler.h b/src/common/BQResampler.h index 7319c5d..99a7ef7 100644 --- a/src/common/BQResampler.h +++ b/src/common/BQResampler.h @@ -71,7 +71,7 @@ private: double k_snr; double k_transition; double cut; - int rational_max; + int length_max; QualityParams(Quality); };