Что может быть источником этого искажения синусоидальной волны, видимого в виде равноотстоящих линий в БПФ?

У меня есть MCU, управляющий 16-битным ЦАП через SPI (и дополнительный выход LDAC, который запускает обновление выхода ЦАП). MCU имеет предварительно рассчитанную синусоиду 1120 Гц в буфере длиной 364 байта (все вычисления в float32, округленные до uint16 для вывода ЦАП), дискретизированные на частоте 29120 Гц. В прерывании по таймеру обновление ЦАП запускается через LDAC, а затем новое значение загружается из буфера и отправляется через SPI. Обновление до последнего значения запускается в начале, чтобы уменьшить дрожание из-за состязания доступа к памяти с DMA. Прерывание имеет достаточно высокий приоритет, чтобы его нельзя было отложить.

Хотя визуально синус выглядит хорошо , БПФ моего Rigol DS1054Z за ЦАПом (до восстанавливающего фильтра) показывает значительные искажения:Искаженный спектр сигнала за ЦАП

Самый высокий пик - это требуемая частота 1120 Гц, остальные равны 260 Гц. Правый пик кажется всего на 5 дБ ниже основного!!

Джиттер на выводе LDAC составляет порядка +/- 0,25 мкс, что я считаю приемлемым по сравнению с временем выборки 34,3 мкс. Сам таймер работает от кристалла MCU и должен быть достаточно стабильным.

Какая проблема может привести к такому шаблону искажения? Какие могут быть способы диагностики и уменьшения его?

На всякий случай: ЦАП представляет собой AD5686, полное опорное напряжение составляет 5 В, амплитуда синусоиды составляет 25 мВ, что приводит к «переключению» примерно младших 10 бит.

1,5% размаха джиттера на самом деле довольно много.
29120/260 = ровно 112, так что одно из ваших значений синусоиды неверно?
Кроме того, если ваша таблица синусов имеет размер 364 байта, вам нужно будет сэмплировать ее со скоростью 407 680 раз в секунду, чтобы получить 1120 Гц, если только в таблице не хранится 14 циклов? Но зачем хранить 14 синусоид?
субгармоники кричат, что ваша частота дискретизации не постоянна, или ваш поиск в таблице имеет систематическую проблему типа переполнения. Замените свою синусоиду (скажем) 32 циклами прямоугольной волны и повторите в качестве эксперимента. Или оставайтесь с синусоидальной LUT и жестко закодируйте поиск, чтобы каждый раз просто увеличиваться на одну позицию. Посмотрите, не дает ли какой-либо из них подсказки о том, что происходит. Переключение только младших 10 бит ЦАП не должно быть проблемой на этом уровне, но если вы перепутаете биты, это усугубит эффект. Попробуйте изменить амплитуду на полную шкалу, чтобы получить дополнительные подсказки.
@Andyaka Буфер предназначен для более сложного сигнала, синусоидальная волна - это просто случай. Играя, как предложил пользователь 44635, сообщу, если найду какие-либо подсказки...
@user44635 user44635 Я ожидаю, что синусоида будет иметь видимые скачки, если это будет просто проблема индексации/поиска. Интересно, может ли вычисление LUT на основе float32 и последующее округление привести к таким значительным искажениям....
Ах. Я только что заметил, что вы говорите, что анализируете сигнал перед фильтром реконструкции. Почему вы ожидаете чего-то другого, имея всего 26 сэмплов на цикл вашего сигнала 1120 Гц? Как это выглядит на выходе фильтра?
@DaveTweed Я ожидаю увидеть только зеркала моего спектра выше частоты Никвиста ЦАП (если, конечно, частота дискретизации прицела не слишком мала). После фильтра он не сильно отличается. Тем не менее, смотрите мой ответ ниже для печальных подробностей =(
Твоя аватарка меня расстраивает!

Ответы (1)

Я подключил лабораторный генератор сигналов ко входу осциллографа, чтобы сравнить его с измеренным сигналом, и неожиданно увидел точно такой же спектр в его БПФ. При повышении частоты субгармоники ушли на 1250 Гц. Изменение глубины памяти в настройках «Aquire» с Auto на 6K убрало эффект. Похоже, что в БПФ DS1054Z возникает какая-то проблема с наложением имен.

===

РЕДАКТИРОВАТЬ: Внимательно посмотрев на изображение, вы увидите частоту дискретизации 5 кГц, показанную в окне БПФ. Было бы слишком мало семплировать выходной сигнал ЦАП перед фильтром. Удивительно, что он по-прежнему выглядит так же, если подается чистый сигнал 1120 Гц, поскольку он все еще ниже частоты Никвиста.