| 804 | } |
| 805 | |
| 806 | std::vector<float> mtmd_audio_streaming_istft::flush() { |
| 807 | std::vector<float> output; |
| 808 | |
| 809 | // Extract remaining samples from overlap buffer |
| 810 | // Continue until we've extracted all meaningful samples |
| 811 | int remaining = n_fft - hop_length; |
| 812 | while (remaining > 0) { |
| 813 | int chunk_size = std::min(remaining, hop_length); |
| 814 | |
| 815 | for (int i = 0; i < chunk_size; i++) { |
| 816 | float sample; |
| 817 | if (window_sum_buffer[i] > 1e-8f) { |
| 818 | sample = overlap_buffer[i] / window_sum_buffer[i]; |
| 819 | } else { |
| 820 | sample = overlap_buffer[i]; |
| 821 | } |
| 822 | output.push_back(sample); |
| 823 | } |
| 824 | |
| 825 | // Shift buffers |
| 826 | std::copy(overlap_buffer.begin() + chunk_size, overlap_buffer.end(), overlap_buffer.begin()); |
| 827 | std::fill(overlap_buffer.end() - chunk_size, overlap_buffer.end(), 0.0f); |
| 828 | |
| 829 | std::copy(window_sum_buffer.begin() + chunk_size, window_sum_buffer.end(), window_sum_buffer.begin()); |
| 830 | std::fill(window_sum_buffer.end() - chunk_size, window_sum_buffer.end(), 0.0f); |
| 831 | |
| 832 | remaining -= chunk_size; |
| 833 | } |
| 834 | |
| 835 | return output; |
| 836 | } |