Vital
Loading...
Searching...
No Matches
utils.cpp
Go to the documentation of this file.
1
7#include "utils.h"
8
9namespace vital {
10
12 constexpr float kPcmScale = 32767.0f;
14 constexpr float kComplexAmplitudePcmScale = 50.0f;
16 constexpr float kComplexPhasePcmScale = 10000.0f;
17
18 namespace utils {
19
22
32 mono_float encodeOrderToFloat(int* order, int size) {
33 // Max array size you can encode in 32 bits.
35
36 unsigned int code = 0;
37 for (int i = 1; i < size; ++i) {
38 int index = 0;
39 for (int j = 0; j < i; ++j)
40 index += order[i] < order[j];
41
42 code *= i + 1;
43 code += index;
44 }
45
46 return code;
47 }
48
55 void decodeFloatToOrder(int* order, mono_float float_code, int size) {
56 // Max array size you can encode in 32 bits.
58
59 int code = static_cast<int>(float_code);
60 for (int i = 0; i < size; ++i)
61 order[i] = i;
62
63 for (int i = 0; i < size; ++i) {
64 int remaining = size - i;
65 int index = remaining - 1;
66 int inversions = code % remaining;
67 code /= remaining;
68
69 int placement = order[index - inversions];
70 for (int j = index - inversions; j < index; ++j)
71 order[j] = order[j + 1];
72
73 order[index] = placement;
74 }
75 }
76
77 void floatToPcmData(int16_t* pcm_data, const float* float_data, int size) {
78 for (int i = 0; i < size; ++i)
79 pcm_data[i] = utils::clamp(float_data[i] * kPcmScale, -kPcmScale, kPcmScale);
80 }
81
82 void complexToPcmData(int16_t* pcm_data, const std::complex<float>* complex_data, int size) {
83 // Interprets the complex data as (amplitude, phase) pairs.
84 // The size argument is the total number of float samples in complex_data,
85 // but each complex entry uses 2 in PCM (amp, phase).
86 for (int i = 0; i < size / 2; ++i) {
87 float amp = std::abs(complex_data[i]);
88 float phase = std::arg(complex_data[i]);
90 pcm_data[i * 2 + 1] = utils::clamp(phase * kComplexPhasePcmScale, -kPcmScale, kPcmScale);
91 }
92 }
93
94 void pcmToFloatData(float* float_data, const int16_t* pcm_data, int size) {
95 for (int i = 0; i < size; ++i)
96 float_data[i] = pcm_data[i] * (1.0f / kPcmScale);
97 }
98
99 void pcmToComplexData(std::complex<float>* complex_data, const int16_t* pcm_data, int size) {
100 // Inverse of complexToPcmData: decode amplitude and phase from PCM to std::polar form.
101 for (int i = 0; i < size / 2; ++i) {
102 float amp = pcm_data[i * 2] * (1.0f / kComplexAmplitudePcmScale);
103 float phase = pcm_data[i * 2 + 1] * (1.0f / kComplexPhasePcmScale);
104 complex_data[i] = std::polar(amp, phase);
105 }
106 }
107
108 } // namespace utils
109} // namespace vital
static int next_seed_
Static seed counter used to automatically assign seeds if none specified.
Definition utils.h:64
#define VITAL_ASSERT(x)
Definition common.h:11
Contains a collection of utility functions and classes used throughout Vital.
force_inline poly_float clamp(poly_float value, mono_float min, mono_float max)
Clamps each lane of a vector to [min, max].
Definition poly_utils.h:306
constexpr int kMaxOrderLength
Maximum length for orders that can be encoded as a float via encodeOrderToFloat().
Definition utils.h:27
void pcmToComplexData(std::complex< float > *complex_data, const int16_t *pcm_data, int size)
Converts 16-bit PCM data representing complex info (amp/phase) back to std::complex floats.
Definition utils.cpp:99
void floatToPcmData(int16_t *pcm_data, const float *float_data, int size)
Converts floating-point audio data to 16-bit PCM data.
Definition utils.cpp:77
void decodeFloatToOrder(int *order, mono_float float_code, int size)
Decodes a float-encoded permutation back into order.
Definition utils.cpp:55
mono_float encodeOrderToFloat(int *order, int size)
Encodes a permutation (stored in order) into a single float.
Definition utils.cpp:32
void complexToPcmData(int16_t *pcm_data, const std::complex< float > *complex_data, int size)
Converts an array of complex floats (magnitude/phase) to PCM data.
Definition utils.cpp:82
void pcmToFloatData(float *float_data, const int16_t *pcm_data, int size)
Converts 16-bit PCM data to floating-point audio data.
Definition utils.cpp:94
Contains classes and functions used within the Vital synthesizer framework.
constexpr float kPcmScale
Scaling for converting float data to 16-bit PCM.
Definition utils.cpp:12
constexpr float kComplexPhasePcmScale
Additional phase scale used for complex data to PCM.
Definition utils.cpp:16
constexpr float kComplexAmplitudePcmScale
Additional amplitude scale used for complex data to PCM.
Definition utils.cpp:14
float mono_float
Definition common.h:33
Provides various utility functions, classes, and constants for audio, math, and general-purpose opera...