Skip to content

fix: accurate GetLatency startup deficit, polyphase hardening, and dead code retirement - #57

Merged
tphakala merged 6 commits into
masterfrom
fix/latency-deficit-and-polyphase-cleanup
Jul 17, 2026
Merged

fix: accurate GetLatency startup deficit, polyphase hardening, and dead code retirement#57
tphakala merged 6 commits into
masterfrom
fix/latency-deficit-and-polyphase-cleanup

Conversation

@tphakala

@tphakala tphakala commented Jul 17, 2026

Copy link
Copy Markdown
Owner

Closes all four follow-up issues from #56 in one bundle, since they touch the same polyphase and latency subsystem.

#52 (bug): constantRateResampler.GetLatency summed per-stage group-delay heuristics across mixed rate domains, mis-reporting the startup deficit on multi-stage pipelines (672 reported vs 703 measured at 44100 to 96000 QualityHigh; the numbers in the issue body predate #56, see the issue comment). The engine Resampler now exposes StartupDeficit(), the un-rounded deficit in output samples that Latency() ceils, and GetLatency accumulates each stage's fractional deficit through the downstream stage ratios before rounding once. Accuracy is within 2 samples across presets and ratios, pinned by a numeric test covering QualityQuick through QualityHigh plus a dedicated test for the non-deficit-stage fallback. Compile-time assertions in stages.go keep every production stage type on the accurate path, and the Resampler interface doc plus README now describe the new semantics.

#53: the Catmull-Rom interpolation bank construction now lives in one shared buildCubicInterpBanks helper used by both NewPolyphaseStage and the phase-wrap measurement test, so the test varies only the boundary-indexing policy. The bank-equality assertion pins the extraction bit-for-bit.

#54: new TestQualityRegression_THD_ActiveInterpolation pins full-pipeline THD at 32000 to 44100 and 44100 to 64000, the ratio class where the sub-phase interpolation banks are actually consulted (the #56 defect class). High gets a dedicated -145 dB limit (worst measured -151.63 dB); Medium and Low reuse the existing constants with 6.0 and 9.5 dB margins. The wider ratio survey mentioned in the issue is not included.

#55: retired the diverged duplicate polyphase design path (internal/filter/polyphase.go plus its test file), its only consumer cmd/analyze-filter, the production-dead LinearStage with its constants and test references, the CI build line, and the stale codecov ignore. kaiser.go stays; the engine depends on it. Net -1100 lines.

Review: plan and full diff peer-reviewed via agy (Opus 4.6 and Gemini 3.1 Pro), then a 12-agent gate pass (reuse, correctness, quality, integration, regression, test quality, Go performance) plus Gemini cross-validation; all findings fixed in the final commit, with hot-path benchmarks statistically unchanged vs master and allocations identical.

Closes #52
Closes #53
Closes #54
Closes #55

Summary by CodeRabbit

  • New Features

    • Improved latency reporting to accurately reflect startup delay in output samples, including multi-stage pipelines.
    • Updated quick-quality resampling to use cubic interpolation with reduced latency.
    • Made Flush terminal; subsequent processing starts a fresh stream.
  • Bug Fixes

    • Improved streaming behavior and latency accuracy across supported resampling configurations.
    • Added quality safeguards for active-interpolation resampling paths.
  • Documentation

    • Clarified latency and streaming behavior in the README and changelog.

tphakala added 5 commits July 17, 2026 20:00
The phase-wrap measurement test previously re-derived the Catmull-Rom
bank construction to build its differential reference, so a formula
change would have required lockstep edits. NewPolyphaseStage and the
test now share buildCubicInterpBanks and the test varies only the
boundary-indexing policy. The bank-equality assertion pins the
extraction bit-for-bit.

Refs #53
quality_regression_test.go previously exercised only exact-rational or
integer ratios where the sub-phase interpolation banks are never
consulted, so the phase-boundary indexing fix from #56 was guarded only
at stage level. Add THD assertions through the whole resampler at
32000->44100 and 44100->64000 for High, Medium, and Low. High gets a
dedicated tighter limit (-145 dB, worst measured -151.63 dB); Medium and
Low fall within margin of the existing constants and reuse them.

Refs #54
…tency

GetLatency summed per-stage group-delay heuristics whose terms live in
different rate domains, so multi-stage pipelines mis-reported the
startup deficit (672 reported vs 703 measured at 44100 to 96000
QualityHigh). The engine Resampler now exposes StartupDeficit(), the
un-rounded deficit in output samples that Latency() ceils, CubicStage
mirrors it, and GetLatency accumulates each stage's fractional deficit
through the downstream stage ratios before rounding once. Accuracy is
now within 2 samples across presets and ratios, pinned by a numeric
test on the New(config) path.

Refs #52
internal/filter/polyphase.go carried a parallel polyphase design
implementation that diverged from the engine (edge clamping, DC-gain
normalization, unchecked GetCoefficient, duplicated cubic constants)
and was consumed only by the cmd/analyze-filter diagnostic, so the tool
analyzed a filter the product never ships. Remove both along with the
production-dead LinearStage and its constants; the engine's design code
in internal/engine is now the single polyphase implementation. kaiser.go
stays, the engine depends on it.

Refs #55
Gate review follow-ups: README no longer describes the retired
group-delay semantics of GetLatency on the New(config) path; the
duck-typed deficit assertion uses a named startupDeficitStage interface
with compile-time assertions in stages.go so a refactor of the
StageAdapter embedding fails the build instead of silently degrading to
the group-delay fallback; the cubic deficit formula lives only in
CubicStage.StartupDeficit with the engine delegating to it; the config
path latency test now covers QualityQuick and a new test pins the
fallback branch including its downstream-ratio conversion;
TestCubicStageGetters asserts the new getter; stale or imprecise
comments corrected (StageAdapter.GetLatency consumer note, THD margin
arithmetic, duplicated bank-build description, what the bank-equality
pin does and does not guard).

Refs #52 #53 #54
@gemini-code-assist

Copy link
Copy Markdown

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 51 minutes

Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 096c5fb0-9f46-4ac4-a3c8-a8be24b63b51

📥 Commits

Reviewing files that changed from the base of the PR and between e84369d and 63852b4.

📒 Files selected for processing (1)
  • internal/engine/quality_regression_test.go

Walkthrough

The PR corrects multi-stage startup-deficit latency reporting, centralizes cubic coefficient-bank construction, expands active-interpolation regression tests, removes duplicate polyphase and linear-stage implementations, updates documentation, and adjusts CI command builds.

Changes

Latency and interpolation updates

