| 890 | #pragma omp parallel for collapse(2) if(channels * freq_bins >= 512) |
| 891 | #endif |
| 892 | for (int64_t ch = 0; ch < channels; ++ch) { |
| 893 | for (int64_t freq = 0; freq < freq_bins; ++freq) { |
| 894 | for (int64_t frame_index = 0; frame_index < frames; ++frame_index) { |
| 895 | const size_t src = static_cast<size_t>((((ch * freq_bins) + freq) * frames + frame_index) * 2); |
| 896 | spectrum[static_cast<size_t>(((ch * freq_bins) + freq) * frames + frame_index)] = { |
| 897 | complex_spec[src], |
| 898 | complex_spec[src + 1], |
| 899 | }; |
| 900 | } |
| 901 | } |
| 902 | } |
| 903 | |
| 904 | engine::audio::TensorShape output_shape{ |
| 905 | static_cast<size_t>(channels), |
| 906 | static_cast<size_t>(config.n_fft), |
| 907 | static_cast<size_t>(frames), |
| 908 | }; |
| 909 | engine::audio::TensorStrideBytes input_strides{ |
| 910 | static_cast<std::ptrdiff_t>(freq_bins * frames * static_cast<int64_t>(sizeof(std::complex<float>))), |
| 911 | static_cast<std::ptrdiff_t>(frames * static_cast<int64_t>(sizeof(std::complex<float>))), |
| 912 | static_cast<std::ptrdiff_t>(sizeof(std::complex<float>)), |
| 913 | }; |
| 914 | engine::audio::TensorStrideBytes output_strides{ |
| 915 | static_cast<std::ptrdiff_t>(config.n_fft * frames * static_cast<int64_t>(sizeof(float))), |
| 916 | static_cast<std::ptrdiff_t>(frames * static_cast<int64_t>(sizeof(float))), |
| 917 | static_cast<std::ptrdiff_t>(sizeof(float)), |
| 918 | }; |
| 919 | |
| 920 | std::vector<float> framed(static_cast<size_t>(channels * config.n_fft * frames), 0.0f); |
| 921 | engine::audio::real_fft_inverse( |
| 922 | output_shape, |
| 923 | input_strides, |
| 924 | output_strides, |
| 925 | 1, |
| 926 | spectrum.data(), |
| 927 | framed.data(), |
| 928 | 1.0f / static_cast<float>(config.n_fft), |
| 929 | threads); |
| 930 | |
| 931 | const int64_t pad = config.center ? config.n_fft / 2 : 0; |
| 932 | const int64_t padded_samples = samples + 2 * pad; |
| 933 | const int64_t usable_window = std::min<int64_t>(config.win_length, config.n_fft); |
| 934 | const int64_t window_offset = (config.n_fft - config.win_length) / 2; |
| 935 | std::vector<float> window_sq(static_cast<size_t>(usable_window), 0.0f); |
| 936 | #ifdef _OPENMP |
| 937 | #pragma omp parallel for if(usable_window >= 256) |
| 938 | #endif |
| 939 | for (int64_t i = 0; i < usable_window; ++i) { |
| 940 | const float w = window[static_cast<size_t>(i)]; |
| 941 | window_sq[static_cast<size_t>(i)] = w * w; |
| 942 | } |
| 943 |
no test coverage detected