4.03 - EXP для ADSR

Экспоненциатор для ADSR

У полика вст на максимальном значении - 6.5 секунд, в середине 0.25 секунды

Поэтому берем диапазон 0..64..127 и назначаем на Атаку. Дальше масштабируем значение контрола и берем от него экспоненту (e в степени). Смотрим результат при 127 и выбираем делитель, чтобы при 127 получалось 10 секунд.

Далее подбираем масштабирование контрола(делитель значения контрола) так, чтобы на положении 64 время получалось 0.25 секунды и при этом при 127 - десять секунд. Для подбора сделал xls файл.

Методом подбора, найден масштабирующий коэффициент для значения контрола /17, дальше вычисляем EXP, полученный результат делим на 175,5 - получаем время.

Чтобы получить частоту - делим 1/время. Чтобы получить значение DDS из частоты для дискретизации 50 МГц, делим на 50000000/2 и умножаем на разрядность DDS (32 - 4294967296). В итоге получаем слово и отправляем его в ПЛИС.

Вместо возведения экспоненты, можно брать EXP(1) смасштабированное и возводить ее в степень равную значению контрола. Результат будет тот же.

Формула в ctrlr:

(1/(pow(1.060588,modulatorValue)/175.6))/50000000/2*4294967296

Сравниваем с VSTi полика примерные положения и периоды нарастания. Стало похоже. И вообще удобнее.

Диапазон экспоненты не от 0 до 1, потому что накладывается квадратичная зависимость значение слова и частоты DDS.

Чтобы производить преобразование внутри ПЛИС, можно либо линейно апроксимировать функцию, поделив на куски. Либо преобразовывать по таблице (по таблице мы уже преобразовываем значения нота - adder для DDS).

Нужно сравнить что будет выгоднее по ресурсам.

График приближения пятью линиями

График приближения 8 линиями

Модуль lin2exp.v в проекте занимает 384 ячеек. Я считаю, что это много и таблицей будет меньше.

Модуль lin2exp_t.v - табличное преобразование занимает примерно 122 ячейки (только комбинационные функции). Максимальная частота - потолок. В обоих случаях

Однако табличное преобразование оказалось лучше по ячейкам, и проще в дальнейшей доработке. Линейная - сплошной хардкод с fixed умножениями.