реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> загвоздка в написании DDS, О жизненых проблемах электроники
Frox_SzC
сообщение Oct 28 2009, 19:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 23-04-09
Пользователь №: 48 135



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

На работе зашел разговор о DDS'никах АналогДивайса, ну и я как обычно плюнул и сказал: "а че тут делать то, было бы желание"..... Как говориться мужик сказал мужик сделал.....Все бы нечего.... Весь алгоритм работы ДДС прозрачен и абсолютно понятен.......
Но вот загвостка:
Перечитав КУЧУ информации по ДДС никак не нашел: что же из себя представляет "код частоты", поступающий на вход......Понял что возможно два варианта развития событий:
1) "код частоты" - есть готовый инкремент фазового аккумулятора....тогда все просто....но возникает другой вопрос: кто его должен подавать на вход???где его считать???
2) "код частоты" - есть численное выражение требуемой частоты в двоичном исчеслении......тогда расчет инкремента фазового аккумулятора необходимо сделать в модуле ДДС.....Отлично!!!
Выбрав второй путь....я написал ДДС....в котором инкремент считается по формуле: dph=((2^n)*Request_freq)/Fclk; где 2^n есть число точек фазы на весь период......
немного подумав....объединяю 2^n/Fclk в одну константу и получаю (при n=32 и Fclk=100МГц) 42,949....
И здесь начался .....хм хм.......плохо короче....
Число которое получается в итоге.....дробное.....Вопрос....Критично ли повлияет его округление навыходной сигнал???.....Если да то придется реализововать умножение на дробное число, что приведет к увеличение площади кристалла и потребления....Как быть??? Спасибо!!!
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 28 2009, 21:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Что-то не совсем осознал суть проблемы. Не хочется можете считать во 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%
Вроде так.
Go to the top of the page
 
+Quote Post
Frox_SzC
сообщение Oct 29 2009, 05:10
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 23-04-09
Пользователь №: 48 135



Цитата(rezident @ Oct 29 2009, 00:23) *
Что-то не совсем осознал суть проблемы. Не хочется можете считать во 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 - Oct 29 2009, 05:24
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Oct 29 2009, 10:36
Сообщение #4


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(Frox_SzC @ Oct 29 2009, 07:10) *
....verilog округлить его либо до 43,а скорее всего до 42....тупо отбросив дробную часть......


Тут округление лучше делать не floor а round,в 2 раза уменьшится максимальная погрешность.
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Oct 29 2009, 10:50
Сообщение #5


ʕʘ̅͜ʘ̅ʔ
*****

Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691



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

Цитата(Frox_SzC @ Oct 28 2009, 22:29) *
1) "код частоты" - есть готовый инкремент фазового аккумулятора....тогда все просто....но возникает другой вопрос: кто его должен подавать на вход???где его считать???
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 29 2009, 14:01
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Frox_SzC @ Oct 29 2009, 08:10) *
наверно я что то не до понял.........10995>>8 все равно даст дробное число......verilog округлить его либо до 43,а скорее всего до 42....тупо отбросив дробную часть......
Фазовый аккумулятор использует все биты, ваши 32 и эти 8, итого 40. Эти 8 учитываются при сдвиге перед выборкой из таблицы.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Frox_SzC
сообщение Oct 29 2009, 15:59
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 23-04-09
Пользователь №: 48 135



Цитата(Сергей Борщ @ Oct 29 2009, 17:01) *
Фазовый аккумулятор использует все биты, ваши 32 и эти 8, итого 40. Эти 8 учитываются при сдвиге перед выборкой из таблицы.


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

