| 48 | }; |
| 49 | |
| 50 | void ensure_workspace( |
| 51 | Workspace & workspace, |
| 52 | const WorkspaceConfig & config, |
| 53 | int64_t freq_bins, |
| 54 | const std::vector<float> & window, |
| 55 | const char * label) { |
| 56 | const int64_t pad = (config.n_fft - config.hop_length) / 2; |
| 57 | const int64_t output_size = (config.frames - 1) * config.hop_length + config.n_fft; |
| 58 | const int64_t samples = output_size - 2 * pad; |
| 59 | require(samples > 0, label); |
| 60 | if (workspace.frames == config.frames && |
| 61 | workspace.freq_bins == freq_bins && |
| 62 | workspace.n_fft == config.n_fft && |
| 63 | workspace.output_size == output_size && |
| 64 | workspace.window == window) { |
| 65 | return; |
| 66 | } |
| 67 | |
| 68 | workspace.frames = config.frames; |
| 69 | workspace.freq_bins = freq_bins; |
| 70 | workspace.n_fft = config.n_fft; |
| 71 | workspace.output_size = output_size; |
| 72 | workspace.window = window; |
| 73 | workspace.spectrum.resize(static_cast<size_t>(config.frames * freq_bins)); |
| 74 | workspace.framed.resize(static_cast<size_t>(config.frames * config.n_fft)); |
| 75 | workspace.folded.resize(static_cast<size_t>(output_size)); |
| 76 | workspace.envelope.assign(static_cast<size_t>(output_size), 0.0F); |
| 77 | workspace.audio.resize(static_cast<size_t>(samples)); |
| 78 | for (int64_t frame = 0; frame < config.frames; ++frame) { |
| 79 | const int64_t start = frame * config.hop_length; |
| 80 | for (int64_t i = 0; i < config.n_fft; ++i) { |
| 81 | const float w = window[static_cast<size_t>(i)]; |
| 82 | workspace.envelope[static_cast<size_t>(start + i)] += w * w; |
| 83 | } |
| 84 | } |
| 85 | } |
| 86 | |
| 87 | template <typename Timing> |
| 88 | void finish_istft_from_spectrum( |
no test coverage detected