Перейти к содержанию
    

загвоздка в написании DDS

И так, начнем по порядку:

 

На работе зашел разговор о DDS'никах АналогДивайса, ну и я как обычно плюнул и сказал: "а че тут делать то, было бы желание"..... Как говориться мужик сказал мужик сделал.....Все бы нечего.... Весь алгоритм работы ДДС прозрачен и абсолютно понятен.......

Но вот загвостка:

Перечитав КУЧУ информации по ДДС никак не нашел: что же из себя представляет "код частоты", поступающий на вход......Понял что возможно два варианта развития событий:

1) "код частоты" - есть готовый инкремент фазового аккумулятора....тогда все просто....но возникает другой вопрос: кто его должен подавать на вход???где его считать???

2) "код частоты" - есть численное выражение требуемой частоты в двоичном исчеслении......тогда расчет инкремента фазового аккумулятора необходимо сделать в модуле ДДС.....Отлично!!!

Выбрав второй путь....я написал ДДС....в котором инкремент считается по формуле: dph=((2^n)*Request_freq)/Fclk; где 2^n есть число точек фазы на весь период......

немного подумав....объединяю 2^n/Fclk в одну константу и получаю (при n=32 и Fclk=100МГц) 42,949....

И здесь начался .....хм хм.......плохо короче....

Число которое получается в итоге.....дробное.....Вопрос....Критично ли повлияет его округление навыходной сигнал???.....Если да то придется реализововать умножение на дробное число, что приведет к увеличение площади кристалла и потребления....Как быть??? Спасибо!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то не совсем осознал суть проблемы. Не хочется можете считать во float считайте в целочисленных значениях. Но простое округление даст погрешность около 0,12% В зависимости от максимальной Request_freq сначала домножаете приращение фазы на степень двойки так, чтобы не вылезти за выбранную разрядную сетку (которая видимо должна быть больше исходных 32 бит). Потом производите суммирование фазового сдвига в той же выбранной разрядной сетке и результат сдвигаете вправо на то же число разрядов, что было при домножении. Получаете снова 32-х разрядное число. Увеличение разрядности даже на 8 разрядов уже даст на два порядка более точное целочисленное вычисление фазы.

Расчеты.

2^32*100МГц=42,94967296 при целочисленном округлении до 43 даст погрешность (43.0-42,94967296)/42,94967296*100%=0,117%

2^32*100МГц*2^8=10995,11627776 при целочисленном округлении до 10995 даст погрешность

((float)(10995>>8)-42,94967296)/42,94967296*100%=-0,001%

Вроде так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то не совсем осознал суть проблемы. Не хочется можете считать во float считайте в целочисленных значениях. Но простое округление даст погрешность около 0,12% В зависимости от максимальной Request_freq сначала домножаете приращение фазы на степень двойки так, чтобы не вылезти за выбранную разрядную сетку (которая видимо должна быть больше исходных 32 бит). Потом производите суммирование фазового сдвига в той же выбранной разрядной сетке и результат сдвигаете вправо на то же число разрядов, что было при домножении. Получаете снова 32-х разрядное число. Увеличение разрядности даже на 8 разрядов уже даст на два порядка более точное целочисленное вычисление фазы.

Расчеты.

2^32*100МГц=42,94967296 при целочисленном округлении до 43 даст погрешность (43.0-42,94967296)/42,94967296*100%=0,117%

2^32*100МГц*2^8=10995,11627776 при целочисленном округлении до 10995 даст погрешность

((float)(10995>>8)-42,94967296)/42,94967296*100%=-0,001%

Вроде так.

 

В принципе вариант на счет float вполне возможен, но не желателен, так как для этого необходимо писать (либо доставать) модуль который занимается этим делом.......но его наличие ведет к увеличению потребления и площади кристалла......а это критично.......

Второй вариант который Вы предложили мне более по душе.........но не могли ли Вы пояснить как будет меняться множитель (2^n) в зависимости от требуемой частоты???

 

И все же не получается так......наверно я что то не до понял.........10995>>8 все равно даст дробное число......verilog округлить его либо до 43,а скорее всего до 42....тупо отбросив дробную часть......

Изменено пользователем Frox_SzC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

....verilog округлить его либо до 43,а скорее всего до 42....тупо отбросив дробную часть......

 

Тут округление лучше делать не floor а round,в 2 раза уменьшится максимальная погрешность.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так обычно делают. Кто подавать и где считать: внешнее по отношению к DDS устройство.

 

1) "код частоты" - есть готовый инкремент фазового аккумулятора....тогда все просто....но возникает другой вопрос: кто его должен подавать на вход???где его считать???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

наверно я что то не до понял.........10995>>8 все равно даст дробное число......verilog округлить его либо до 43,а скорее всего до 42....тупо отбросив дробную часть......
Фазовый аккумулятор использует все биты, ваши 32 и эти 8, итого 40. Эти 8 учитываются при сдвиге перед выборкой из таблицы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фазовый аккумулятор использует все биты, ваши 32 и эти 8, итого 40. Эти 8 учитываются при сдвиге перед выборкой из таблицы.

 

Я вообще оставляю перед выборкой из таблицы 12 бит.....старший бит управляет полярность (то бишь знаковый бит), его я смогу послать на ЦАП..... а следующий за ним управляет адресом чтения из таблици ( тоесть если он равен 0 значит addr=phase если он равен 1 значит addr=~phase, делается для того чтобы минимизировать память......храня только одну четверть периода)........так скажите мне каким боком еще 8 бит.........от этих 8 бит ничего не поменяется....

 

есть еще один выход......подавать на ДДС тактовую частоту например 2^27....тогда все получается ровно.....но по моему это дурацкий выход.....только если на входе ДДС стоит PLL......Как такая идея???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

но не могли ли Вы пояснить как будет меняться множитель (2^n) в зависимости от требуемой частоты???
Вы сначала сами поясните, что такое эти ваши (2^n)? :) У вас написано

где 2^n есть число точек фазы на весь период......
n это разрядность ЦАП выходит? Или разрядность таймера, формирующего ШИМ?

И все же не получается так......наверно я что то не до понял.........10995>>8 все равно даст дробное число......verilog округлить его либо до 43,а скорее всего до 42....тупо отбросив дробную часть......
Я же написал (и Сергей Брощ уточнил), что суммирование фазы нужно производить в другой (более высокой) разрядной сетке. Если используете доп. 8 бит, то аккумулятор фазы 40 битный должен быть. Вам на конкретных числах пояснить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы сначала сами поясните, что такое эти ваши (2^n)? :) У вас написано

n это разрядность ЦАП выходит? Или разрядность таймера, формирующего ШИМ?

Я же написал (и Сергей Брощ уточнил), что суммирование фазы нужно производить в другой (более высокой) разрядной сетке. Если используете доп. 8 бит, то аккумулятор фазы 40 битный должен быть. Вам на конкретных числах пояснить?

 

Ребят, 2^n есть число точек фазы (то бишь амплитуды) по кругу периода......нарисуйте круг и разделите его на 2^n частей....одна часть этого круга будет минимальным приращением.....правильно???

Аккумулятор не может быть больше чем 32 бита.........это гемморой если он будет больше.....

Изменено пользователем Frox_SzC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возьмите хоть 42разрядный аккумулятор.....разницы от этого нет....

Если это возможно объясните мне в цифрах....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возьмите хоть 42разрядный аккумулятор.....разницы от этого нет....

Если это возможно объясните мне в цифрах....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

а ддска от аналог девайса вещь довольно странная, хоть мы ее победили, но она нам не понравилась

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ребят, 2^n есть число точек фазы (то бишь амплитуды) по кругу периода......нарисуйте круг и разделите его на 2^n частей....одна часть этого круга будет минимальным приращением.....правильно???
Дык все-таки фазы или амплитуды? :cranky: Фаза с частотой и временем связана, а амплитуда с напряжением. Потом конечно напряжение можно в какую-то другую величину преобразовать, то изначально именно с напряжением. Фаза и частота ограничены разрядностью какого-либо таймера, который период выборок отсчитывает. Амплитуда ограничена величиной опоры и разрядностью ЦАП (или разрядностью ШИМ, если сигнал с помощью ШИМ формируется). Вы уж разберитесь как-то сами, что это у вас за (2^n), каковы разрядность таймера выборок и разрядность ЦАП?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну я думаю никто не будет спорить что фаза является адресом в таблицу амплитуд.......значит есть зависимость амплитуды от фазы.....на рисунке снизу показано..... 2^n есть разрядность аккумулятора.....отбрасываем 20 разрядов.......еще 2 разряда управляющих......получается что разрядность амплитуды 2^10......

post-48135-1256849271_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Frox_SzC, так вы синус формируете или сигнал произвольной формы? Мне уже неудобно, но видимо ссылку на википедию придется дать. :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...