rezident 0 29 октября, 2009 Опубликовано 29 октября, 2009 · Жалоба Попробую еще раз "на пальцах" и в цифрах. Допустим имеем: частота тактирования - 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: Еще в дополнение замечу, что поскольку в моем примере разрядность фазового аккумулятора была 16, а требуемая разрядность индекса таблицы отсчетов составляла всего 6 разрядов, то легко можно было домножать не на 2^8=256, а на 2^10=1024. Точность вычисления фазы была бы еще выше. Правда для выбранных условий это не очень актуально, т.к. выходная частота и табличная частота сэмплирования слишком близкие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Frox_SzC 0 30 октября, 2009 Опубликовано 30 октября, 2009 · Жалоба Полностью с Вами согласен.... Увеличение фазового аккумулятора приводит к уменьшению ошибки....это было известно заранее............ Наверно мы малость недопоняли друг друга....точнее я Вас..... Спасибо за подробное объяснение....оно исчерпывающие.....теперь я Вас понял..... У моего фазового аккумулятора разрядности хватает....все в норме:) Просто я переживал за ошибку которая будет при округлении.... и мне хотелось узнать внесет ли она какие либо существенные (принципиальные) изменения в сигнал...... В единственном я до сих пор не разобрался..... Как все таки делать ДДС..... Будем ли мы подавать на вход уже приращение или же будем считать его внутри ДДС.....я склоняюсь к первому варианту......хотя реализовал второй:) Как Вам? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ANV 0 4 ноября, 2009 Опубликовано 4 ноября, 2009 (изменено) · Жалоба В единственном я до сих пор не разобрался..... Как все таки делать ДДС..... Будем ли мы подавать на вход уже приращение или же будем считать его внутри ДДС.....я склоняюсь к первому варианту......хотя реализовал второй:) Как Вам? Ещё раз, на пальцах (упрощённо). У Вас есть два регистра, счётчик фазы и приращение фазы. Разрядность счётчика фазы определяет точность частоты, а разрядность регистра приращения влияет на максимальную генерируемую частоту. С каждым тактом генератора Вам необходимо сделать следующее: - прибавить к счётчику фазы приращение фазы; - N старших разрядов счётчика фазы, адресуют таблицу формы сигнала, тут необходимо восстановить форму колебания - послать получившееся амплитудное значение на ЦАП -- обычно в DDS-ску записывают приращение фазы, а его считают внешним микроконтроллером. Изменено 4 ноября, 2009 пользователем ANV Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Frox_SzC 0 8 ноября, 2009 Опубликовано 8 ноября, 2009 · Жалоба Спасибо за Вашу помощь товарищи!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuzis 0 9 ноября, 2009 Опубликовано 9 ноября, 2009 · Жалоба Когда-то вот здесь http://electronix.ru/forum/index.php?showt...mp;#entry372344 выкладывал готовую DDS. Слово частоты N рассчитывается как N = (f_требуемое*2^32)/f_clk Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Frox_SzC 0 11 ноября, 2009 Опубликовано 11 ноября, 2009 · Жалоба Когда-то вот здесь http://electronix.ru/forum/index.php?showt...mp;#entry372344 выкладывал готовую DDS. Слово частоты N рассчитывается как N = (f_требуемое*2^32)/f_clk а округляли round??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться