Синус LUT VHDL не будет симулировать ниже 800 Гц - PullRequest
2 голосов
/ 19 февраля 2012

Я сделал синус 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>

Если вам нужны части моего кода, дайте мне знать.

1 Ответ

3 голосов
/ 19 февраля 2012

Просто догадываясь, я подозреваю, что ваш step_counter не проходит достаточное количество циклов, поэтому ваш индекс (в синусоиде) не проходит полных 360 градусов для низких частот.

Для более полезной информации вам, вероятно, придется отправить код.

Кстати, почему вы не используете нечто большее, чем обычные DDS? У Analog Devices есть приятная статья по основам: DDS Tutorial

...