← Back to C-Kernel-Engine Docs Doxygen Source Documentation
 
Loading...
Searching...
No Matches
audio_spectral_head.c File Reference
#include "ckernel_tts.h"
#include <math.h>
#include <stdint.h>

Go to the source code of this file.

Functions

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)
 
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)
 

Function Documentation

◆ audio_spectral_head_mag_phase_f32()

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 
)

Definition at line 21 of file audio_spectral_head.c.

25 {
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)
@ 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

References CK_AUDIO_EXTENT_INVALID, CK_AUDIO_EXTENT_LIMIT, CK_AUDIO_EXTENT_OK, CK_AUDIO_EXTENT_OVERFLOW, overlaps(), and product().

◆ overlaps()

static int overlaps ( const void *  a,
size_t  a_bytes,
const void *  b,
size_t  b_bytes 
)
static

Definition at line 12 of file audio_spectral_head.c.

13 {
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}
const char * left
Definition true_bpe.h:138
const char const char * right
Definition true_bpe.h:139

References left, and right.

Referenced by audio_spectral_head_mag_phase_f32().

◆ product()

static int product ( size_t  a,
size_t  b,
size_t *  out 
)
static