|
загвоздка в написании DDS, О жизненых проблемах электроники |
|
|
|
Oct 28 2009, 19:29
|
Участник

Группа: Участник
Сообщений: 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.... И здесь начался .....хм хм.......плохо короче.... Число которое получается в итоге.....дробное.....Вопрос....Критично ли повлияет его округление навыходной сигнал???.....Если да то придется реализововать умножение на дробное число, что приведет к увеличение площади кристалла и потребления....Как быть??? Спасибо!!!
|
|
|
|
|
 |
Ответов
|
Oct 28 2009, 21:23
|
Гуру
     
Группа: Свой
Сообщений: 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% Вроде так.
|
|
|
|
|
Oct 29 2009, 05:10
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 29 2009, 16:18
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Frox_SzC @ Oct 29 2009, 10:10)  но не могли ли Вы пояснить как будет меняться множитель (2^n) в зависимости от требуемой частоты??? Вы сначала сами поясните, что такое эти ваши (2^n)?  У вас написано Цитата("Frox_SzC") где 2^n есть число точек фазы на весь период...... n это разрядность ЦАП выходит? Или разрядность таймера, формирующего ШИМ? Цитата(Frox_SzC @ Oct 29 2009, 10:10)  И все же не получается так......наверно я что то не до понял.........10995>>8 все равно даст дробное число......verilog округлить его либо до 43,а скорее всего до 42....тупо отбросив дробную часть...... Я же написал (и Сергей Брощ уточнил), что суммирование фазы нужно производить в другой (более высокой) разрядной сетке. Если используете доп. 8 бит, то аккумулятор фазы 40 битный должен быть. Вам на конкретных числах пояснить?
|
|
|
|
Сообщений в этой теме
Frox_SzC загвоздка в написании DDS Oct 28 2009, 19:29  _Anatoliy Цитата(Frox_SzC @ Oct 29 2009, 07:10) ...... Oct 29 2009, 10:36  Сергей Борщ Цитата(Frox_SzC @ Oct 29 2009, 08:10) нав... Oct 29 2009, 14:01   Frox_SzC Цитата(Сергей Борщ @ Oct 29 2009, 17:01) ... Oct 29 2009, 15:59   Frox_SzC Цитата(rezident @ Oct 29 2009, 19:18) Вы ... Oct 29 2009, 16:54    rezident Цитата(Frox_SzC @ Oct 29 2009, 21:54) Реб... Oct 29 2009, 19:08 Fat Robot Так обычно делают. Кто подавать и где считать: вне... Oct 29 2009, 10:50 Frox_SzC Возьмите хоть 42разрядный аккумулятор.....разницы ... Oct 29 2009, 18:03 Frox_SzC Возьмите хоть 42разрядный аккумулятор.....разницы ... Oct 29 2009, 18:03 rsv есть же готовая корка от ксайлинкса, там в описани... Oct 29 2009, 18:28 Frox_SzC Ну я думаю никто не будет спорить что фаза являетс... Oct 29 2009, 20:49 rezident Frox_SzC, так вы синус формируете или сигнал произ... Oct 29 2009, 21:38 rezident Попробую еще раз "на пальцах" и в цифрах... Oct 29 2009, 23:33 Frox_SzC Полностью с Вами согласен.... Увеличение фазового ... Oct 30 2009, 06:04 ANV Цитата(Frox_SzC @ Oct 30 2009, 08:04) В е... Nov 4 2009, 22:09 Frox_SzC Спасибо за Вашу помощь товарищи!!! Nov 8 2009, 05:56 Михаил_K Когда-то вот здесь http://electronix.ru/forum/inde... Nov 9 2009, 05:19 Frox_SzC Цитата(Михаил_K @ Nov 9 2009, 08:19) Когд... Nov 11 2009, 05:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|