| 382 | } |
| 383 | |
| 384 | std::vector<float> resample_mono_linear( |
| 385 | const std::vector<float> & mono_samples, |
| 386 | int source_sample_rate_hz, |
| 387 | int target_sample_rate_hz) { |
| 388 | if (source_sample_rate_hz <= 0 || target_sample_rate_hz <= 0) { |
| 389 | throw std::runtime_error("linear mono resampling requires positive sample rates"); |
| 390 | } |
| 391 | if (source_sample_rate_hz == target_sample_rate_hz || mono_samples.empty()) { |
| 392 | return mono_samples; |
| 393 | } |
| 394 | const double scale = static_cast<double>(target_sample_rate_hz) / static_cast<double>(source_sample_rate_hz); |
| 395 | const size_t output_samples = static_cast<size_t>(std::llround(static_cast<double>(mono_samples.size()) * scale)); |
| 396 | std::vector<float> output(output_samples, 0.0F); |
| 397 | for (size_t i = 0; i < output_samples; ++i) { |
| 398 | const double src_pos = static_cast<double>(i) / scale; |
| 399 | const size_t left = static_cast<size_t>(std::floor(src_pos)); |
| 400 | const size_t right = std::min(left + 1, mono_samples.size() - 1); |
| 401 | const float frac = static_cast<float>(src_pos - static_cast<double>(left)); |
| 402 | output[i] = mono_samples[left] * (1.0F - frac) + mono_samples[right] * frac; |
| 403 | } |
| 404 | return output; |
| 405 | } |
| 406 | |
| 407 | TorchaudioSincHannResampleOptions torchaudio_sinc_hann_float32_options() { |
| 408 | TorchaudioSincHannResampleOptions options; |
no test coverage detected