Layer / File(s) Summary
Startup-deficit latency accounting
constant.go, internal/engine/resampler.go, internal/engine/cubic.go, stages.go, internal/engine/stage_adapter.go, latency_test.go, resample.go, README.md, CHANGELOG.md
Latency now accumulates fractional startup deficits in output-sample units, rounds once, supports fallback stages, and documents the updated GetLatency meaning.
Shared cubic coefficient-bank construction
internal/engine/polyphase_stage.go, internal/engine/phase_wrap_measure_test.go
Cubic coefficient-bank generation is shared between production polyphase construction and phase-wrap measurements.
Cubic interpolation validation
internal/engine/constants.go, internal/engine/buffer_integrity_test.go, internal/engine/extra_engine_test.go, internal/engine/reset_state_test.go, internal/engine/edge_cases_test.go, internal/engine/quality_regression_test.go
Cubic interpolation constants and tests replace linear-stage coverage, and active-interpolation THD regression cases are added.
Duplicate implementation removal and CI updates
internal/filter/polyphase.go, cmd/analyze-filter/analyze_filter_gain.go, internal/engine/cubic.go, .github/workflows/ci.yml, codecov.yml, CHANGELOG.md
The duplicate polyphase filter path, analyze-filter command, and production-dead linear stage are removed; CI builds the remaining CLI tools and Codecov ignore rules are updated.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant constantRateResampler
  participant StageAdapter
  participant Resampler
  Caller->>constantRateResampler: GetLatency()
  constantRateResampler->>StageAdapter: inspect StartupDeficit()
  StageAdapter->>Resampler: obtain fractional deficit
  Resampler-->>constantRateResampler: return deficit in output samples
  constantRateResampler-->>Caller: return ceil(total deficit)
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately summarizes the latency fix, polyphase cleanup, and dead-code removal.
Linked Issues check ✅ Passed [#52-#55] The code changes address the latency fix, shared bank helper, active-interpolation THD regression, and duplicate/dead-code removal.
Out of Scope Changes check ✅ Passed No unrelated changes stand out; the docs, CI, and coverage updates support the latency and polyphase cleanup work.
Docstring Coverage ✅ Passed Docstring coverage is 91.67% which is sufficient. The required threshold is 80.00%.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/latency-deficit-and-polyphase-cleanup

Comment @coderabbitai help to get the list of available commands.

@codecov

codecov Bot commented Jul 17, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.72727% with 1 line in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
internal/engine/resampler.go 80.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@github-actions

github-actions Bot commented Jul 17, 2026

Copy link
Copy Markdown

Benchmark Comparison

goos: linux
goarch: amd64
pkg: github.com/tphakala/go-audio-resampler
cpu: AMD EPYC 7763 64-Core Processor                
                                    │ /home/runner/work/_temp/base.bench │  /home/runner/work/_temp/pr.bench  │
                                    │               sec/op               │    sec/op     vs base              │
ProcessMultiSequential-4                                    12.26m ±  9%   12.38m ±  3%       ~ (p=1.000 n=6)
ProcessMultiParallel-4                                      7.478m ± 11%   7.313m ± 22%       ~ (p=0.818 n=6)
ProcessMultiChannels/Mono-4                                 6.089m ±  2%   6.199m ±  2%       ~ (p=0.132 n=6)
ProcessMultiChannels/Stereo-4                               7.285m ±  8%   7.560m ± 12%       ~ (p=0.589 n=6)
ProcessMultiChannels/Quad-4                                 11.65m ±  0%   11.80m ± 79%       ~ (p=0.065 n=6)
ProcessMultiChannels/5.1-4                                  19.13m ±  4%   18.78m ± 17%       ~ (p=0.818 n=6)
ProcessMultiChannels/7.1-4                                  22.90m ±  1%   22.89m ± 10%       ~ (p=0.937 n=6)
Process_Allocations-4                                       4.869m ±  1%   4.940m ±  1%  +1.46% (p=0.002 n=6)
ProcessInto_Allocations-4                                   4.747m ±  2%   4.759m ±  3%       ~ (p=0.310 n=6)
Process_Allocations_48to32-4                                9.071m ±  1%   9.074m ±  2%       ~ (p=0.589 n=6)
ProcessInto_Allocations_48to32-4                            8.670m ±  1%   8.662m ±  1%       ~ (p=0.818 n=6)
Process_Allocations_48to32_5s-4                             15.15m ±  0%   15.19m ±  4%       ~ (p=0.310 n=6)
ProcessInto_Allocations_48to32_5s-4                         14.55m ±  0%   14.91m ±  2%  +2.43% (p=0.004 n=6)
ProcessInto_Warm_48to32-4                                   14.37m ±  0%   14.42m ±  0%       ~ (p=0.240 n=6)
ProcessIntoFloat32_Warm_48to32-4                            12.01m ±  0%   12.04m ±  1%       ~ (p=0.310 n=6)
ProcessFloat32Into_Warm_48to32-4                            16.30m ±  0%   16.25m ±  1%       ~ (p=0.485 n=6)
geomean                                                     10.55m         10.60m        +0.51%

                                    │ /home/runner/work/_temp/base.bench │   /home/runner/work/_temp/pr.bench    │
                                    │                B/op                │     B/op       vs base                │
ProcessMultiSequential-4                                   4.193Mi ±  2%   4.193Mi ±  0%       ~ (p=0.139 n=6)
ProcessMultiParallel-4                                     3.931Mi ±  1%   3.916Mi ±  3%       ~ (p=0.974 n=6)
ProcessMultiChannels/Mono-4                                1.914Mi ±  0%   1.914Mi ±  0%       ~ (p=0.848 n=6)
ProcessMultiChannels/Stereo-4                              3.916Mi ±  1%   3.903Mi ±  1%       ~ (p=0.294 n=6)
ProcessMultiChannels/Quad-4                                8.386Mi ±  0%   8.387Mi ± 13%       ~ (p=0.370 n=6)
ProcessMultiChannels/5.1-4                                 13.62Mi ±  0%   13.62Mi ±  5%       ~ (p=0.558 n=6)
ProcessMultiChannels/7.1-4                                 18.99Mi ±  0%   18.99Mi ±  7%       ~ (p=0.900 n=6)
Process_Allocations-4                                      438.7Ki ±  2%   438.7Ki ±  2%       ~ (p=0.197 n=6)
ProcessInto_Allocations-4                                  68.36Ki ± 12%   62.67Ki ±  9%       ~ (p=0.459 n=6)
Process_Allocations_48to32-4                               3.455Mi ±  1%   3.455Mi ±  1%       ~ (p=1.000 n=6)
ProcessInto_Allocations_48to32-4                           538.0Ki ±  8%   538.0Ki ±  0%       ~ (p=1.000 n=6)
Process_Allocations_48to32_5s-4                            6.384Mi ±  0%   6.384Mi ±  0%       ~ (p=0.061 n=6)
ProcessInto_Allocations_48to32_5s-4                        1.493Mi ±  0%   1.493Mi ±  0%       ~ (p=1.000 n=6)
ProcessInto_Warm_48to32-4                                  1.484Mi ±  0%   1.484Mi ±  0%       ~ (p=1.000 n=6) ¹
ProcessIntoFloat32_Warm_48to32-4                           592.9Ki ±  0%   592.9Ki ±  0%       ~ (p=1.000 n=6) ¹
ProcessFloat32Into_Warm_48to32-4                           1.484Mi ±  0%   1.484Mi ±  0%       ~ (p=1.000 n=6) ¹
geomean                                                    2.122Mi         2.110Mi        -0.59%
¹ all samples are equal

                                    │ /home/runner/work/_temp/base.bench │  /home/runner/work/_temp/pr.bench   │
                                    │             allocs/op              │  allocs/op   vs base                │
ProcessMultiSequential-4                                    11.00 ± 9%     11.00 ±  9%       ~ (p=1.000 n=6)
ProcessMultiParallel-4                                      17.00 ± 6%     17.00 ±  0%       ~ (p=1.000 n=6)
ProcessMultiChannels/Mono-4                                 5.000 ± 0%     5.000 ±  0%       ~ (p=1.000 n=6) ¹
ProcessMultiChannels/Stereo-4                               17.00 ± 0%     17.00 ±  0%       ~ (p=1.000 n=6) ¹
ProcessMultiChannels/Quad-4                                 32.00 ± 3%     32.00 ±  6%       ~ (p=1.000 n=6)
ProcessMultiChannels/5.1-4                                  49.00 ± 2%     48.00 ±  6%       ~ (p=0.242 n=6)
ProcessMultiChannels/7.1-4                                  65.00 ± 6%     65.50 ±  4%       ~ (p=0.799 n=6)
Process_Allocations-4                                       1.000 ± 0%     1.000 ±  0%       ~ (p=1.000 n=6) ¹
ProcessInto_Allocations-4                                   0.000 ± 0%     0.000 ±  0%       ~ (p=1.000 n=6) ¹
Process_Allocations_48to32-4                                2.000 ± 0%     2.000 ±  0%       ~ (p=1.000 n=6) ¹
ProcessInto_Allocations_48to32-4                            0.000 ± 0%     0.000 ±  0%       ~ (p=1.000 n=6) ¹
Process_Allocations_48to32_5s-4                             2.000 ± 0%     3.000 ± 33%       ~ (p=0.061 n=6)
ProcessInto_Allocations_48to32_5s-4                         0.000 ± 0%     0.000 ±   ?       ~ (p=1.000 n=6)
ProcessInto_Warm_48to32-4                                   0.000 ± 0%     0.000 ±  0%       ~ (p=1.000 n=6) ¹
ProcessIntoFloat32_Warm_48to32-4                            0.000 ± 0%     0.000 ±  0%       ~ (p=1.000 n=6) ¹
ProcessFloat32Into_Warm_48to32-4                            0.000 ± 0%     0.000 ±  0%       ~ (p=1.000 n=6) ¹
geomean                                                                ²                +2.48%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/tphakala/go-audio-resampler/internal/engine
                                            │ /home/runner/work/_temp/base.bench │  /home/runner/work/_temp/pr.bench   │
                                            │               sec/op               │    sec/op     vs base               │
Resampler_CD2DAT-4                                                  4.340m ±  1%   4.330m ±  1%        ~ (p=0.589 n=6)
Resampler_Process-4                                                 98.23µ ±  1%   99.97µ ±  4%   +1.77% (p=0.009 n=6)
Crossover_16_SIMD-4                                                 6.247n ±  1%   6.258n ±  0%        ~ (p=0.240 n=6)
Crossover_16_Unrolled-4                                             12.79n ±  0%   12.92n ± 12%   +0.98% (p=0.002 n=6)
Crossover_20_SIMD-4                                                 6.556n ±  0%   6.561n ±  0%   +0.09% (p=0.041 n=6)
Crossover_20_Unrolled-4                                             15.97n ±  0%   16.02n ±  0%   +0.34% (p=0.048 n=6)
Crossover_32_SIMD-4                                                 7.202n ±  0%   7.187n ±  1%        ~ (p=0.368 n=6)
Crossover_32_Unrolled-4                                             25.80n ±  0%   26.03n ±  1%   +0.87% (p=0.002 n=6)
Crossover_48_SIMD-4                                                 8.149n ±  0%   8.145n ±  0%        ~ (p=0.310 n=6)
Crossover_48_Unrolled-4                                             38.87n ±  0%   39.19n ±  0%   +0.82% (p=0.002 n=6)
Crossover_64_SIMD-4                                                 9.213n ±  1%   9.196n ±  1%        ~ (p=0.699 n=6)
Crossover_64_Unrolled-4                                             52.67n ±  0%   52.82n ±  0%   +0.28% (p=0.017 n=6)
Crossover_128_SIMD-4                                                15.54n ±  0%   15.53n ±  0%        ~ (p=1.000 n=6)
Crossover_128_Unrolled-4                                            112.3n ±  1%   112.3n ±  0%        ~ (p=0.803 n=6)
Dot20_SIMD-4                                                        6.566n ±  0%   6.577n ±  0%        ~ (p=0.589 n=6)
Dot20_GoUnrolled4-4                                                 13.63n ±  0%   13.66n ±  0%   +0.18% (p=0.045 n=6)
Dot20_GoSimple-4                                                    31.23n ±  0%   31.21n ±  0%        ~ (p=0.786 n=6)
PolyphaseIteration_SIMD-4                                           11.52n ±  0%   11.57n ±  1%   +0.43% (p=0.002 n=6)
PolyphaseIteration_GoUnrolled-4                                     26.42n ±  0%   26.45n ±  9%        ~ (p=0.675 n=6)
Func_ConvolveValid_Taps32-4                                         32.43µ ±  1%   32.47µ ±  0%        ~ (p=0.699 n=6)
Func_ConvolveValid_Taps64-4                                         44.24µ ±  1%   44.29µ ±  7%        ~ (p=0.310 n=6)
Func_ConvolveValid_Taps128-4                                        74.48µ ±  1%   74.44µ ±  0%        ~ (p=0.818 n=6)
Func_ConvolveValid_Taps256-4                                        124.6µ ±  1%   125.0µ ±  0%        ~ (p=0.818 n=6)
Func_ConvolveValidMulti_2Phase_Taps64-4                             89.40µ ± 14%   89.60µ ± 10%        ~ (p=0.310 n=6)
Func_ConvolveValidMulti_4Phase_Taps64-4                             177.2µ ±  1%   179.3µ ±  1%   +1.19% (p=0.004 n=6)
Func_DotProduct_20-4                                                7.820n ±  0%   7.824n ±  6%        ~ (p=0.437 n=6)
Func_DotProduct_32-4                                                8.459n ±  0%   8.449n ±  0%        ~ (p=0.619 n=6)
Func_DotProduct_64-4                                                10.34n ±  3%   10.35n ±  0%        ~ (p=0.530 n=6)
Func_DotProduct_128-4                                               16.33n ±  6%   16.32n ±  0%        ~ (p=0.519 n=6)
Func_Interleave2_4096-4                                             1.312µ ±  0%   1.307µ ±  1%        ~ (p=0.162 n=6)
Func_Interleave2_8192-4                                             2.712µ ±  1%   2.629µ ±  0%   -3.06% (p=0.002 n=6)
Func_DFTStage_Quick-4                                               1.312m ±  1%   1.300m ±  1%        ~ (p=0.180 n=6)
Func_DFTStage_Medium-4                                              2.064m ±  1%   2.064m ±  2%        ~ (p=0.818 n=6)
Func_DFTStage_VeryHigh-4                                            3.187m ±  1%   3.234m ±  2%        ~ (p=0.065 n=6)
Func_PolyphaseStage_Quick_Down-4                                    2.214m ±  2%   2.223m ±  5%        ~ (p=0.240 n=6)
Func_PolyphaseStage_Medium_Down-4                                   2.215m ±  1%   2.231m ±  2%        ~ (p=0.180 n=6)
Func_PolyphaseStage_VeryHigh_Down-4                                 3.485m ±  1%   3.493m ±  1%        ~ (p=0.310 n=6)
Func_PolyphaseStage_VeryHigh_Up-4                                   1.727m ±  4%   1.610m ±  2%   -6.74% (p=0.002 n=6)
Func_CubicInterpolation_20Taps-4                                    73.52n ±  0%   73.63n ±  0%        ~ (p=0.385 n=6)
Func_CubicInterpolation_32Taps-4                                    120.8n ±  0%   120.9n ±  0%        ~ (p=1.000 n=6)
Func_CubicInterpolation_64Taps-4                                    247.5n ±  1%   247.4n ±  0%        ~ (p=0.900 n=6)
Func_CubicInterpolation_100Taps-4                                   389.4n ±  1%   389.7n ±  0%        ~ (p=1.000 n=6)
Func_CubicInterpolation_64Taps_Unrolled4-4                          242.5n ±  0%   242.5n ±  0%        ~ (p=0.695 n=6)
Func_FullPipeline_48kTo32k_Quick-4                                  344.8µ ±  1%   353.4µ ±  1%   +2.49% (p=0.002 n=6)
Func_FullPipeline_48kTo32k_Medium-4                                 3.042m ±  1%   3.031m ±  0%        ~ (p=0.240 n=6)
Func_FullPipeline_48kTo32k_VeryHigh-4                               4.626m ±  1%   4.664m ±  2%        ~ (p=0.180 n=6)
Func_FullPipeline_44kTo48k_VeryHigh-4                               5.933m ±  2%   6.023m ±  8%        ~ (p=0.310 n=6)
Float64Resampler-4                                                  4.412m ±  3%   4.529m ±  1%   +2.64% (p=0.015 n=6)
Float32Resampler-4                                                  3.494m ±  1%   3.622m ±  1%   +3.67% (p=0.002 n=6)
Float64DFTStage-4                                                   2.352m ± 10%   2.592m ±  2%  +10.22% (p=0.015 n=6)
Float32DFTStage-4                                                   1.886m ±  0%   1.954m ±  1%   +3.63% (p=0.002 n=6)
Float64Polyphase-4                                                  2.045m ±  3%   2.094m ±  1%   +2.40% (p=0.026 n=6)
Float32Polyphase-4                                                  1.586m ±  1%   1.616m ±  1%   +1.91% (p=0.002 n=6)
Precision_Float64_44kTo48k_VeryHigh-4                               5.986m ±  5%   6.039m ±  2%        ~ (p=0.180 n=6)
Precision_Float32_44kTo48k_VeryHigh-4                               4.147m ±  1%   4.152m ±  0%        ~ (p=0.132 n=6)
Precision_Float64_48kTo32k_VeryHigh-4                               4.621m ±  2%   4.675m ±  1%   +1.16% (p=0.041 n=6)
Precision_Float32_48kTo32k_VeryHigh-4                               3.524m ±  1%   3.572m ±  0%   +1.37% (p=0.002 n=6)
Precision_Float64_48kTo44k_VeryHigh-4                               5.156m ±  1%   5.174m ±  4%        ~ (p=0.589 n=6)
Precision_Float32_48kTo44k_VeryHigh-4                               3.962m ±  1%   4.001m ±  8%   +0.98% (p=0.026 n=6)
Precision_Float64_44kTo48k_Quick-4                                  439.2µ ±  1%   452.7µ ±  2%   +3.07% (p=0.002 n=6)
Precision_Float32_44kTo48k_Quick-4                                  400.3µ ±  1%   407.0µ ±  1%   +1.67% (p=0.026 n=6)
Precision_Float64_48kTo32k_Quick-4                                  344.9µ ±  1%   363.6µ ±  2%   +5.44% (p=0.002 n=6)
Precision_Float32_48kTo32k_Quick-4                                  317.2µ ±  1%   335.2µ ±  1%   +5.69% (p=0.002 n=6)
Precision_PolyphaseStage_Float64_VeryHigh-4                         3.488m ±  1%   3.577m ±  1%   +2.57% (p=0.002 n=6)
Precision_PolyphaseStage_Float32_VeryHigh-4                         3.062m ±  0%   3.086m ±  0%   +0.76% (p=0.002 n=6)
Precision_DFTStage_Float64_VeryHigh-4                               3.186m ±  1%   3.306m ±  1%   +3.76% (p=0.002 n=6)
Precision_DFTStage_Float32_VeryHigh-4                               2.130m ±  1%   2.173m ±  1%   +2.00% (p=0.002 n=6)
DFTStage_Only-4                                                     2.358m ±  0%   2.533m ±  1%   +7.41% (p=0.002 n=6)
PolyphaseStage_Only-4                                               2.037m ±  2%   2.047m ±  1%        ~ (p=0.240 n=6)
Resampler_QualityLow-4                                              3.365m ±  1%   3.468m ±  1%   +3.04% (p=0.002 n=6)
Resampler_QualityMedium-4                                           3.372m ±  1%   3.481m ±  1%   +3.24% (p=0.002 n=6)
ConvolveValid_Separate-4                                            2.672m ±  1%   2.665m ±  1%        ~ (p=0.240 n=6)
ConvolveValidMulti-4                                                2.675m ±  0%   2.665m ±  0%   -0.38% (p=0.002 n=6)
Interleave_Scalar-4                                                 65.46µ ±  0%   65.23µ ±  4%        ~ (p=0.394 n=6)
Interleave2-4                                                       22.44µ ± 12%   19.51µ ± 28%        ~ (p=0.065 n=6)
DotProduct_20-4                                                     6.561n ±  0%   6.577n ±  0%        ~ (p=0.093 n=6)
DotProduct_20_Manual-4                                              43.61n ±  0%   43.61n ±  0%        ~ (p=0.905 n=6)
DotProduct_20_Unrolled4-4                                           13.59n ±  0%   13.62n ±  0%        ~ (p=0.262 n=6)
Throughput_Quick_48kTo32k-4                                         347.0µ ±  1%   365.4µ ±  1%   +5.29% (p=0.002 n=6)
Throughput_Low_48kTo32k-4                                           3.081m ±  2%   3.114m ±  2%        ~ (p=0.240 n=6)
Throughput_Medium_48kTo32k-4                                        3.069m ±  1%   3.099m ±  1%        ~ (p=0.065 n=6)
Throughput_High_48kTo32k-4                                          3.802m ±  1%   3.822m ±  1%        ~ (p=0.093 n=6)
Throughput_VeryHigh_48kTo32k-4                                      4.738m ±  1%   4.724m ±  3%        ~ (p=0.818 n=6)
Throughput_VeryHigh_44kTo48k-4                                      6.067m ±  2%   6.255m ±  2%   +3.10% (p=0.002 n=6)
Throughput_VeryHigh_48kTo96k-4                                      3.400m ±  2%   3.477m ±  3%   +2.27% (p=0.041 n=6)
geomean                                                             26.61µ         26.82µ         +0.81%

                                            │ /home/runner/work/_temp/base.bench │   /home/runner/work/_temp/pr.bench   │
                                            │                B/op                │     B/op      vs base                │
Resampler_CD2DAT-4                                                1.120Mi ± 1%     1.120Mi ± 0%       ~ (p=0.723 n=6)
Resampler_Process-4                                               25.36Ki ± 0%     25.36Ki ± 0%       ~ (p=0.348 n=6)
Crossover_16_SIMD-4                                                 0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_16_Unrolled-4                                             0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_20_SIMD-4                                                 0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_20_Unrolled-4                                             0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_32_SIMD-4                                                 0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_32_Unrolled-4                                             0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_48_SIMD-4                                                 0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_48_Unrolled-4                                             0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_64_SIMD-4                                                 0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_64_Unrolled-4                                             0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_128_SIMD-4                                                0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_128_Unrolled-4                                            0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Dot20_SIMD-4                                                        0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Dot20_GoUnrolled4-4                                                 0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Dot20_GoSimple-4                                                    0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
PolyphaseIteration_SIMD-4                                           0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
PolyphaseIteration_GoUnrolled-4                                     0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValid_Taps32-4                                         0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValid_Taps64-4                                         0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValid_Taps128-4                                        0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValid_Taps256-4                                        0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValidMulti_2Phase_Taps64-4                             0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValidMulti_4Phase_Taps64-4                             0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DotProduct_20-4                                                0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DotProduct_32-4                                                0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DotProduct_64-4                                                0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DotProduct_128-4                                               0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_Interleave2_4096-4                                             0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_Interleave2_8192-4                                             0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DFTStage_Quick-4                                             765.1Ki ± 0%     764.4Ki ± 0%       ~ (p=0.240 n=6)
Func_DFTStage_Medium-4                                            772.6Ki ± 0%     771.9Ki ± 1%       ~ (p=0.290 n=6)
Func_DFTStage_VeryHigh-4                                          783.4Ki ± 0%     786.1Ki ± 1%  +0.35% (p=0.002 n=6)
Func_PolyphaseStage_Quick_Down-4                                  585.2Ki ± 0%     585.2Ki ± 0%       ~ (p=0.920 n=6)
Func_PolyphaseStage_Medium_Down-4                                 585.2Ki ± 0%     585.2Ki ± 0%       ~ (p=0.545 n=6)
Func_PolyphaseStage_VeryHigh_Down-4                               596.2Ki ± 0%     596.6Ki ± 0%       ~ (p=0.232 n=6)
Func_PolyphaseStage_VeryHigh_Up-4                                 216.5Ki ± 0%     216.2Ki ± 1%       ~ (p=0.143 n=6)
Func_CubicInterpolation_20Taps-4                                    0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_CubicInterpolation_32Taps-4                                    0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_CubicInterpolation_64Taps-4                                    0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_CubicInterpolation_100Taps-4                                   0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_CubicInterpolation_64Taps_Unrolled4-4                          0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_FullPipeline_48kTo32k_Quick-4                                256.7Ki ± 0%     256.8Ki ± 0%  +0.01% (p=0.015 n=6)
Func_FullPipeline_48kTo32k_Medium-4                               1.040Mi ± 0%     1.039Mi ± 0%       ~ (p=0.130 n=6)
Func_FullPipeline_48kTo32k_VeryHigh-4                             1.074Mi ± 1%     1.082Mi ± 1%       ~ (p=1.000 n=6)
Func_FullPipeline_44kTo48k_VeryHigh-4                             1.157Mi ± 1%     1.157Mi ± 1%       ~ (p=0.868 n=6)
Float64Resampler-4                                                1.120Mi ± 1%     1.119Mi ± 1%       ~ (p=0.916 n=6)
Float32Resampler-4                                                569.0Ki ± 0%     569.0Ki ± 0%       ~ (p=1.000 n=6)
Float64DFTStage-4                                                 709.6Ki ± 0%     709.9Ki ± 0%       ~ (p=0.165 n=6)
Float32DFTStage-4                                                 352.9Ki ± 0%     352.9Ki ± 0%       ~ (p=0.738 n=6)
Float64Polyphase-4                                                394.3Ki ± 0%     394.3Ki ± 1%       ~ (p=0.987 n=6)
Float32Polyphase-4                                                199.4Ki ± 1%     199.4Ki ± 1%       ~ (p=0.721 n=6)
Precision_Float64_44kTo48k_VeryHigh-4                             1.157Mi ± 1%     1.154Mi ± 0%       ~ (p=0.297 n=6)
Precision_Float32_44kTo48k_VeryHigh-4                             574.9Ki ± 1%     574.9Ki ± 0%       ~ (p=0.870 n=6)
Precision_Float64_48kTo32k_VeryHigh-4                             1.074Mi ± 1%     1.078Mi ± 1%       ~ (p=0.437 n=6)
Precision_Float32_48kTo32k_VeryHigh-4                             537.5Ki ± 0%     537.5Ki ± 0%       ~ (p=1.000 n=6)
Precision_Float64_48kTo44k_VeryHigh-4                             1.177Mi ± 0%     1.177Mi ± 0%       ~ (p=0.697 n=6)
Precision_Float32_48kTo44k_VeryHigh-4                             590.4Ki ± 0%     590.4Ki ± 1%       ~ (p=0.121 n=6)
Precision_Float64_44kTo48k_Quick-4                                377.4Ki ± 0%     377.4Ki ± 0%  +0.01% (p=0.004 n=6)
Precision_Float32_44kTo48k_Quick-4                                192.6Ki ± 0%     192.7Ki ± 0%       ~ (p=0.065 n=6)
Precision_Float64_48kTo32k_Quick-4                                256.7Ki ± 0%     256.8Ki ± 0%  +0.01% (p=0.002 n=6)
Precision_Float32_48kTo32k_Quick-4                                128.3Ki ± 0%     128.4Ki ± 0%  +0.02% (p=0.002 n=6)
Precision_PolyphaseStage_Float64_VeryHigh-4                       596.2Ki ± 0%     595.8Ki ± 0%       ~ (p=0.981 n=6)
Precision_PolyphaseStage_Float32_VeryHigh-4                       300.6Ki ± 0%     300.6Ki ± 0%       ~ (p=1.000 n=6)
Precision_DFTStage_Float64_VeryHigh-4                             783.4Ki ± 0%     784.2Ki ± 0%       ~ (p=0.078 n=6)
Precision_DFTStage_Float32_VeryHigh-4                             386.9Ki ± 0%     387.1Ki ± 0%       ~ (p=0.275 n=6)
DFTStage_Only-4                                                   709.6Ki ± 0%     710.5Ki ± 0%  +0.13% (p=0.039 n=6)
PolyphaseStage_Only-4                                             394.5Ki ± 0%     393.9Ki ± 1%       ~ (p=0.604 n=6)
Resampler_QualityLow-4                                            1.100Mi ± 0%     1.102Mi ± 1%       ~ (p=0.119 n=6)
Resampler_QualityMedium-4                                         1.102Mi ± 1%     1.100Mi ± 1%       ~ (p=0.662 n=6)
ConvolveValid_Separate-4                                            0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
ConvolveValidMulti-4                                                0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Interleave_Scalar-4                                                 0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Interleave2-4                                                       0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
DotProduct_20-4                                                     0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
DotProduct_20_Manual-4                                              0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
DotProduct_20_Unrolled4-4                                           0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
Throughput_Quick_48kTo32k-4                                       256.0Ki ± 0%     256.0Ki ± 0%       ~ (p=1.000 n=6) ¹
Throughput_Low_48kTo32k-4                                         1.039Mi ± 0%     1.039Mi ± 0%       ~ (p=0.610 n=6)
Throughput_Medium_48kTo32k-4                                      1.039Mi ± 0%     1.037Mi ± 0%       ~ (p=0.305 n=6)
Throughput_High_48kTo32k-4                                        1.051Mi ± 0%     1.052Mi ± 0%       ~ (p=0.695 n=6)
Throughput_VeryHigh_48kTo32k-4                                    1.068Mi ± 0%     1.067Mi ± 0%       ~ (p=0.238 n=6)
Throughput_VeryHigh_44kTo48k-4                                    1.155Mi ± 0%     1.155Mi ± 0%       ~ (p=0.394 n=6)
Throughput_VeryHigh_48kTo96k-4                                    783.6Ki ± 0%     783.6Ki ± 1%       ~ (p=0.998 n=6)
geomean                                                                        ²                 +0.01%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                            │ /home/runner/work/_temp/base.bench │  /home/runner/work/_temp/pr.bench  │
                                            │             allocs/op              │ allocs/op   vs base                │
Resampler_CD2DAT-4                                                  2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Resampler_Process-4                                                 2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_16_SIMD-4                                                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_16_Unrolled-4                                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_20_SIMD-4                                                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_20_Unrolled-4                                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_32_SIMD-4                                                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_32_Unrolled-4                                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_48_SIMD-4                                                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_48_Unrolled-4                                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_64_SIMD-4                                                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_64_Unrolled-4                                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_128_SIMD-4                                                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Crossover_128_Unrolled-4                                            0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Dot20_SIMD-4                                                        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Dot20_GoUnrolled4-4                                                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Dot20_GoSimple-4                                                    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
PolyphaseIteration_SIMD-4                                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
PolyphaseIteration_GoUnrolled-4                                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValid_Taps32-4                                         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValid_Taps64-4                                         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValid_Taps128-4                                        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValid_Taps256-4                                        0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValidMulti_2Phase_Taps64-4                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_ConvolveValidMulti_4Phase_Taps64-4                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DotProduct_20-4                                                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DotProduct_32-4                                                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DotProduct_64-4                                                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DotProduct_128-4                                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_Interleave2_4096-4                                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_Interleave2_8192-4                                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DFTStage_Quick-4                                               1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DFTStage_Medium-4                                              1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_DFTStage_VeryHigh-4                                            1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_PolyphaseStage_Quick_Down-4                                    1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_PolyphaseStage_Medium_Down-4                                   1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_PolyphaseStage_VeryHigh_Down-4                                 1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_PolyphaseStage_VeryHigh_Up-4                                   1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_CubicInterpolation_20Taps-4                                    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_CubicInterpolation_32Taps-4                                    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_CubicInterpolation_64Taps-4                                    0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_CubicInterpolation_100Taps-4                                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_CubicInterpolation_64Taps_Unrolled4-4                          0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_FullPipeline_48kTo32k_Quick-4                                  1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_FullPipeline_48kTo32k_Medium-4                                 2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_FullPipeline_48kTo32k_VeryHigh-4                               2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Func_FullPipeline_44kTo48k_VeryHigh-4                               2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Float64Resampler-4                                                  2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Float32Resampler-4                                                  2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Float64DFTStage-4                                                   1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Float32DFTStage-4                                                   1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Float64Polyphase-4                                                  1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Float32Polyphase-4                                                  1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_Float64_44kTo48k_VeryHigh-4                               2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_Float32_44kTo48k_VeryHigh-4                               2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_Float64_48kTo32k_VeryHigh-4                               2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_Float32_48kTo32k_VeryHigh-4                               2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_Float64_48kTo44k_VeryHigh-4                               2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_Float32_48kTo44k_VeryHigh-4                               2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_Float64_44kTo48k_Quick-4                                  1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_Float32_44kTo48k_Quick-4                                  1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_Float64_48kTo32k_Quick-4                                  1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_Float32_48kTo32k_Quick-4                                  1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_PolyphaseStage_Float64_VeryHigh-4                         1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_PolyphaseStage_Float32_VeryHigh-4                         1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_DFTStage_Float64_VeryHigh-4                               1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Precision_DFTStage_Float32_VeryHigh-4                               1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
DFTStage_Only-4                                                     1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
PolyphaseStage_Only-4                                               1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Resampler_QualityLow-4                                              2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Resampler_QualityMedium-4                                           2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
ConvolveValid_Separate-4                                            0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
ConvolveValidMulti-4                                                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Interleave_Scalar-4                                                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Interleave2-4                                                       0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
DotProduct_20-4                                                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
DotProduct_20_Manual-4                                              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
DotProduct_20_Unrolled4-4                                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
Throughput_Quick_48kTo32k-4                                         1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
Throughput_Low_48kTo32k-4                                           2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Throughput_Medium_48kTo32k-4                                        2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Throughput_High_48kTo32k-4                                          2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Throughput_VeryHigh_48kTo32k-4                                      2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Throughput_VeryHigh_44kTo48k-4                                      2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
Throughput_VeryHigh_48kTo96k-4                                      1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                                        ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                        │ /home/runner/work/_temp/base.bench │  /home/runner/work/_temp/pr.bench   │
                                        │                B/s                 │      B/s       vs base              │
Func_ConvolveValid_Taps32-4                                    963.5Mi ±  1%    962.3Mi ± 0%       ~ (p=0.699 n=6)
Func_ConvolveValid_Taps64-4                                    706.3Mi ±  1%    705.6Mi ± 7%       ~ (p=0.310 n=6)
Func_ConvolveValid_Taps128-4                                   419.5Mi ±  1%    419.8Mi ± 0%       ~ (p=0.818 n=6)
Func_ConvolveValid_Taps256-4                                   250.8Mi ±  1%    250.1Mi ± 0%       ~ (p=0.818 n=6)
Func_ConvolveValidMulti_2Phase_Taps64-4                        699.1Mi ± 12%    697.6Mi ± 9%       ~ (p=0.310 n=6)
Func_ConvolveValidMulti_4Phase_Taps64-4                        705.3Mi ±  1%    697.0Mi ± 1%  -1.18% (p=0.004 n=6)
Func_Interleave2_4096-4                                        46.54Gi ±  0%    46.70Gi ± 1%       ~ (p=0.240 n=6)
Func_Interleave2_8192-4                                        45.01Gi ±  1%    46.43Gi ± 0%  +3.16% (p=0.002 n=6)
Throughput_Quick_48kTo32k-4                                   1055.4Mi ±  1%   1002.3Mi ± 1%  -5.03% (p=0.002 n=6)
Throughput_Low_48kTo32k-4                                      118.9Mi ±  2%    117.6Mi ± 2%       ~ (p=0.240 n=6)
Throughput_Medium_48kTo32k-4                                   119.3Mi ±  1%    118.2Mi ± 1%       ~ (p=0.065 n=6)
Throughput_High_48kTo32k-4                                     96.33Mi ±  1%    95.83Mi ± 1%       ~ (p=0.093 n=6)
Throughput_VeryHigh_48kTo32k-4                                 77.29Mi ±  1%    77.51Mi ± 3%       ~ (p=0.818 n=6)
Throughput_VeryHigh_44kTo48k-4                                 55.46Mi ±  2%    53.79Mi ± 2%  -3.00% (p=0.002 n=6)
Throughput_VeryHigh_48kTo96k-4                                 107.7Mi ±  2%    105.3Mi ± 3%  -2.22% (p=0.041 n=6)
geomean                                                        517.8Mi          514.0Mi       -0.74%

                                            │ /home/runner/work/_temp/base.bench │ /home/runner/work/_temp/pr.bench  │
                                            │                MS/s                │    MS/s      vs base              │
Func_ConvolveValid_Taps32-4                                          126.3 ±  1%    126.1 ± 0%       ~ (p=0.615 n=6)
Func_ConvolveValid_Taps64-4                                          92.57 ±  1%    92.48 ± 7%       ~ (p=0.310 n=6)
Func_ConvolveValid_Taps128-4                                         54.99 ±  1%    55.03 ± 0%       ~ (p=0.777 n=6)
Func_ConvolveValid_Taps256-4                                         32.88 ±  1%    32.78 ± 0%       ~ (p=0.777 n=6)
Func_ConvolveValidMulti_2Phase_Taps64-4                              91.63 ± 12%    91.44 ± 9%       ~ (p=0.310 n=6)
Func_ConvolveValidMulti_4Phase_Taps64-4                              92.45 ±  1%    91.35 ± 1%  -1.18% (p=0.006 n=6)
Func_Interleave2_4096-4                                             6.247k ±  0%   6.268k ± 1%       ~ (p=0.240 n=6)
Func_Interleave2_8192-4                                             6.041k ±  1%   6.232k ± 0%  +3.16% (p=0.002 n=6)
Func_DFTStage_Quick-4                                                36.60 ±  1%    36.93 ± 1%       ~ (p=0.173 n=6)
Func_DFTStage_Medium-4                                               23.27 ±  1%    23.26 ± 2%       ~ (p=0.784 n=6)
Func_DFTStage_VeryHigh-4                                             15.07 ±  1%    14.84 ± 2%       ~ (p=0.056 n=6)
Func_PolyphaseStage_Quick_Down-4                                     21.68 ±  2%    21.59 ± 5%       ~ (p=0.188 n=6)
Func_PolyphaseStage_Medium_Down-4                                    21.66 ±  1%    21.52 ± 2%       ~ (p=0.145 n=6)
Func_PolyphaseStage_VeryHigh_Down-4                                  13.77 ±  1%    13.74 ± 1%       ~ (p=0.370 n=6)
Func_PolyphaseStage_VeryHigh_Up-4                                    27.80 ±  4%    29.80 ± 2%  +7.23% (p=0.002 n=6)
Func_FullPipeline_48kTo32k_Quick-4                                   139.2 ±  1%    135.8 ± 1%  -2.41% (p=0.002 n=6)
Func_FullPipeline_48kTo32k_Medium-4                                  15.78 ±  1%    15.84 ± 0%       ~ (p=0.242 n=6)
Func_FullPipeline_48kTo32k_VeryHigh-4                                10.38 ±  1%    10.29 ± 2%       ~ (p=0.195 n=6)
Func_FullPipeline_44kTo48k_VeryHigh-4                                7.433 ±  2%    7.322 ± 7%       ~ (p=0.310 n=6)
Precision_Float64_44kTo48k_VeryHigh-4                                7.367 ±  5%    7.303 ± 2%       ~ (p=0.180 n=6)
Precision_Float32_44kTo48k_VeryHigh-4                                10.64 ±  1%    10.62 ± 0%       ~ (p=0.173 n=6)
Precision_Float64_48kTo32k_VeryHigh-4                                10.38 ±  2%    10.27 ± 1%  -1.11% (p=0.045 n=6)
Precision_Float32_48kTo32k_VeryHigh-4                                13.62 ±  1%    13.43 ± 0%  -1.36% (p=0.002 n=6)
Precision_Float64_48kTo44k_VeryHigh-4                                9.311 ±  1%    9.277 ± 3%       ~ (p=0.589 n=6)
Precision_Float32_48kTo44k_VeryHigh-4                                12.11 ±  1%    12.00 ± 7%  -0.95% (p=0.028 n=6)
Precision_Float64_44kTo48k_Quick-4                                  100.40 ±  1%    97.41 ± 2%  -2.97% (p=0.002 n=6)
Precision_Float32_44kTo48k_Quick-4                                   110.2 ±  1%    108.3 ± 1%  -1.63% (p=0.024 n=6)
Precision_Float64_48kTo32k_Quick-4                                   139.2 ±  1%    132.0 ± 2%  -5.17% (p=0.002 n=6)
Precision_Float32_48kTo32k_Quick-4                                   151.4 ±  1%    143.2 ± 1%  -5.38% (p=0.002 n=6)
Precision_PolyphaseStage_Float64_VeryHigh-4                          13.76 ±  1%    13.42 ± 1%  -2.47% (p=0.002 n=6)
Precision_PolyphaseStage_Float32_VeryHigh-4                          15.68 ±  0%    15.55 ± 0%  -0.77% (p=0.002 n=6)
Precision_DFTStage_Float64_VeryHigh-4                                15.07 ±  1%    14.52 ± 1%  -3.65% (p=0.002 n=6)
Precision_DFTStage_Float32_VeryHigh-4                                22.53 ±  1%    22.09 ± 1%  -1.95% (p=0.002 n=6)
Throughput_Quick_48kTo32k-4                                          138.3 ±  1%    131.4 ± 1%  -5.02% (p=0.002 n=6)
Throughput_Low_48kTo32k-4                                            15.58 ±  2%    15.41 ± 2%       ~ (p=0.240 n=6)
Throughput_Medium_48kTo32k-4                                         15.64 ±  1%    15.49 ± 1%       ~ (p=0.076 n=6)
Throughput_High_48kTo32k-4                                           12.62 ±  1%    12.56 ± 1%       ~ (p=0.100 n=6)
Throughput_VeryHigh_48kTo32k-4                                       10.13 ±  1%    10.16 ± 3%       ~ (p=0.784 n=6)
Throughput_VeryHigh_44kTo48k-4                                       7.268 ±  2%    7.050 ± 2%  -3.01% (p=0.002 n=6)
Throughput_VeryHigh_48kTo96k-4                                       14.12 ±  2%    13.80 ± 3%  -2.20% (p=0.041 n=6)
geomean                                                              34.27          33.93       -0.99%

                                           │ /home/runner/work/_temp/base.bench │ /home/runner/work/_temp/pr.bench │
                                           │               GFLOPS               │   GFLOPS    vs base              │
Func_DotProduct_20-4                                                 2.558 ± 0%   2.556 ± 6%       ~ (p=0.377 n=6)
Func_DotProduct_32-4                                                 3.783 ± 1%   3.787 ± 0%       ~ (p=0.619 n=6)
Func_DotProduct_64-4                                                 6.188 ± 2%   6.189 ± 0%       ~ (p=0.494 n=6)
Func_DotProduct_128-4                                                7.836 ± 6%   7.845 ± 0%       ~ (p=0.584 n=6)
Func_CubicInterpolation_20Taps-4                                     1.904 ± 0%   1.901 ± 0%       ~ (p=0.506 n=6)
Func_CubicInterpolation_32Taps-4                                     1.853 ± 0%   1.853 ± 0%       ~ (p=0.831 n=6)
Func_CubicInterpolation_64Taps-4                                     1.810 ± 0%   1.810 ± 0%       ~ (p=0.903 n=6)
Func_CubicInterpolation_100Taps-4                                    1.797 ± 1%   1.796 ± 0%       ~ (p=0.970 n=6)
Func_CubicInterpolation_64Taps_Unrolled4-4                           1.848 ± 0%   1.847 ± 0%       ~ (p=0.446 n=6)
geomean                                                              2.781        2.781       -0.01%

                                           │ /home/runner/work/_temp/base.bench │ /home/runner/work/_temp/pr.bench  │
                                           │            M_samples/s             │ M_samples/s  vs base              │
Func_CubicInterpolation_20Taps-4                                     13.60 ± 0%    13.59 ± 0%       ~ (p=0.481 n=6)
Func_CubicInterpolation_32Taps-4                                     8.273 ± 0%    8.273 ± 0%       ~ (p=0.859 n=6)
Func_CubicInterpolation_64Taps-4                                     4.040 ± 0%    4.042 ± 0%       ~ (p=0.963 n=6)
Func_CubicInterpolation_100Taps-4                                    2.568 ± 1%    2.566 ± 0%       ~ (p=1.000 n=6)
Func_CubicInterpolation_64Taps_Unrolled4-4                           4.124 ± 0%    4.123 ± 0%       ~ (p=0.539 n=6)
geomean                                                              5.451         5.449       -0.04%

pkg: github.com/tphakala/go-audio-resampler/internal/filter
                             │ /home/runner/work/_temp/base.bench │   /home/runner/work/_temp/pr.bench   │
                             │               sec/op               │    sec/op     vs base                │
KaiserWindow/length_51-4                              1.241µ ± 1%   1.236µ ±  1%       ~ (p=0.513 n=6)
KaiserWindow/length_101-4                             2.415µ ± 1%   2.428µ ±  1%       ~ (p=0.143 n=6)
KaiserWindow/length_201-4                             4.760µ ± 1%   4.788µ ± 11%       ~ (p=0.065 n=6)
DesignLowPassFilter-4                                 7.592µ ± 1%   7.610µ ±  0%       ~ (p=0.240 n=6)
ComputeFrequencyResponse-4                            4.340m ± 0%   4.348m ±  1%       ~ (p=0.065 n=6)
DesignPolyphaseFilterBank-4                           186.6µ ± 1%
PolyphaseGetCoefficient-4                             2.217n ± 0%
PolyphaseFrequencyResponse-4                          188.8µ ± 0%
geomean                                               8.822µ        13.66µ        +0.24%               ¹
¹ benchmark set differs from baseline; geomeans may not be comparable

                             │ /home/runner/work/_temp/base.bench │   /home/runner/work/_temp/pr.bench   │
                             │                B/op                │     B/op      vs base                │
KaiserWindow/length_51-4                             416.0 ± 0%       416.0 ± 0%       ~ (p=1.000 n=6) ¹
KaiserWindow/length_101-4                            896.0 ± 0%       896.0 ± 0%       ~ (p=1.000 n=6) ¹
KaiserWindow/length_201-4                          1.750Ki ± 0%     1.750Ki ± 0%       ~ (p=1.000 n=6) ¹
DesignLowPassFilter-4                              3.500Ki ± 0%     3.500Ki ± 0%       ~ (p=1.000 n=6) ¹
ComputeFrequencyResponse-4                         24.00Ki ± 0%     24.00Ki ± 0%       ~ (p=1.000 n=6) ¹
DesignPolyphaseFilterBank-4                        130.3Ki ± 0%
PolyphaseGetCoefficient-4                            0.000 ± 0%
PolyphaseFrequencyResponse-4                       12.12Ki ± 0%
geomean                                                         ²   2.206Ki       +0.00%               ³
¹ all samples are equal
² summaries must be >0 to compute geomean
³ benchmark set differs from baseline; geomeans may not be comparable

                             │ /home/runner/work/_temp/base.bench │  /home/runner/work/_temp/pr.bench  │
                             │             allocs/op              │ allocs/op   vs base                │
KaiserWindow/length_51-4                             1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserWindow/length_101-4                            1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserWindow/length_201-4                            1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
DesignLowPassFilter-4                                2.000 ± 0%     2.000 ± 0%       ~ (p=1.000 n=6) ¹
ComputeFrequencyResponse-4                           3.000 ± 0%     3.000 ± 0%       ~ (p=1.000 n=6) ¹
DesignPolyphaseFilterBank-4                          6.000 ± 0%
PolyphaseGetCoefficient-4                            0.000 ± 0%
PolyphaseFrequencyResponse-4                         4.000 ± 0%
geomean                                                         ²   1.431       +0.00%               ³
¹ all samples are equal
² summaries must be >0 to compute geomean
³ benchmark set differs from baseline; geomeans may not be comparable

pkg: github.com/tphakala/go-audio-resampler/internal/mathutil
                                   │ /home/runner/work/_temp/base.bench │ /home/runner/work/_temp/pr.bench  │
                                   │               sec/op               │   sec/op     vs base              │
BesselI0_Small-4                                           4.011n ±  1%   4.016n ± 0%       ~ (p=0.333 n=6)
BesselI0_Large-4                                           15.44n ±  0%   15.42n ± 0%       ~ (p=0.617 n=6)
KaiserBeta-4                                               2.498n ±  0%   2.498n ± 0%       ~ (p=0.781 n=6)
EstimateFilterLength-4                                     1.404n ±  2%   1.406n ± 0%       ~ (p=0.619 n=6)
FilterLengthCalculation/Quick-4                            2.233n ±  8%   2.231n ± 0%       ~ (p=0.619 n=6)
FilterLengthCalculation/Low-4                              2.230n ± 10%   2.230n ± 0%       ~ (p=0.582 n=6)
FilterLengthCalculation/Medium-4                           2.229n ±  0%   2.230n ± 1%       ~ (p=0.513 n=6)
FilterLengthCalculation/High-4                             2.232n ±  0%   2.235n ± 0%       ~ (p=0.145 n=6)
FilterLengthCalculation/VeryHigh-4                         2.232n ±  0%   2.228n ± 0%       ~ (p=0.457 n=6)
KaiserBetaCalculation/Quick-4                              2.811n ±  0%   2.809n ± 1%       ~ (p=0.784 n=6)
KaiserBetaCalculation/Low-4                                32.97n ±  0%   32.97n ± 1%       ~ (p=0.671 n=6)
KaiserBetaCalculation/Medium-4                             32.96n ±  0%   32.99n ± 1%       ~ (p=0.370 n=6)
KaiserBetaCalculation/High-4                               32.98n ±  0%   33.05n ± 6%       ~ (p=0.065 n=6)
KaiserBetaCalculation/VeryHigh-4                           32.98n ±  0%   33.00n ± 0%       ~ (p=0.784 n=6)
geomean                                                    5.717n         5.719n       +0.03%

                                   │ /home/runner/work/_temp/base.bench │  /home/runner/work/_temp/pr.bench  │
                                   │                B/op                │    B/op     vs base                │
BesselI0_Small-4                                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
BesselI0_Large-4                                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBeta-4                                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
EstimateFilterLength-4                                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
FilterLengthCalculation/Quick-4                            0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
FilterLengthCalculation/Low-4                              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
FilterLengthCalculation/Medium-4                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
FilterLengthCalculation/High-4                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
FilterLengthCalculation/VeryHigh-4                         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBetaCalculation/Quick-4                              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBetaCalculation/Low-4                                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBetaCalculation/Medium-4                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBetaCalculation/High-4                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBetaCalculation/VeryHigh-4                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                               ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                   │ /home/runner/work/_temp/base.bench │  /home/runner/work/_temp/pr.bench  │
                                   │             allocs/op              │ allocs/op   vs base                │
BesselI0_Small-4                                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
BesselI0_Large-4                                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBeta-4                                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
EstimateFilterLength-4                                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
FilterLengthCalculation/Quick-4                            0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
FilterLengthCalculation/Low-4                              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
FilterLengthCalculation/Medium-4                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
FilterLengthCalculation/High-4                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
FilterLengthCalculation/VeryHigh-4                         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBetaCalculation/Quick-4                              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBetaCalculation/Low-4                                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBetaCalculation/Medium-4                             0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBetaCalculation/High-4                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
KaiserBetaCalculation/VeryHigh-4                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                               ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/tphakala/go-audio-resampler/internal/simdops
                              │ /home/runner/work/_temp/base.bench │ /home/runner/work/_temp/pr.bench  │
                              │               sec/op               │   sec/op     vs base              │
DirectF64DotProduct-4                                  9.225n ± 0%   9.252n ± 1%       ~ (p=0.195 n=6)
IndirectF64DotProduct-4                                10.39n ± 1%   10.37n ± 0%       ~ (p=0.063 n=6)
DirectF32DotProduct-4                                  7.724n ± 1%   7.696n ± 0%       ~ (p=0.310 n=6)
IndirectF32DotProduct-4                                8.889n ± 2%   8.812n ± 0%       ~ (p=0.132 n=6)
DirectF64ConvolveValid-4                               779.5n ± 0%   778.5n ± 0%       ~ (p=0.143 n=6)
IndirectF64ConvolveValid-4                             792.0n ± 8%   781.6n ± 1%  -1.30% (p=0.026 n=6)
DirectF64DotProduct_Large-4                            87.02n ± 0%   86.97n ± 1%       ~ (p=1.000 n=6)
IndirectF64DotProduct_Large-4                          87.79n ± 2%   87.62n ± 0%       ~ (p=0.485 n=6)
geomean                                                48.58n        48.41n       -0.35%

                              │ /home/runner/work/_temp/base.bench │  /home/runner/work/_temp/pr.bench  │
                              │                B/op                │    B/op     vs base                │
DirectF64DotProduct-4                                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
IndirectF64DotProduct-4                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
DirectF32DotProduct-4                                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
IndirectF32DotProduct-4                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
DirectF64ConvolveValid-4                              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
IndirectF64ConvolveValid-4                            0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
DirectF64DotProduct_Large-4                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
IndirectF64DotProduct_Large-4                         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                          ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                              │ /home/runner/work/_temp/base.bench │  /home/runner/work/_temp/pr.bench  │
                              │             allocs/op              │ allocs/op   vs base                │
DirectF64DotProduct-4                                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
IndirectF64DotProduct-4                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
DirectF32DotProduct-4                                 0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
IndirectF32DotProduct-4                               0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
DirectF64ConvolveValid-4                              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
IndirectF64ConvolveValid-4                            0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
DirectF64DotProduct_Large-4                           0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
IndirectF64DotProduct_Large-4                         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                          ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@internal/engine/quality_regression_test.go`:
- Around line 165-170: Update the regression comment in the active-interpolation
THD coverage to replace the phase-boundary defect reference “#56” with “#51”,
while preserving the existing “#54” regression tag and all other wording.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f16eafeb-bd6d-44e3-81c3-20c8b1240df0

📥 Commits

Reviewing files that changed from the base of the PR and between 823e02c and e84369d.

📒 Files selected for processing (22)
  • .github/workflows/ci.yml
  • CHANGELOG.md
  • README.md
  • cmd/analyze-filter/analyze_filter_gain.go
  • codecov.yml
  • constant.go
  • internal/engine/buffer_integrity_test.go
  • internal/engine/constants.go
  • internal/engine/cubic.go
  • internal/engine/edge_cases_test.go
  • internal/engine/extra_engine_test.go
  • internal/engine/phase_wrap_measure_test.go
  • internal/engine/polyphase_stage.go
  • internal/engine/quality_regression_test.go
  • internal/engine/resampler.go
  • internal/engine/reset_state_test.go
  • internal/engine/stage_adapter.go
  • internal/filter/polyphase.go
  • internal/filter/polyphase_test.go
  • latency_test.go
  • resample.go
  • stages.go
💤 Files with no reviewable changes (8)
  • cmd/analyze-filter/analyze_filter_gain.go
  • codecov.yml
  • internal/engine/constants.go
  • internal/engine/edge_cases_test.go
  • .github/workflows/ci.yml
  • internal/filter/polyphase_test.go
  • internal/filter/polyphase.go
  • internal/engine/buffer_integrity_test.go

Comment thread internal/engine/quality_regression_test.go Outdated
…56

CodeRabbit review: the CHANGELOG attributes the defect to #51, so the
active-interpolation THD comment now names both the reporting issue and
the fixing PR instead of the PR alone.
@tphakala

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@tphakala
tphakala merged commit 54dfd11 into master Jul 17, 2026
17 checks passed
@tphakala
tphakala deleted the fix/latency-deficit-and-polyphase-cleanup branch July 17, 2026 17:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant