Я сделал синус LUT для VHDL, используя 256 элементов.
Я использую MIDI-вход, поэтому значения варьируются от 8,17 Гц (нота № 0) до 12543,85 Гц (нота № 127).
У меня есть еще один LUT, который вычисляет, сколько значений должно быть отправлено моему кодеку 48 кГц, чтобы воспроизвести звук (для частоты 8,17 Гц потребуется 48000/8.17 = 5870
значений).
У меня есть еще один LUT, который содержит коэффициент индекса, который равен 256/num_Values
, который используется для вызова значений из таблицы sin (например: 100*256/5870 = 4
(с целочисленным округлением)).
Я отправляю этот коэффициент индекса в другой файл VHDL, который используется для расчета того, какое значение следует отправить обратно. (пример: index = index_factor*step_counter
)
Когда я получаю этот индекс, я делю его на 100 и вызываю sineLUT[index]
, чтобы получить значение, которое мне нужно для генерации синусоиды с нужной частотой.
Проблема в том, что у меня работает только последняя 51 нота, и я не знаю почему. Кажется, что он застревает на постоянной ноте на любой частоте ниже этой (‹650 Гц) и просто уменьшает громкость каждый раз, когда я пытаюсь понизить ноту.
Если вам нужны части моего кода, дайте мне знать.