| 578 | } |
| 579 | |
| 580 | SparseMelFilterbank MelFilterbank::prepare_sparse(const AudioTensor & filterbank) const { |
| 581 | if (filterbank.shape.size() != 2) { |
| 582 | throw std::runtime_error("SparseMelFilterbank requires rank-2 filterbank"); |
| 583 | } |
| 584 | const int64_t n_mels = filterbank.shape[0]; |
| 585 | const int64_t freq_bins = filterbank.shape[1]; |
| 586 | if (n_mels <= 0 || freq_bins <= 0 || |
| 587 | static_cast<int64_t>(filterbank.values.size()) != checked_product({n_mels, freq_bins})) { |
| 588 | throw std::runtime_error("SparseMelFilterbank filterbank shape mismatch"); |
| 589 | } |
| 590 | SparseMelFilterbank sparse; |
| 591 | sparse.dense = filterbank; |
| 592 | sparse.starts = sparse_mel_starts(sparse.dense); |
| 593 | sparse.ends = sparse_mel_ends(sparse.dense); |
| 594 | return sparse; |
| 595 | } |
| 596 | |
| 597 | AudioTensor MelFilterbank::compute( |
| 598 | const std::vector<float> & power_spec, |
no test coverage detected