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

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


Гуру
******

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



Попробую еще раз "на пальцах" и в цифрах. Допустим
имеем:
частота тактирования - 1Мгц,
таблица синуса - 36 отсчетов на период,
дискретность изменения амплитуды 1/256 (ЦАП - 8 разрядов).
хотим:
получить выходную частоту 23кГц.
Таблица у нас с приращением фазы 10 градусов для частоты сэмплирования 1МГц/36=27777,7(7)Гц
а) считаем требуемое приращение фазы 23кГц/(1МГц/36)=0,828, если просто округлим до целых получим 0, если правильно округлим, то получим 1. Облом-с. Тогда отсчеты у нас будут строго по таблице и выходная частота получится, не 23кГц, а 27,777кГц. Ошибка выходной частоты при этом будет (1МГц/36-23кГц)/23кГц*100%=+20,77%. Чтобы уменьшить погрешность вычисления фазы отсчетов увеличим разрядность фазового аккумулятора. Для этого при расчете фазового приращения домножим его значение на 256 и получим 256*23кГц/(1МГц/36)=211,968. После округления будем иметь фазовое приращение dph=212. Поскольку у нас всего 36 элементов в таблице, то для аккумулятора фазы хватит 6-и разрядов. Но мы еще должны учесть 8-и битное расширение приращения фазы. Поэтому для аккумулятора фазы возьмем (6+8)>=16 разрядов. Берем пример исходного когда из википедии и немного дорабатываем его.
Код
#include <stdint.h>

#define SINTBLSIZE 36U    //размер таблицы синуса
#define TBLIDXPRD (256U*36U)    //период фазового аккумулятора

uint8_t sinTbl[SINTBLSIZE]=
{ 128, 150, 171, 191, 209, 225, 238, 247, 253, 255,
  253, 247, 238, 225, 209, 191, 171, 150, 128, 105,
  84, 64, 46, 30, 17, 8, 2, 0, 2, 8,
  17, 30, 46, 64, 84, 105
]; // таблица синуса

uint8_t next_amp(uint16_t dph)
{   static uint16_t phase=0;
    uint8_t amp;
    unsigned int idx;
    phase+=dph;
    while(phase>TBLIDXPRD)
        phase-=TBLIDXPRD;
    idx=phase>>8;
    amp=sinTbl[idx];
    return amp;
}

Результатом работы при dph=212 будет такая последовательность
Код
128    128    150    171    191    209    209    225    238    247
253    255    255    253    247    238    225    209    209    191
171    150    128    105    105    84    64    46    30    17
17    8     2     0     2     2     8     17    30    46
64    64    84    105
                  127    150    171    171    191    209
225    238    247    247    253    255    253    247    238    238

Отступом я выделил период, который равен 44 отсчетам. Считаем период получившейся частоты. 1МГц/44=22727,27(27)Гц. Ошибка формирования выходной частоты составляет (1МГц/44-23кГц)/23кГц*100%=--1,19%. Сравните с исходной погрешностью +20,77% Улучшение точности выше, чем на порядок!
Такой пример вам будет понятен? laughing.gif Еще в дополнение замечу, что поскольку в моем примере разрядность фазового аккумулятора была 16, а требуемая разрядность индекса таблицы отсчетов составляла всего 6 разрядов, то легко можно было домножать не на 2^8=256, а на 2^10=1024. Точность вычисления фазы была бы еще выше. Правда для выбранных условий это не очень актуально, т.к. выходная частота и табличная частота сэмплирования слишком близкие.
Go to the top of the page
 
+Quote Post
Frox_SzC
сообщение Oct 30 2009, 06:04
Сообщение #17


Участник
*

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



Полностью с Вами согласен.... Увеличение фазового аккумулятора приводит к уменьшению ошибки....это было известно заранее............ Наверно мы малость недопоняли друг друга....точнее я Вас.....
Спасибо за подробное объяснение....оно исчерпывающие.....теперь я Вас понял..... У моего фазового аккумулятора разрядности хватает....все в нормеsmile.gif Просто я переживал за ошибку которая будет при округлении.... и мне хотелось узнать внесет ли она какие либо существенные (принципиальные) изменения в сигнал......
В единственном я до сих пор не разобрался..... Как все таки делать ДДС..... Будем ли мы подавать на вход уже приращение или же будем считать его внутри ДДС.....я склоняюсь к первому варианту......хотя реализовал второйsmile.gif Как Вам?
Go to the top of the page
 
+Quote Post
ANV
сообщение Nov 4 2009, 22:09
Сообщение #18


Участник
*

Группа: Свой
Сообщений: 69
Регистрация: 16-10-05
Пользователь №: 9 713



Цитата(Frox_SzC @ Oct 30 2009, 08:04) *
В единственном я до сих пор не разобрался..... Как все таки делать ДДС..... Будем ли мы подавать на вход уже приращение или же будем считать его внутри ДДС.....я склоняюсь к первому варианту......хотя реализовал второйsmile.gif Как Вам?


Ещё раз, на пальцах (упрощённо).
У Вас есть два регистра, счётчик фазы и приращение фазы. Разрядность счётчика фазы определяет точность частоты, а разрядность регистра приращения влияет на максимальную генерируемую частоту.
С каждым тактом генератора Вам необходимо сделать следующее:
- прибавить к счётчику фазы приращение фазы;
- N старших разрядов счётчика фазы, адресуют таблицу формы сигнала, тут необходимо восстановить форму колебания
- послать получившееся амплитудное значение на ЦАП

--
обычно в DDS-ску записывают приращение фазы, а его считают внешним микроконтроллером.

Сообщение отредактировал ANV - Nov 4 2009, 22:12
Go to the top of the page
 
+Quote Post
Frox_SzC
сообщение Nov 8 2009, 05:56
Сообщение #19


Участник
*

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



Спасибо за Вашу помощь товарищи!!!
Go to the top of the page
 
+Quote Post
Михаил_K
сообщение Nov 9 2009, 05:19
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 552
Регистрация: 29-02-08
Пользователь №: 35 481



Когда-то вот здесь http://electronix.ru/forum/index.php?showt...mp;#entry372344 выкладывал готовую DDS.
Слово частоты N рассчитывается как N = (f_требуемое*2^32)/f_clk
Go to the top of the page
 
+Quote Post
Frox_SzC
сообщение Nov 11 2009, 05:39
Сообщение #21


Участник
*

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



Цитата(Михаил_K @ Nov 9 2009, 08:19) *
Когда-то вот здесь http://electronix.ru/forum/index.php?showt...mp;#entry372344 выкладывал готовую DDS.
Слово частоты N рассчитывается как N = (f_требуемое*2^32)/f_clk


а округляли round???
Go to the top of the page
 
+Quote Post

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

 


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


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