summaryrefslogtreecommitdiff
path: root/src/audio/resample.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-08-08 11:36:10 +1000
committerjacqueline <me@jacqueline.id.au>2023-08-08 11:36:10 +1000
commit6c99f9f2fee0928987fe944c8ed29878064df87a (patch)
tree644c89eb56881e29bbe5627b0e0842b3adfedca4 /src/audio/resample.cpp
parent49f82d2f3d31f5ecb26f1f45d091e346da515314 (diff)
downloadtangara-fw-6c99f9f2fee0928987fe944c8ed29878064df87a.tar.gz
Fix resampler issue, do a little performance tuning
Diffstat (limited to 'src/audio/resample.cpp')
-rw-r--r--src/audio/resample.cpp33
1 files changed, 25 insertions, 8 deletions
diff --git a/src/audio/resample.cpp b/src/audio/resample.cpp
index aa4c8f2a..7accd0a1 100644
--- a/src/audio/resample.cpp
+++ b/src/audio/resample.cpp
@@ -17,8 +17,8 @@ namespace audio {
static constexpr char kTag[] = "resample";
static constexpr double kLowPassRatio = 0.5;
-static constexpr size_t kNumFilters = 8;
-static constexpr size_t kTapsPerFilter = 8;
+static constexpr size_t kNumFilters = 64;
+static constexpr size_t kTapsPerFilter = 16;
typedef std::array<float, kTapsPerFilter> Filter;
static std::array<Filter, kNumFilters + 1> sFilters{};
@@ -64,12 +64,15 @@ auto Resampler::Process(cpp::span<const sample::Sample> input,
size_t input_frames = input.size() / num_channels_;
size_t output_frames = output.size() / num_channels_;
- int half_taps = kTapsPerFilter / 2, i;
+ int half_taps = kTapsPerFilter / 2;
while (output_frames > 0) {
if (output_offset_ >= input_index_ - half_taps) {
if (input_frames > 0) {
+ // Check whether the channel buffers will overflow with the addition of
+ // this sample. If so, we need to move the remaining contents back to
+ // the beginning of the buffer.
if (input_index_ == channel_buffer_size_) {
- for (i = 0; i < num_channels_; ++i) {
+ for (int i = 0; i < num_channels_; ++i) {
memmove(channel_buffers_[i],
channel_buffers_[i] + channel_buffer_size_ - kTapsPerFilter,
kTapsPerFilter * sizeof(float));
@@ -79,21 +82,23 @@ auto Resampler::Process(cpp::span<const sample::Sample> input,
input_index_ -= channel_buffer_size_ - kTapsPerFilter;
}
- for (i = 0; i < num_channels_; ++i) {
+ for (int i = 0; i < num_channels_; ++i) {
channel_buffers_[i][input_index_] =
sample::ToFloat(input[samples_used++]);
}
input_index_++;
input_frames--;
- } else
+ } else {
break;
+ }
} else {
- for (i = 0; i < num_channels_; i++) {
+ for (int i = 0; i < num_channels_; i++) {
output[samples_produced++] = sample::FromFloat(Subsample(i));
}
output_offset_ += (1.0f / factor_);
+ output_frames--;
}
}
@@ -160,8 +165,20 @@ auto Resampler::Subsample(int channel) -> float {
source = source.subspan(offset_integral);
float offset_fractional = output_offset_ - offset_integral;
- int filter_index = offset_fractional * kNumFilters;
+ /*
+// no interpolate
+size_t filter_index = std::floor(offset_fractional * kNumFilters + 0.5f);
+//ESP_LOGI(kTag, "selected filter %u of %u", filter_index, kNumFilters);
+int start_offset = kTapsPerFilter / 2 + 1;
+//ESP_LOGI(kTag, "using offset of %i, length %u", start_offset, kTapsPerFilter);
+
+return ApplyFilter(
+ sFilters[filter_index],
+ {source.data() - start_offset, kTapsPerFilter});
+ */
+
offset_fractional *= kNumFilters;
+ int filter_index = std::floor(offset_fractional);
sum1 = ApplyFilter(sFilters[filter_index],
{source.data() - kTapsPerFilter / 2 + 1, kTapsPerFilter});