You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.2 KiB
72 lines
2.2 KiB
|
|
#ifndef __INTERPOLATION_H__
|
|
#define __INTERPOLATION_H__
|
|
#include <stdint.h>
|
|
#include <typeinfo>
|
|
|
|
void interpolation(const float *x, const float *y, int Num, float x0, float*y0);
|
|
void interpolation(const float *x, const unsigned short *y, int Num, float x0, unsigned short *y0);
|
|
int interpolation(unsigned char *x, bool *y, int xNum, unsigned char x0, bool *y0);
|
|
void pre_interp(int iso, int *iso_list, int num, int &lo, int &hi, float &ratio);
|
|
|
|
#define RATIO_FIXBIT 14
|
|
|
|
template <class T>
|
|
inline T interpolation_temp1(T lower, T upper, uint16_t ratio){
|
|
int32_t tmp = (int32_t)upper - (int32_t) lower;
|
|
tmp = (tmp * ratio) >> RATIO_FIXBIT;
|
|
return lower + tmp;
|
|
}
|
|
|
|
template <class T>
|
|
inline T interpolation_temp2(T lower, T upper, float ratio){
|
|
if (lower == upper) {
|
|
return lower;
|
|
} else {
|
|
float tmp = (float)upper - (float) lower;
|
|
tmp = lower + tmp * ratio;
|
|
if (typeid(T) == typeid(float))
|
|
return tmp;
|
|
else
|
|
return (T) (tmp + 0.5);
|
|
}
|
|
}
|
|
|
|
inline bool interpolation_bool(bool lower, bool upper, uint16_t ratio) {
|
|
bool is_upper = !! (ratio & (1 << (RATIO_FIXBIT - 1)));
|
|
// return is_upper?: upper: lower;
|
|
return (is_upper && upper) || (!is_upper && lower);
|
|
}
|
|
|
|
inline uint8_t interpolation_u8(uint8_t lower, uint8_t upper, uint16_t ratio) {
|
|
return interpolation_temp1<uint8_t>(lower, upper, ratio);
|
|
}
|
|
|
|
inline int8_t interpolation_i8(int8_t lower, int8_t upper, uint16_t ratio) {
|
|
return interpolation_temp1<int8_t>(lower, upper, ratio);
|
|
}
|
|
|
|
inline uint16_t interpolation_u16(uint16_t lower, uint16_t upper, uint16_t ratio) {
|
|
return interpolation_temp1<uint16_t>(lower, upper, ratio);
|
|
}
|
|
|
|
inline int16_t interpolation_i16(int16_t lower, int16_t upper, uint16_t ratio) {
|
|
return interpolation_temp1<int16_t>(lower, upper, ratio);
|
|
}
|
|
|
|
inline int32_t interpolation_i32(int32_t lower, int32_t upper, float ratio) {
|
|
return interpolation_temp2<int32_t>(lower, upper, ratio);
|
|
}
|
|
|
|
inline uint32_t interpolation_u32(uint32_t lower, uint32_t upper, float ratio) {
|
|
return interpolation_temp2<uint32_t>(lower, upper, ratio);
|
|
}
|
|
|
|
inline float interpolation_f32(float lower, float upper, float ratio) {
|
|
return interpolation_temp2<float>(lower, upper, ratio);
|
|
}
|
|
|
|
#include "interpolation_ex.h"
|
|
|
|
#endif
|