Я сделал синус LUT для VHDL, используя 256 элементов.
Я использую вход MIDI, поэтому значения находятся в диапазоне от 8,17 Гц (примечание № 0) до 12543,85z (примечание № 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 Гц), и просто уменьшается громкость каждый раз, когда я пытаюсь понизить ноту.</p>
Если вам нужны части моего кода, дайте мне знать.