mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-05 13:18:01 +03:00
Temp commit. Sound
This commit is contained in:
+26
-210
@@ -5,199 +5,10 @@
|
||||
|
||||
#include "interpolation.hpp"
|
||||
|
||||
inline float_t interpolate_linear_value(float_t p1, float_t p2, float_t f1, float_t f2, float_t f) {
|
||||
float_t t = (f - f1) / (f2 - f1);
|
||||
return (1.0f - t) * p1 + t * p2;
|
||||
}
|
||||
|
||||
inline void interpolate_linear_value_vec2(vec2* p1, vec2* p2, vec2* f1, vec2* f2, vec2* f, vec2* value) {
|
||||
__m128 _p1;
|
||||
__m128 _p2;
|
||||
__m128 _f1;
|
||||
__m128 _f2;
|
||||
__m128 _f;
|
||||
*(vec2*)&_p1 = *p1;
|
||||
*(vec2*)&_p2 = *p2;
|
||||
*(vec2*)&_f1 = *f1;
|
||||
*(vec2*)&_f2 = *f2;
|
||||
*(vec2*)&_f = *f;
|
||||
|
||||
const __m128 _1 = _mm_set_ps1(1.0f);
|
||||
|
||||
__m128 df = _mm_sub_ps(_f2, _f1);
|
||||
__m128 t = _mm_div_ps(_mm_sub_ps(_f, _f1), df);
|
||||
__m128 t1 = _mm_sub_ps(_1, t);
|
||||
__m128 val = _mm_add_ps(_mm_mul_ps(_p1, t1), _mm_mul_ps(_p2, t));
|
||||
*value = *(vec2*)&val;
|
||||
}
|
||||
|
||||
inline void interpolate_linear_value_vec3(vec3* p1, vec3* p2, vec3* f1, vec3* f2, vec3* f, vec3* value) {
|
||||
__m128 _p1;
|
||||
__m128 _p2;
|
||||
__m128 _f1;
|
||||
__m128 _f2;
|
||||
__m128 _f;
|
||||
*(vec3*)&_p1 = *p1;
|
||||
*(vec3*)&_p2 = *p2;
|
||||
*(vec3*)&_f1 = *f1;
|
||||
*(vec3*)&_f2 = *f2;
|
||||
*(vec3*)&_f = *f;
|
||||
|
||||
const __m128 _1 = _mm_set_ps1(1.0f);
|
||||
|
||||
__m128 df = _mm_sub_ps(_f2, _f1);
|
||||
__m128 t = _mm_div_ps(_mm_sub_ps(_f, _f1), df);
|
||||
__m128 t1 = _mm_sub_ps(_1, t);
|
||||
__m128 val = _mm_add_ps(_mm_mul_ps(_p1, t1), _mm_mul_ps(_p2, t));
|
||||
*value = *(vec3*)&val;
|
||||
}
|
||||
|
||||
inline void interpolate_linear_value_vec4(vec4* p1, vec4* p2, vec4* f1, vec4* f2, vec4* f, vec4* value) {
|
||||
__m128 _p1;
|
||||
__m128 _p2;
|
||||
__m128 _f1;
|
||||
__m128 _f2;
|
||||
__m128 _f;
|
||||
_p1 = _mm_loadu_ps((float*)p1);
|
||||
_p2 = _mm_loadu_ps((float*)p2);
|
||||
_f1 = _mm_loadu_ps((float*)f1);
|
||||
_f2 = _mm_loadu_ps((float*)f2);
|
||||
_f = _mm_loadu_ps((float*)f);
|
||||
|
||||
const __m128 _1 = _mm_set_ps1(1.0f);
|
||||
|
||||
__m128 df = _mm_sub_ps(_f2, _f1);
|
||||
__m128 t = _mm_div_ps(_mm_sub_ps(_f, _f1), df);
|
||||
__m128 t1 = _mm_sub_ps(_1, t);
|
||||
_mm_storeu_ps((float*)value, _mm_add_ps(_mm_mul_ps(_p1, t1), _mm_mul_ps(_p2, t)));
|
||||
}
|
||||
|
||||
inline void interpolate_linear(float_t p1, float_t p2,
|
||||
size_t f1, size_t f2, float_t** arr, size_t* length) {
|
||||
*length = f2 - f1 + 1;
|
||||
*arr = force_malloc_s(float_t, *length);
|
||||
|
||||
float_t* a = *arr;
|
||||
float_t l = (float_t)*length;
|
||||
for (size_t i = 0; i < l; i++, a++)
|
||||
*a = interpolate_linear_value(p1, p2,
|
||||
(float_t)f1, (float_t)f2, (float_t)(f1 + i));
|
||||
}
|
||||
|
||||
inline float_t interpolate_chs_value(float_t p1, float_t p2,
|
||||
float_t t1, float_t t2, float_t f1, float_t f2, float_t f) {
|
||||
float_t df = f - f1;
|
||||
float_t t = df / (f2 - f1);
|
||||
float_t t_1 = t - 1.0f;
|
||||
return p1 + t * t * (3.0f - 2.0f * t) * (p2 - p1) + (t_1 * t1 + t * t2) * df * t_1;
|
||||
}
|
||||
|
||||
inline void interpolate_chs_value_vec2(vec2* p1, vec2* p2,
|
||||
vec2* t1, vec2* t2, vec2* f1, vec2* f2, vec2* f, vec2* value) {
|
||||
__m128 _p1;
|
||||
__m128 _p2;
|
||||
__m128 _t1;
|
||||
__m128 _t2;
|
||||
__m128 _f1;
|
||||
__m128 _f2;
|
||||
__m128 _f;
|
||||
*(vec2*)&_p1 = *p1;
|
||||
*(vec2*)&_p2 = *p2;
|
||||
*(vec2*)&_t1 = *t1;
|
||||
*(vec2*)&_t2 = *t2;
|
||||
*(vec2*)&_f1 = *f1;
|
||||
*(vec2*)&_f2 = *f2;
|
||||
*(vec2*)&_f = *f;
|
||||
|
||||
const __m128 _1 = _mm_set_ps1(1.0f);
|
||||
const __m128 _2 = _mm_set_ps1(2.0f);
|
||||
const __m128 _3 = _mm_set_ps1(3.0f);
|
||||
|
||||
__m128 df = _mm_sub_ps(_f, _f1);
|
||||
__m128 t = _mm_div_ps(df, _mm_sub_ps(_f2, _f1));
|
||||
__m128 t_1 = _mm_sub_ps(t, _1);
|
||||
|
||||
__m128 delta = _mm_mul_ps(_mm_mul_ps(_mm_mul_ps(t, t), _mm_sub_ps(_3, _mm_mul_ps(_2, t))), _mm_sub_ps(_p2, _p1));
|
||||
__m128 tangent = _mm_mul_ps(_mm_add_ps(_mm_mul_ps(t_1, _t1), _mm_mul_ps(t, _t2)), _mm_mul_ps(df, t_1));
|
||||
__m128 val = _mm_add_ps(_mm_add_ps(_p1, delta), tangent);
|
||||
*value = *(vec2*)&val;
|
||||
}
|
||||
|
||||
inline void interpolate_chs_value_vec3(vec3* p1, vec3* p2, vec3* t1,
|
||||
vec3* t2, vec3* f1, vec3* f2, vec3* f, vec3* value) {
|
||||
__m128 _p1;
|
||||
__m128 _p2;
|
||||
__m128 _t1;
|
||||
__m128 _t2;
|
||||
__m128 _f1;
|
||||
__m128 _f2;
|
||||
__m128 _f;
|
||||
*(vec3*)&_p1 = *p1;
|
||||
*(vec3*)&_p2 = *p2;
|
||||
*(vec3*)&_t1 = *t1;
|
||||
*(vec3*)&_t2 = *t2;
|
||||
*(vec3*)&_f1 = *f1;
|
||||
*(vec3*)&_f2 = *f2;
|
||||
*(vec3*)&_f = *f;
|
||||
|
||||
const __m128 _1 = _mm_set_ps1(1.0f);
|
||||
const __m128 _2 = _mm_set_ps1(2.0f);
|
||||
const __m128 _3 = _mm_set_ps1(3.0f);
|
||||
|
||||
__m128 df = _mm_sub_ps(_f, _f1);
|
||||
__m128 t = _mm_div_ps(df, _mm_sub_ps(_f2, _f1));
|
||||
__m128 t_1 = _mm_sub_ps(t, _1);
|
||||
|
||||
__m128 delta = _mm_mul_ps(_mm_mul_ps(_mm_mul_ps(t, t), _mm_sub_ps(_3, _mm_mul_ps(_2, t))), _mm_sub_ps(_p2, _p1));
|
||||
__m128 tangent = _mm_mul_ps(_mm_add_ps(_mm_mul_ps(t_1, _t1), _mm_mul_ps(t, _t2)), _mm_mul_ps(df, t_1));
|
||||
__m128 val = _mm_add_ps(_mm_add_ps(_p1, delta), tangent);
|
||||
*value = *(vec3*)&val;
|
||||
}
|
||||
|
||||
inline void interpolate_chs_value_vec4(vec4* p1, vec4* p2,
|
||||
vec4* t1, vec4* t2, vec4* f1, vec4* f2, vec4* f, vec4* value) {
|
||||
__m128 _p1;
|
||||
__m128 _p2;
|
||||
__m128 _t1;
|
||||
__m128 _t2;
|
||||
__m128 _f1;
|
||||
__m128 _f2;
|
||||
__m128 _f;
|
||||
_p1 = _mm_loadu_ps((float*)p1);
|
||||
_p2 = _mm_loadu_ps((float*)p2);
|
||||
_t1 = _mm_loadu_ps((float*)t1);
|
||||
_t2 = _mm_loadu_ps((float*)t2);
|
||||
_f1 = _mm_loadu_ps((float*)f1);
|
||||
_f2 = _mm_loadu_ps((float*)f2);
|
||||
_f = _mm_loadu_ps((float*)f);
|
||||
|
||||
const __m128 _1 = _mm_set_ps1(1.0f);
|
||||
const __m128 _2 = _mm_set_ps1(2.0f);
|
||||
const __m128 _3 = _mm_set_ps1(3.0f);
|
||||
|
||||
__m128 df = _mm_sub_ps(_f, _f1);
|
||||
__m128 t = _mm_div_ps(df, _mm_sub_ps(_f2, _f1));
|
||||
__m128 t_1 = _mm_sub_ps(t, _1);
|
||||
|
||||
__m128 delta = _mm_mul_ps(_mm_mul_ps(_mm_mul_ps(t, t), _mm_sub_ps(_3, _mm_mul_ps(_2, t))), _mm_sub_ps(_p2, _p1));
|
||||
__m128 tangent = _mm_mul_ps(_mm_add_ps(_mm_mul_ps(t_1, _t1), _mm_mul_ps(t, _t2)), _mm_mul_ps(df, t_1));
|
||||
_mm_storeu_ps((float*)value, _mm_add_ps(_mm_add_ps(_p1, delta), tangent));
|
||||
}
|
||||
|
||||
inline void interpolate_chs(float_t p1, float_t p2,
|
||||
float_t t1, float_t t2, size_t f1, size_t f2, float_t** arr, size_t* length) {
|
||||
*length = f2 - f1 + 1;
|
||||
*arr = force_malloc_s(float_t, *length);
|
||||
|
||||
float_t* a = *arr;
|
||||
float_t l = (float_t)*length;
|
||||
for (size_t i = 0; i < l; i++, a++)
|
||||
*a = interpolate_chs_value(p1, p2, t1, t2, (float_t)f1, (float_t)f2, (float_t)(f1 + i));
|
||||
}
|
||||
|
||||
void interpolate_chs_reverse_value(float_t* arr, size_t length,
|
||||
float_t* t1, float_t* t2, size_t f1, size_t f2, size_t f) {
|
||||
*t1 = *t2 = 0.0f;
|
||||
float_t& t1, float_t& t2, size_t f1, size_t f2, size_t f) {
|
||||
t1 = 0.0f;
|
||||
t2 = 0.0f;
|
||||
|
||||
if (!arr || length < 2 || f - f1 + 1 >= length || f < 1 || f < f1 || f + 2 > f2)
|
||||
return;
|
||||
@@ -214,13 +25,15 @@ void interpolate_chs_reverse_value(float_t* arr, size_t length,
|
||||
t1_t2_1 /= df_1 * t1_1;
|
||||
t1_t2_2 /= df_2 * t2_1;
|
||||
|
||||
*t1 = (t1_t2_1 * _t2 - t1_t2_2 * _t1) / (_t1 - _t2);
|
||||
*t2 = (-t1_t2_1 * t2_1 + t1_t2_2 * t1_1) / (_t1 - _t2);
|
||||
t1 = (t1_t2_1 * _t2 - t1_t2_2 * _t1) / (_t1 - _t2);
|
||||
t2 = (-t1_t2_1 * t2_1 + t1_t2_2 * t1_1) / (_t1 - _t2);
|
||||
}
|
||||
|
||||
void interpolate_chs_reverse(float_t* arr, size_t length,
|
||||
float_t* t1, float_t* t2, size_t f1, size_t f2) {
|
||||
*t1 = *t2 = 0.0f;
|
||||
float_t& t1, float_t& t2, size_t f1, size_t f2) {
|
||||
t1 = 0.0f;
|
||||
t2 = 0.0f;
|
||||
|
||||
if (f2 - f1 - 2 < 1)
|
||||
return;
|
||||
|
||||
@@ -229,17 +42,18 @@ void interpolate_chs_reverse(float_t* arr, size_t length,
|
||||
double_t tt1 = 0.0;
|
||||
double_t tt2 = 0.0;
|
||||
for (size_t i = f1 + 1; i < f2 - 1; i++) {
|
||||
interpolate_chs_reverse_value(arr, length, &_t1, &_t2, f1, f2, i);
|
||||
interpolate_chs_reverse_value(arr, length, _t1, _t2, f1, f2, i);
|
||||
tt1 += _t1;
|
||||
tt2 += _t2;
|
||||
}
|
||||
*t1 = (float_t)(tt1 / (double_t)(f2 - f1 - 2));
|
||||
*t2 = (float_t)(tt2 / (double_t)(f2 - f1 - 2));
|
||||
t1 = (float_t)(tt1 / (double_t)(f2 - f1 - 2));
|
||||
t2 = (float_t)(tt2 / (double_t)(f2 - f1 - 2));
|
||||
}
|
||||
|
||||
void interpolate_chs_reverse_step_value(float_t* arr, size_t length,
|
||||
float_t* t1, float_t* t2, size_t f1, size_t f2, size_t f, uint8_t step) {
|
||||
*t1 = *t2 = 0.0f;
|
||||
float_t& t1, float_t& t2, size_t f1, size_t f2, size_t f, uint8_t step) {
|
||||
t1 = 0.0f;
|
||||
t2 = 0.0f;
|
||||
|
||||
if (!arr || length < 2 || f - f1 + 1 >= length || f < 1 || f < f1 || f + 2 > f2)
|
||||
return;
|
||||
@@ -256,13 +70,15 @@ void interpolate_chs_reverse_step_value(float_t* arr, size_t length,
|
||||
t1_t2_1 /= df_1 * t1_1;
|
||||
t1_t2_2 /= df_2 * t2_1;
|
||||
|
||||
*t1 = (t1_t2_1 * _t2 - t1_t2_2 * _t1) / (_t1 - _t2);
|
||||
*t2 = (-t1_t2_1 * t2_1 + t1_t2_2 * t1_1) / (_t1 - _t2);
|
||||
t1 = (t1_t2_1 * _t2 - t1_t2_2 * _t1) / (_t1 - _t2);
|
||||
t2 = (-t1_t2_1 * t2_1 + t1_t2_2 * t1_1) / (_t1 - _t2);
|
||||
}
|
||||
|
||||
void interpolate_chs_reverse_step(float_t* arr, size_t length,
|
||||
float_t* t1, float_t* t2, size_t f1, size_t f2, uint8_t step) {
|
||||
*t1 = *t2 = 0.0f;
|
||||
float_t& t1, float_t& t2, size_t f1, size_t f2, uint8_t step) {
|
||||
t1 = 0.0f;
|
||||
t2 = 0.0f;
|
||||
|
||||
if (f2 - f1 - 2 < 1)
|
||||
return;
|
||||
|
||||
@@ -271,12 +87,12 @@ void interpolate_chs_reverse_step(float_t* arr, size_t length,
|
||||
double_t tt1 = 0.0;
|
||||
double_t tt2 = 0.0;
|
||||
for (size_t i = f1 + 1; i < f2 - 1; i++) {
|
||||
interpolate_chs_reverse_step_value(arr, length, &_t1, &_t2, f1, f2, i, step);
|
||||
interpolate_chs_reverse_step_value(arr, length, _t1, _t2, f1, f2, i, step);
|
||||
tt1 += _t1;
|
||||
tt2 += _t2;
|
||||
}
|
||||
*t1 = (float_t)(tt1 / (double_t)(f2 - f1 - 2));
|
||||
*t2 = (float_t)(tt2 / (double_t)(f2 - f1 - 2));
|
||||
t1 = (float_t)(tt1 / (double_t)(f2 - f1 - 2));
|
||||
t2 = (float_t)(tt2 / (double_t)(f2 - f1 - 2));
|
||||
}
|
||||
|
||||
int32_t interpolate_chs_reverse_sequence(std::vector<float_t>& values_src, std::vector<kft3>& values) {
|
||||
@@ -350,7 +166,7 @@ int32_t interpolate_chs_reverse_sequence(std::vector<float_t>& values_src, std::
|
||||
for (size_t j = 1; j < i; j++) {
|
||||
float_t _t1 = 0.0f;
|
||||
float_t _t2 = 0.0f;
|
||||
interpolate_chs_reverse_value(a, left_count, &_t1, &_t2, 0, i, j);
|
||||
interpolate_chs_reverse_value(a, left_count, _t1, _t2, 0, i, j);
|
||||
tt1 += _t1;
|
||||
tt2 += _t2;
|
||||
}
|
||||
@@ -366,7 +182,7 @@ int32_t interpolate_chs_reverse_sequence(std::vector<float_t>& values_src, std::
|
||||
}
|
||||
}
|
||||
|
||||
if (fabsf(t1) > 1.0f || fabsf(t2) > 1.0f)
|
||||
if (fabsf(t1) > 0.5f || fabsf(t2) > 0.5f)
|
||||
has_error = true;
|
||||
|
||||
if (!has_error) {
|
||||
|
||||
Reference in New Issue
Block a user