Генератор с числовым программным управлением (NCO) Количество образцов

Я проводил некоторые исследования сержантского состава, и некоторая первоначальная информация (или отсутствие информации) беспокоила меня. Прочитал несколько статей на эту тему:

NCO на базе FPGA

Блог о НКО

Но я до сих пор не понимаю, как такой осциллятор может изменять частоту, не уменьшая количество выборок между разными частотами.

Во всех статьях на эту тему упоминается следующее расположение:

Слово приращения ---> Аккумулятор фазы (синхронизируется с основными часами) ----> Таблица поиска синусоиды ---> ЦАП и так далее.

введите описание изображения здесь

Вышеприведенная схема (насколько я понимаю) изменяет количество итераций по таблице, тем самым изменяя время, необходимое для ее прохождения и создания полной синусоидальной волны. Однако допустим, что моя таблица поиска состоит из 2 ^ 8 записей, и я каждый раз увеличиваю таблицу на 1, я прохожу все 2 ^ 8 выборок и получаю частоту Clock/256.

Теперь, если бы я вместо этого каждый раз увеличивал на 4, я бы прошел только 256/4 выборок и, таким образом, получил бы частоту в 4 раза больше, чем в предыдущем примере.

Таким образом, даже если частота варьируется, количество сэмплов, присутствующих на разных частотах, также не отличается.

Как можно изменить частоту, не влияя на количество отсчетов, присутствующих в волне?

Ответы (3)

Этот метод обычно называют прямым цифровым синтезом (DDS) .

Как можно изменить частоту, не влияя на количество отсчетов, присутствующих в волне?

Это не так; Частота дискретизации фиксированная. Т.е. синтезатор/осциллятор выдает какое-то количество семплов в секунду, это не меняется, меняется значение семпла.

Допустим, вы использовали частоту дискретизации 8 кГц, если вы посмотрите на одну секунду вывода, у вас будет 8000 сэмплов. Самая высокая частота, которая может быть выведена с такой скоростью, составляет 4 кГц, что соответствует частоте Найквиста . Для этого 4 кГц значение выборки будет чередоваться 0,255,0,255... индекс вашей таблицы будет 0,128,0,128 или (127,255... или что-то еще). Индекс будет увеличиваться на 128 для каждой выборки. Для сигнала 2 кГц индекс будет увеличиваться на 64 для каждого образца. Оба сигнала будут иметь 8000 выборок за всю секунду, сигнал 2 кГц будет иметь вдвое меньше циклов, чем сигнал 4 кГц за то же время, потому что это половина частоты!

Теперь, если вы имели в виду цикл вместо волны, тогда ответ будет заключаться в том, что вы не можете иметь такое же количество выборок/цикл для другой частоты с той же частотой дискретизации. Если вам нужно больше точности (т.е. больше сэмплов), вам придется увеличить частоту дискретизации.

Это отлично отвечает на мой вопрос!

DDS/NCO — это в основном преобразователь частоты дискретизации, который имеет фиксированную частоту дискретизации на выходе и переменную частоту дискретизации на входе. В вашем примере установка управляющего слова входной частоты на 4 вместо 1 увеличивает частоту выходного сигнала за счет увеличения частоты дискретизации входного сигнала (хранящегося в таблице) в 4 раза при одновременном уменьшении его на 4 (только сохраняя 1 из каждых 4 образцов). Подумайте об этом так: если вы воспроизведете таблицу с 4-кратным Fclk, то вы получите 4-кратную выходную частоту. Однако вы можете генерировать выходные сэмплы только в Fclk, поэтому вам нужно отбрасывать 3 сэмпла через каждые 4 (уменьшить на 4). Это реализовано путем пропуска более трех записей таблицы каждый такт.

Настоящая сила DDS заключается в том, что вы можете иметь очень большой фазовый аккумулятор с большим количеством битов, чем ваша таблица поиска, поэтому вы можете генерировать частоты с очень высоким разрешением, в частности, частота дискретизации, деленная на диапазон аккумулятора. Для тактовой частоты 250 МГц и 32-битного аккумулятора разрешение по частоте составляет 0,058 Гц. Компромисс заключается в том, что выборки не будут абсолютно идеальными из-за усечения фазы, но это, как правило, не так важно, как количество выходных битов, которое предоставляет таблица поиска.

Хранение очень большой интерполяционной таблицы — непростая задача. Для 16-битного вывода вам обычно нужна таблица с 2 ^ 18 записями. Это не помещается в ОЗУ блока FPGA. Существуют методы сохранения сжатой версии таблицы поиска в нескольких таблицах поиска, а затем выполнение какой-либо интерполяции или другой реконструкции для получения правильного значения. Одним из примеров является https://github.com/alexforencich/verilog-dsp/blob/master/rtl/sine_dds_lut.v . Этот модуль представляет собой 16-битную LUT для синусоидальной функции с 18-битным входом. Обычно для хранения требуется 2 ^ 18 * 16 = 4 Мбит, но здесь используется только 16 * 512 * 2 + 8 * 256 = 18 КБ, что дает экономию в 227 раз.

Переменная частота дискретизации отличается от пропуска образцов, я думал так же, как и те ответы, и пытался выяснить то же самое, что и автор темы.

ссылка в качестве доказательства отличается: http://www.electricdruid.net/index.php?page=info.wavetableoscs

Эта ссылка меня успокоила! Спасибо!