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

Go to the source code of this file.

Macros

#define CK_SOURCE_PI_F   3.14159265358979323846f
 

Functions

int audio_harmonic_source_checked_f32 (const float *f0, size_t f0_capacity, const float *gaussian, size_t gaussian_capacity, float *output, size_t output_capacity, float *phase_scratch, size_t scratch_capacity, size_t frames, size_t upsample, size_t harmonics, float sample_rate, float voiced_threshold, float sine_amp, float noise_std)
 
static int audio_harmonic_source_impl_f32 (const float *f0, size_t f0_capacity, const float *gaussian, size_t gaussian_capacity, float *output, size_t output_capacity, float *phase_scratch, size_t scratch_capacity, size_t frames, size_t upsample, size_t harmonics, float sample_rate, float voiced_threshold, float sine_amp, float noise_std, int weighted_fma_interpolation)
 
int audio_harmonic_source_weighted_fma_checked_f32 (const float *f0, size_t f0_capacity, const float *gaussian, size_t gaussian_capacity, float *output, size_t output_capacity, float *phase_scratch, size_t scratch_capacity, size_t frames, size_t upsample, size_t harmonics, float sample_rate, float voiced_threshold, float sine_amp, float noise_std)
 

Macro Definition Documentation

◆ CK_SOURCE_PI_F

#define CK_SOURCE_PI_F   3.14159265358979323846f

Definition at line 8 of file audio_harmonic_source_checked.c.

Function Documentation

◆ audio_harmonic_source_checked_f32()

int audio_harmonic_source_checked_f32 ( const float *  f0,
size_t  f0_capacity,
const float *  gaussian,
size_t  gaussian_capacity,
float *  output,
size_t  output_capacity,
float *  phase_scratch,
size_t  scratch_capacity,
size_t  frames,
size_t  upsample,
size_t  harmonics,
float  sample_rate,
float  voiced_threshold,
float  sine_amp,
float  noise_std 
)

Definition at line 106 of file audio_harmonic_source_checked.c.

113 {
114 return audio_harmonic_source_impl_f32(f0, f0_capacity, gaussian,
115 gaussian_capacity, output, output_capacity, phase_scratch,
116 scratch_capacity, frames, upsample, harmonics, sample_rate,
117 voiced_threshold, sine_amp, noise_std, 0);
118}
static int audio_harmonic_source_impl_f32(const float *f0, size_t f0_capacity, const float *gaussian, size_t gaussian_capacity, float *output, size_t output_capacity, float *phase_scratch, size_t scratch_capacity, size_t frames, size_t upsample, size_t harmonics, float sample_rate, float voiced_threshold, float sine_amp, float noise_std, int weighted_fma_interpolation)

References audio_harmonic_source_impl_f32().

◆ audio_harmonic_source_impl_f32()

static int audio_harmonic_source_impl_f32 ( const float *  f0,
size_t  f0_capacity,
const float *  gaussian,
size_t  gaussian_capacity,
float *  output,
size_t  output_capacity,
float *  phase_scratch,
size_t  scratch_capacity,
size_t  frames,
size_t  upsample,
size_t  harmonics,
float  sample_rate,
float  voiced_threshold,
float  sine_amp,
float  noise_std,
int  weighted_fma_interpolation 
)
static

Definition at line 15 of file audio_harmonic_source_checked.c.