есть еще один выход......подавать на ДДС тактовую частоту например 2^27....тогда все получается ровно.....но по моему это дурацкий выход.....только если на входе ДДС стоит PLL......Как такая идея???
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 29 2009, 16:18
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Frox_SzC @ Oct 29 2009, 10:10) *
но не могли ли Вы пояснить как будет меняться множитель (2^n) в зависимости от требуемой частоты???
Вы сначала сами поясните, что такое эти ваши (2^n)? smile.gif У вас написано
Цитата("Frox_SzC")
где 2^n есть число точек фазы на весь период......
n это разрядность ЦАП выходит? Или разрядность таймера, формирующего ШИМ?
Цитата(Frox_SzC @ Oct 29 2009, 10:10) *
И все же не получается так......наверно я что то не до понял.........10995>>8 все равно даст дробное число......verilog округлить его либо до 43,а скорее всего до 42....тупо отбросив дробную часть......
Я же написал (и Сергей Брощ уточнил), что суммирование фазы нужно производить в другой (более высокой) разрядной сетке. Если используете доп. 8 бит, то аккумулятор фазы 40 битный должен быть. Вам на конкретных числах пояснить?
Go to the top of the page
 
+Quote Post
Frox_SzC
сообщение Oct 29 2009, 16:54
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 23-04-09
Пользователь №: 48 135



Цитата(rezident @ Oct 29 2009, 19:18) *
Вы сначала сами поясните, что такое эти ваши (2^n)? smile.gif У вас написано
n это разрядность ЦАП выходит? Или разрядность таймера, формирующего ШИМ?
Я же написал (и Сергей Брощ уточнил), что суммирование фазы нужно производить в другой (более высокой) разрядной сетке. Если используете доп. 8 бит, то аккумулятор фазы 40 битный должен быть. Вам на конкретных числах пояснить?


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

Сообщение отредактировал Frox_SzC - Oct 29 2009, 16:56
Go to the top of the page
 
+Quote Post
Frox_SzC
сообщение Oct 29 2009, 18:03
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 23-04-09
Пользователь №: 48 135



Возьмите хоть 42разрядный аккумулятор.....разницы от этого нет....
Если это возможно объясните мне в цифрах....
Go to the top of the page
 
+Quote Post
Frox_SzC
сообщение Oct 29 2009, 18:03
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 23-04-09
Пользователь №: 48 135



Возьмите хоть 42разрядный аккумулятор.....разницы от этого нет....
Если это возможно объясните мне в цифрах....
Go to the top of the page
 
+Quote Post
rsv
сообщение Oct 29 2009, 18:28
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 119
Регистрация: 16-07-07
Из: Тула
Пользователь №: 29 160



есть же готовая корка от ксайлинкса, там в описании про это рассказывается. если использовать простое усечение фазы, то появляются нехорошие гармоники. бороться с ними можно либо добавлением случайной величины к фазе, либо слаживанием рядом тейлора
а ддска от аналог девайса вещь довольно странная, хоть мы ее победили, но она нам не понравилась
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 29 2009, 19:08
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Frox_SzC @ Oct 29 2009, 21:54) *
Ребят, 2^n есть число точек фазы (то бишь амплитуды) по кругу периода......нарисуйте круг и разделите его на 2^n частей....одна часть этого круга будет минимальным приращением.....правильно???
Дык все-таки фазы или амплитуды? cranky.gif Фаза с частотой и временем связана, а амплитуда с напряжением. Потом конечно напряжение можно в какую-то другую величину преобразовать, то изначально именно с напряжением. Фаза и частота ограничены разрядностью какого-либо таймера, который период выборок отсчитывает. Амплитуда ограничена величиной опоры и разрядностью ЦАП (или разрядностью ШИМ, если сигнал с помощью ШИМ формируется). Вы уж разберитесь как-то сами, что это у вас за (2^n), каковы разрядность таймера выборок и разрядность ЦАП?
Go to the top of the page
 
+Quote Post
Frox_SzC
сообщение Oct 29 2009, 20:49
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 23-04-09
Пользователь №: 48 135



Ну я думаю никто не будет спорить что фаза является адресом в таблицу амплитуд.......значит есть зависимость амплитуды от фазы.....на рисунке снизу показано..... 2^n есть разрядность аккумулятора.....отбрасываем 20 разрядов.......еще 2 разряда управляющих......получается что разрядность амплитуды 2^10......
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 29 2009, 21:38
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Frox_SzC, так вы синус формируете или сигнал произвольной формы? Мне уже неудобно, но видимо ссылку на википедию придется дать. laughing.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 20:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01518 секунд с 7
ELECTRONIX ©2004-2016