22 const float *input,
size_t input_elements,
size_t input_stride,
23 float *magnitude,
size_t magnitude_elements,
24 float *phase,
size_t phase_elements,
25 size_t bins,
size_t frames) {
26 if (!input || !magnitude || !phase || !bins || !frames ||
29 size_t channels, input_required, output_required;
30 if (!
product(bins, 2, &channels) ||
31 !
product(channels, input_stride, &input_required) ||
32 !
product(bins, frames, &output_required) ||
33 input_required > SIZE_MAX /
sizeof(
float) ||
34 output_required > SIZE_MAX /
sizeof(
float))
36 if (input_elements < input_required ||
37 magnitude_elements < output_required ||
40 const size_t input_bytes = input_required *
sizeof(float);
41 const size_t output_bytes = output_required *
sizeof(float);
42 if (
overlaps(input, input_bytes, magnitude, output_bytes) ||
43 overlaps(input, input_bytes, phase, output_bytes) ||
44 overlaps(magnitude, output_bytes, phase, output_bytes))
47 for (
size_t bin = 0; bin < bins; ++bin) {
48 for (
size_t frame = 0; frame < frames; ++frame) {
49 const float log_magnitude = input[bin * input_stride + frame];
50 const float raw_phase = input[(bins + bin) * input_stride + frame];
51 if (!isfinite(log_magnitude) || !isfinite(raw_phase) ||
52 !isfinite(expf(log_magnitude)))
56 for (
size_t frame = 0; frame < frames; ++frame) {
57 for (
size_t bin = 0; bin < bins; ++bin) {
58 const size_t output_index = frame * bins + bin;
59 magnitude[output_index] = expf(input[bin * input_stride + frame]);
60 phase[output_index] = sinf(input[(bins + bin) * input_stride + frame]);
int audio_spectral_head_mag_phase_f32(const float *input, size_t input_elements, size_t input_stride, float *magnitude, size_t magnitude_elements, float *phase, size_t phase_elements, size_t bins, size_t frames)