57{
58 std::vector<int16_t> table;
59 table.reserve(513);
60
61 FloatT input_min =
62 input_scale * static_cast<FloatT>(std::numeric_limits<int16_t>::min() - input_zp);
63 FloatT input_max =
64 input_scale * static_cast<FloatT>(std::numeric_limits<int16_t>::max() - input_zp);
65 FloatT output_min =
66 output_scale * static_cast<FloatT>(std::numeric_limits<int16_t>::min() - output_zp);
67 FloatT output_max =
68 output_scale * static_cast<FloatT>(std::numeric_limits<int16_t>::max() - output_zp);
69
70 FloatT step = (input_max - input_min) / 512;
71 FloatT half_step = step / 2;
72 FloatT output_scaling_inv = 65536 / (output_max - output_min);
73
74 for (int32_t i = 0; i < 512; i++)
75 {
76 FloatT iFloat = static_cast<FloatT>(i);
77 FloatT sample_val =
78 std::round(func(input_min + (iFloat * step)) * output_scaling_inv);
79 FloatT midpoint_interp_val = std::round(
80 ((func(input_min + (iFloat + 1) * step) * output_scaling_inv) +
81 std::round(func(input_min + (iFloat * step)) * output_scaling_inv)) /
82 2);
83 FloatT midpoint_val = std::round(func(input_min + (iFloat * step) + half_step) *
84 output_scaling_inv);
85 FloatT midpoint_err = midpoint_interp_val - midpoint_val;
86 FloatT bias = std::round(midpoint_err / 2);
87
88 table.push_back(static_cast<int16_t>(
89 std::min<FloatT>(std::max<FloatT>(sample_val - bias, -32768), 32767)));
90 }
91
92 FloatT max_val = std::round(func(input_max) * output_scaling_inv);
93 table.push_back(static_cast<int16_t>(
94 std::min<FloatT>(std::max<FloatT>(max_val, -32768), 32767)));
95 return table;
96}