Если у вас есть таблица значений формы сигнала (либо один квадрант, либо четыре квадранта, это не имеет значения), то одна из возможных оптимизаций - сохранить значения дельты между последовательными значениями таблицы.Т.е. если у вас есть, например, N = 256
и таблица формы сигнала LUT[N]
, то у вас также есть таблица значений дельты LUT_delta[N]
.Соотношение между двумя предварительно вычисленными таблицами составляет LUT_delta[i] = LUT[i+1] - LUT[i]
.Поэтому вместо того, чтобы искать два последовательных табличных значения, LUT[i]
и LUT[i+1]
, вычитая их для получения дельты, а затем выполняя интерполяцию, вы просто просматриваете первое табличное значение LUT[i]
и дельту LUT_delta[i]
.а затем рассчитать интерполированное значение.Для этого требуется такое же количество просмотров таблиц, но меньше математических операций.Вы должны быть в состоянии выполнить интерполяцию с помощью одной команды умножения с накоплением, если вы используете DSP, иначе это умножение + масштабирование + добавление на ЦП общего назначения.Также, если вы чередуете значения LUT
и LUT_delta
, вы можете найти LUT[i]
и LUT_delta[i]
с помощью одного чтения, а затем распаковать два значения.
Псевдокод:
extract integer LUT index, i, from accumulator // just need a shift for this
extract fractional part of accumulator, f // mask or subtract to get f
get p = LUT[i] // lookup waveform value
get delta = LUT_delta[i] // lookup delta
calculate p_interp = p + p_delta * f // single multiply-accumulate instruction on most DSPs - need scaling on general purpose CPUs