calc_q_shift/main.c
impressionyang c6a3e0c1be update:💄 更新编码格式
update: 更新增益计算为函数
2024-08-01 16:29:41 +08:00

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;
}