Реализация экспоненциальной функции через LUT

#python #math #fpga #exp

#python #математика #fpga #exp

Вопрос:

Я реализовал экспоненциальную функцию с помощью LUT, и полученные результаты кажутся правильными. Способ, которым я это выполнил, использовал теорему о промежуточных значениях и свойства степеней. Но, например: если входное значение равно x=5.25 , это равно:

Итак, мои вопросы:

  1. Если вычисляемое значение больше единицы, требуется ли новый LUT для вычисления целочисленной части? Уже ответил ниже
  2. Каков был бы оптимальный способ с точки зрения аппаратных ресурсов для реализации экспоненты? На данный момент я не спрашиваю о фиксированной или плавающей точке.

Вот экспоненциальная функция, которую я реализовал с помощью LUT, и полученные результаты для сравнения с реальной экспоненциальной функцией:

 e_constant = 2.718281828459045235360
depth = 16
idx = 1/(2**np.arange(1,depth 1))
LUT_p = np.exp(1/(2**np.arange(1,depth 1)))
LUT_n = np.exp(-1/(2**np.arange(1,depth 1)))
def EXP_LUT(x):
    acc = 0 # Accumulator
    exp = 1 # Returned value
    if x == 0:
        return 1
    if x == 1:
        return e_constant
    
    for i in range(depth):    
        if acc < x:
            acc = acc   idx[i]
            exp = exp * LUT_p[i]
        elif acc > x:
            acc = acc - idx[i]
            exp = exp * LUT_n[i]
        else:
            break
    return exp
 

введите описание изображения здесь

Редактировать 1

Чтобы ответить на мой первый вопрос: если вычисляемое значение больше единицы, требуется ли новый LUT для вычисления целочисленной части?

Очень логичным решением является изменение максимального значения LUT. Например:

 # This works great to ranges between -1 and 1
LUT_i = 1/(2**np.arange(1,depth 1))
LUT_p = np.exp(LUT_i)
LUT_n = np.exp(-LUT_i)

# This works great to ranges between -8 and 8
LUT_i = 8/(2**np.arange(1,depth 1))
LUT_p = np.exp(LUT_i)
LUT_n = np.exp(-LUT_i)
 

Проблема здесь заключается в потере точности в приближении, чтобы решить это (только если это действительно было необходимо), решение заключается в создании LUT с большим количеством значений. Вместо 16 установите 32 сохраненных значения. Следующие графики демонстрируют это:

введите описание изображения здесь

введите описание изображения здесь

Понятно, что графики с ошибкой аппроксимации для 32 сохраненных значений меньше, чем с 16 сохраненными значениями. Итак, я думаю, что на первый вопрос уже дан ответ.