22 {
23 if (!frames || upsample < 4 || !harmonics || !isfinite(sample_rate) ||
24 !isfinite(voiced_threshold) || !isfinite(sine_amp) ||
25 !isfinite(noise_std) || sample_rate <= 0.0f || sine_amp < 0.0f ||
26 noise_std < 0.0f || frames > SIZE_MAX / upsample)
28 const size_t samples = frames * upsample;
29 if (samples > SIZE_MAX / harmonics ||
30 frames > SIZE_MAX / harmonics)
32 if (samples > (1u << 24)) return CK_AUDIO_EXTENT_LIMIT;
33 const size_t output_need = samples * harmonics;
34 const size_t phase_need = frames * harmonics;
35 if (phase_need > SIZE_MAX - output_need)
37 const size_t scratch_need = phase_need + output_need;
38 if (f0_capacity < frames || gaussian_capacity < output_need ||
39 output_capacity < output_need || scratch_capacity < scratch_need)
41 if (!ck_checked_region(f0, frames) ||
42 !ck_checked_region(gaussian, output_need) ||
43 !ck_checked_region(output, output_need) ||
44 !ck_checked_region(phase_scratch, scratch_need) ||
45 ck_checked_overlap(output, output_need, f0, frames) ||
46 ck_checked_overlap(output, output_need, gaussian, output_need) ||
47 ck_checked_overlap(output, output_need, phase_scratch, scratch_need) ||
48 ck_checked_overlap(phase_scratch, scratch_need, f0, frames) ||
49 ck_checked_overlap(phase_scratch, scratch_need, gaussian, output_need) ||
50 !ck_checked_finite(f0, frames) ||
51 !ck_checked_finite(gaussian, output_need))
53 for (size_t harmonic = 0; harmonic < harmonics; ++harmonic) {
54 /* The pinned CPU oracle widens FP32 cumsum's accumulator before
55 * storing each FP32 prefix result. */
56 double running = 0.0;
57 for (size_t frame = 0; frame < frames; ++frame) {
58 const float hz = f0[frame] * (float)(harmonic + 1);
59 const float radians = hz / sample_rate;
60 const float fraction = radians - floorf(radians);
61 running += fraction;
62 const float phase = (float)running * (2.0f * CK_SOURCE_PI_F);
63 phase_scratch[frame * harmonics + harmonic] =
64 phase * (float)upsample;
65 if (!isfinite(phase_scratch[frame * harmonics + harmonic]))
67 }
68 }
69 float *staged = phase_scratch + phase_need;
70 /* Stage the entire output so a late arithmetic failure preserves the
71 * caller's output buffer. */
72 for (size_t sample = 0; sample < samples; ++sample) {
73 const size_t frame = sample / upsample;
74 const float uv = f0[frame] > voiced_threshold ? 1.0f : 0.0f;
75 const float amplitude = uv * noise_std +
76 (1.0f - uv) * (sine_amp / 3.0f);
77 /* PyTorch's align_corners=false interpolation multiplies by a
78 * pre-rounded FP32 reciprocal; division changes long-phase samples. */
79 const float inverse_scale = 1.0f / (float)upsample;
80 float position = inverse_scale * ((float)sample + 0.5f) - 0.5f;
81 if (position < 0.0f) position = 0.0f;
82 if (position > (float)(frames - 1)) position = (float)(frames - 1);
83 const size_t left = (size_t)position;
84 const size_t right = left + 1 < frames ? left + 1 : left;
85 const float right_weight = position - (float)left;
86 for (size_t harmonic = 0; harmonic < harmonics; ++harmonic) {
87 const float a = phase_scratch[left * harmonics + harmonic];
88 const float b = phase_scratch[right * harmonics + harmonic];
89 /* Keep the two numerical contracts distinct. The pinned
90 * PyTorch 2.8 CPU linear-upsample path evaluates the weighted
91 * terms as fmaf(a, 1-w, b*w), whereas the original provider
92 * evaluates a + (b-a)*w. */
93 const float phase = weighted_fma_interpolation
94 ? fmaf(a, 1.0f - right_weight, b * right_weight)
95 : a + (b - a) * right_weight;
96 const float value = sinf(phase) * sine_amp * uv +
97 amplitude * gaussian[sample * harmonics + harmonic];
98 if (!isfinite(value)) return CK_AUDIO_EXTENT_INVALID;
99 staged[sample * harmonics + harmonic] = value;
100 }
101 }
102 memcpy(output, staged, output_need * sizeof(float));
103 return CK_AUDIO_EXTENT_OK;
104}
#define CK_SOURCE_PI_F
static int ck_checked_finite(const float *ptr, size_t n)
static int ck_checked_region(const float *ptr, size_t n)
static int ck_checked_overlap(const float *a, size_t na, const float *b, size_t nb)
@ 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

References CK_AUDIO_EXTENT_INVALID, CK_AUDIO_EXTENT_LIMIT, CK_AUDIO_EXTENT_OK, CK_AUDIO_EXTENT_OVERFLOW, ck_checked_finite(), ck_checked_overlap(), ck_checked_region(), CK_SOURCE_PI_F, left, and right.

Referenced by audio_harmonic_source_checked_f32(), and audio_harmonic_source_weighted_fma_checked_f32().

◆ audio_harmonic_source_weighted_fma_checked_f32()

int audio_harmonic_source_weighted_fma_checked_f32 ( const float *  f0,
size_t  f0_capacity,
const float *  gaussian,
size_t  gaussian_capacity,
float *  output,
size_t  output_capacity,
float *  phase_scratch,
size_t  scratch_capacity,
size_t  frames,
size_t  upsample,
size_t  harmonics,
float  sample_rate,
float  voiced_threshold,
float  sine_amp,
float  noise_std 
)

Definition at line 120 of file audio_harmonic_source_checked.c.

127 {
128 return audio_harmonic_source_impl_f32(f0, f0_capacity, gaussian,
129 gaussian_capacity, output, output_capacity, phase_scratch,
130 scratch_capacity, frames, upsample, harmonics, sample_rate,
131 voiced_threshold, sine_amp, noise_std, 1);
132}

References audio_harmonic_source_impl_f32().