104 lines
3.7 KiB
C
104 lines
3.7 KiB
C
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <math.h>
|
|
|
|
#define Q_MAX (31)
|
|
#define GAIN_ARRAY_LEN (31)
|
|
|
|
uint8_t data_q[GAIN_ARRAY_LEN] = { 0 };
|
|
int32_t data_gain_scale[GAIN_ARRAY_LEN] = { 0 };
|
|
|
|
float data_gain_positive[GAIN_ARRAY_LEN] = {
|
|
1.000000000, 1.12201845, 1.25892541, 1.41253754, 1.58489319,
|
|
1.77827941, 1.99526231, 2.23872114, 2.51188643, 2.81838293,
|
|
3.16227766, 3.54813389, 3.98107171, 4.46683592, 5.01187234,
|
|
5.62341325, 6.30957344, 7.07945784, 7.94328235, 8.91250938,
|
|
10.00000000, 11.22018454, 12.58925412, 14.12537545, 15.84893192,
|
|
17.78279410, 19.95262315, 22.38721139, 25.11886432, 28.18382931,
|
|
31.62277660
|
|
};
|
|
|
|
float data_gain_negative[GAIN_ARRAY_LEN] = {
|
|
1.000000000, 0.891250938, 0.794328235, 0.707945784, 0.630957344,
|
|
0.562341325, 0.501187234, 0.446683592, 0.398107171, 0.354813389,
|
|
0.316227766, 0.281838293, 0.251188643, 0.223872114, 0.199526231,
|
|
0.177827941, 0.158489319, 0.141253754, 0.125892541, 0.112201845,
|
|
0.100000000, 0.089125094, 0.079432823, 0.070794578, 0.063095734,
|
|
0.056234133, 0.050118723, 0.044668359, 0.039810717, 0.035481339,
|
|
0.031622777
|
|
};
|
|
|
|
uint8_t _util_trans_float_gain_to_fixed_gain(float* float_gain_array,
|
|
int32_t* fixed_gain_array,
|
|
uint8_t* fixed_gain_q_array,
|
|
uint16_t gain_count,
|
|
int32_t q_max_scale, uint8_t q_max)
|
|
{
|
|
uint8_t q_shift = 0;
|
|
float data_temp = 0;
|
|
int i = 0, j = 0;
|
|
for (i = 0; i < gain_count; i++) {
|
|
data_temp = float_gain_array[i];
|
|
q_shift = 0;
|
|
for (j = 0; j < Q_MAX; j++) {
|
|
data_temp = data_temp * 2;
|
|
if (data_temp > q_max_scale) {
|
|
// printf("data temp = %f, gain max = %d, q = %d \r\n", data_temp,
|
|
// q_gain_max_scale, j);
|
|
break;
|
|
}
|
|
}
|
|
q_shift = (j >= Q_MAX) ? j - 1 : j;
|
|
fixed_gain_q_array[i] = q_shift;
|
|
fixed_gain_array[i] = (int32_t)(data_temp / 2);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
printf("hello world!\r\n");
|
|
|
|
int i = 0, j = 0;
|
|
int32_t q_gain_max_scale = pow(2, Q_MAX + 1);
|
|
|
|
printf("max q gain scale is %d\r\n", q_gain_max_scale);
|
|
|
|
printf("\r\n//===============calc positive===========================\r\n");
|
|
|
|
_util_trans_float_gain_to_fixed_gain(data_gain_positive, data_gain_scale,
|
|
data_q, GAIN_ARRAY_LEN,
|
|
q_gain_max_scale, Q_MAX);
|
|
|
|
printf("int32_t positive_gain_scale_array[%d] = {\r\n", GAIN_ARRAY_LEN);
|
|
for (i = 0; i < GAIN_ARRAY_LEN; i++) {
|
|
printf("%d, ", data_gain_scale[i]);
|
|
}
|
|
printf("\r\n};\r\n");
|
|
|
|
printf("uint8_t positive_q_array[%d] = {\r\n", GAIN_ARRAY_LEN);
|
|
for (i = 0; i < GAIN_ARRAY_LEN; i++) {
|
|
printf("%d, ", data_q[i]);
|
|
}
|
|
printf("\r\n};\r\n");
|
|
|
|
printf("\r\n//===============calc negative===========================\r\n");
|
|
|
|
_util_trans_float_gain_to_fixed_gain(data_gain_negative, data_gain_scale,
|
|
data_q, GAIN_ARRAY_LEN,
|
|
q_gain_max_scale, Q_MAX);
|
|
|
|
printf("int32_t negetive_gain_scale_array[%d] = {\r\n", GAIN_ARRAY_LEN);
|
|
for (i = 0; i < GAIN_ARRAY_LEN; i++) {
|
|
printf("%d, ", data_gain_scale[i]);
|
|
}
|
|
printf("\r\n};\r\n");
|
|
|
|
printf("uint8_t negetive_q_array[%d] = {\r\n", GAIN_ARRAY_LEN);
|
|
for (i = 0; i < GAIN_ARRAY_LEN; i++) {
|
|
printf("%d, ", data_q[i]);
|
|
}
|
|
printf("\r\n};\r\n");
|
|
|
|
return 0;
|
|
} |