| 88 | } |
| 89 | |
| 90 | void compute_stft_complex_normalized( |
| 91 | std::vector<float> & framed, |
| 92 | std::vector<std::complex<float>> & spectrum, |
| 93 | const std::vector<float> & signal, |
| 94 | const std::vector<float> & window, |
| 95 | int64_t batch, |
| 96 | int64_t samples, |
| 97 | int64_t frames, |
| 98 | int64_t n_fft, |
| 99 | const std::vector<int32_t> & frame_indices, |
| 100 | size_t fft_threads) { |
| 101 | const int64_t freq_bins = (n_fft / 2) + 1; |
| 102 | framed.resize(static_cast<size_t>(batch * frames * n_fft)); |
| 103 | #ifdef _OPENMP |
| 104 | #pragma omp parallel for if(batch * frames >= 8) |
| 105 | #endif |
| 106 | for (int64_t b = 0; b < batch; ++b) { |
| 107 | const float * src = signal.data() + static_cast<size_t>(b * samples); |
| 108 | for (int64_t frame_index = 0; frame_index < frames; ++frame_index) { |
| 109 | float * frame = framed.data() + static_cast<size_t>((b * frames + frame_index) * n_fft); |
| 110 | const int32_t * mapping = frame_indices.data() + static_cast<size_t>(frame_index * n_fft); |
| 111 | for (int64_t i = 0; i < n_fft; ++i) { |
| 112 | frame[i] = src[mapping[i]] * window[static_cast<size_t>(i)]; |
| 113 | } |
| 114 | } |
| 115 | } |
| 116 | |
| 117 | engine::audio::TensorShape shape_in{ |
| 118 | static_cast<size_t>(batch), |
| 119 | static_cast<size_t>(frames), |
| 120 | static_cast<size_t>(n_fft), |
| 121 | }; |
| 122 | engine::audio::TensorStrideBytes stride_in{ |
| 123 | static_cast<std::ptrdiff_t>(frames * n_fft * static_cast<int64_t>(sizeof(float))), |
| 124 | static_cast<std::ptrdiff_t>(n_fft * static_cast<int64_t>(sizeof(float))), |
| 125 | static_cast<std::ptrdiff_t>(sizeof(float)), |
| 126 | }; |
| 127 | engine::audio::TensorStrideBytes stride_out{ |
| 128 | static_cast<std::ptrdiff_t>(frames * freq_bins * static_cast<int64_t>(sizeof(std::complex<float>))), |
| 129 | static_cast<std::ptrdiff_t>(freq_bins * static_cast<int64_t>(sizeof(std::complex<float>))), |
| 130 | static_cast<std::ptrdiff_t>(sizeof(std::complex<float>)), |
| 131 | }; |
| 132 | |
| 133 | spectrum.resize(static_cast<size_t>(batch * frames * freq_bins)); |
| 134 | engine::audio::real_fft_forward( |
| 135 | shape_in, |
| 136 | stride_in, |
| 137 | stride_out, |
| 138 | 2, |
| 139 | framed.data(), |
| 140 | spectrum.data(), |
| 141 | 1.0f / std::sqrt(static_cast<float>(n_fft)), |
| 142 | fft_threads); |
| 143 | } |
| 144 | |
| 145 | std::pair<float, float> normalize_in_place_with_stats( |
| 146 | std::vector<float> & values, |
no test coverage detected