← Back to C-Kernel-Engine Docs Doxygen Source Documentation
 
Loading...
Searching...
No Matches
audio_spectral_head.c
Go to the documentation of this file.
1#include "ckernel_tts.h"
2
3#include <math.h>
4#include <stdint.h>
5
6static int product(size_t a, size_t b, size_t *out) {
7 if (a && b > SIZE_MAX / a) return 0;
8 *out = a * b;
9 return 1;
10}
11
12static int overlaps(const void *a, size_t a_bytes,
13 const void *b, size_t b_bytes) {
14 const uintptr_t left = (uintptr_t)a;
15 const uintptr_t right = (uintptr_t)b;
16 if (a_bytes > UINTPTR_MAX - left || b_bytes > UINTPTR_MAX - right)
17 return 1;
18 return left < right + b_bytes && right < left + a_bytes;
19}
20
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 ||
27 input_stride < frames) return CK_AUDIO_EXTENT_INVALID;
28
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 ||
38 phase_elements < output_required) return CK_AUDIO_EXTENT_LIMIT;
39
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))
46
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)))
54 }
55 }
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]);
61 }
62 }
63 return CK_AUDIO_EXTENT_OK;
64}
static int overlaps(const void *a, size_t a_bytes, const void *b, size_t b_bytes)
static int product(size_t a, size_t b, size_t *out)
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)
@ CK_AUDIO_EXTENT_INVALID
Definition ckernel_tts.h:42
@ CK_AUDIO_EXTENT_LIMIT
Definition ckernel_tts.h:43
@ CK_AUDIO_EXTENT_OVERFLOW
Definition ckernel_tts.h:44
@ CK_AUDIO_EXTENT_OK
Definition ckernel_tts.h:41
const char * left
Definition true_bpe.h:138
const char const char * right
Definition true_bpe.h:139