|
Как реализовать генератор квадратуры, Надо генерировать cos/sin одинаковой чатоты в DSP |
|
|
|
Dec 10 2014, 15:43
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371

|
Всем привет! Вот есть задача - генерировать квадратурный сигнал для DDC. DDC сам реализован внутри DSP, поэтому надо алгоритм чтобы его можно было-бы реализвать потом на аасемблере. Используется плавующая точка. В идеальном случае ф-я должна выглядеть так: result = GenSinCos(float freq); где result это структура содержащая Cos и Sin, т.е. сигналы сдвинуты на 90 градусов. freq - 0...1. Ф-я вызывается для каждого отсчета. Начальная фаза в общем не очень важна. Главное чтобы 90 градусов было. По идее это даже не ф-я а макрос. Как-то так. Может кто уже встречал подобное? Или может уже есть готовые решения? Особенность в том, что наверняка есть решение которое не вызывает ф-ю sin и cos каждый раз.  Спасибо! PS. Табличный метод не предлагать!
Сообщение отредактировал Russky - Dec 10 2014, 15:56
|
|
|
|
|
 |
Ответов
|
Dec 16 2014, 11:08
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371

|
Что-то мы скатились на обсуждение ерунды. Ситуация с ф-й генератора вот какая. Когда мы описываем те или иные методы, надо всегода смотреть на то, как данная ф-я будет использоваться. Вот у меня задача достаточно общая: есть приложение в котором используется DDC. Для этого DDC мне нужен генератор квадратуры с постоянной частотойк. Значение частоты может меняться, но не в реальном времени. Т.е. получаем вот что. То что считается постоянно в реал-тайме критично ко времени. То что относится к расчету параметров - не критично. В итоге получается, что расчитать один раз sin/cos/step и т.д. это не проблема, но зато потом просто умножать нару раз и выбирать значения из таблицы. В общем метод Blackfinа самое то. Сам генератор там состоит из вдух сложений и четырех умножений. А инициализация приращения и шаг таблицы расчитываются неспеша как угодно. Причем это "именно то" при условии что значения генератора реинициализируются через фиксированные промежутки (в моем случае 128 отсчетов). Методы генерирования на основе расчета синуса и косинуса "налету" с помощью полиномов и т.д. имеют свое применение. Например когда у меня частота меняется в реальном времени и я ее должен постоянно подстраивать на основе ФАПЧ или что-то такое. В этом случае конечно надо делать генератор на основе прямого расчета синуса и косинуса. То-же самое относится когда генератор должен работать на "бесконечном интервале времени". Тут шумы никуда не уйдут, и генератор просто "зазвенит".  В общем, побеждает как всегда компромис.
|
|
|
|
|
Dec 16 2014, 12:22
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371

|
Цитата(_pv @ Dec 16 2014, 15:25)  генератор путём умножениея на матрицу поворота нестабилен, а если реинициализировать его каждые 128 шагов, то синус/косинус всё равно придётся честно вычислять для текущего значения фазы при реинициализации. Нет. Не придется вычислять каждый раз. Вы немного не поняли принцып. У нас есть таблица косинуса на 1024 отсчета. Это значит что я могу начальные значения для каждых 128 отсчетов брать из этой таблицы, а приращение считается только один раз. Т.е. я считаю приращение по таблице для каждых 128 отсчетов, и матрицу поворота для каждого отсчета. В итоге все работает вот как: Когда я запускаю обработку 128 отсчетов, я загружаю начальные значения из таблицы (это константа), загружаю приращения синуса и косинуса (то-же константы расчитанные один раз при задании частоты) и потом считаю 128 раз поворот. После этого я делаю щаг по таблице, и сохраняю состояние указателя таблицы. В следующий раз повторяется все то-же самое. В итоге, для таблицы в 1024 отсчета, и пакета 128 отсчетов, я могу генерировать синус с частотой кратной 128*1024 ( = 131072). Если нужно, то я могу переинициализировать не каждые 128 отсчетов, а каждые 1024, и получим мы кратность частоты 1024*1024, что в общем афигенно!  Соотношением сигнал/шум мы конечно жертвуем в некоторой степени, но "за все надо платить".
|
|
|
|
Сообщений в этой теме
Russky Как реализовать генератор квадратуры Dec 10 2014, 15:43 Lmx2315 QUOTE (Russky @ Dec 10 2014, 18:43) Особе... Dec 10 2014, 17:00 des00 Цитата(Russky @ Dec 10 2014, 22:43) Особе... Dec 10 2014, 17:43 Fat Robot Это прекрасно!! хороший синус. будет всегд... Dec 10 2014, 17:54  des00 Цитата(Fat Robot @ Dec 11 2014, 01:54) Эт... Dec 10 2014, 18:53  andyp Цитата(Fat Robot @ Dec 10 2014, 20:54) Чт... Dec 11 2014, 14:06 thermit c(n)=cos(2*pi*f0/sf*n)
s(n)=k*c(n)+c(n-1)-k*s(n-1... Dec 10 2014, 18:17 blackfin Цитата(Fat Robot @ Dec 10 2014, 21:54) Эт... Dec 10 2014, 18:29 ViKo Ну, конечно, CORDIC. Какие могут быть сомнения?... Dec 10 2014, 19:33 Fat Robot На вычислительных платформах, на которых цена унож... Dec 10 2014, 20:35 Russky Поясню. Есть методы генерирования синусоидально си... Dec 11 2014, 11:53 blackfin Цитата(Russky @ Dec 11 2014, 14:53) Но в ... Dec 11 2014, 12:48  Russky Цитата(blackfin @ Dec 11 2014, 16:48) Шко... Dec 11 2014, 18:34   thermit Цитата(Russky @ Dec 11 2014, 21:34) Спаси... Dec 11 2014, 20:59    blackfin Цитата(thermit @ Dec 11 2014, 23:59) кто/... Dec 12 2014, 02:22     thermit Цитата(blackfin @ Dec 12 2014, 05:22) А в... Dec 12 2014, 06:32    Fat Robot Как вы оцениваете, при таком подходе через сколько... Dec 12 2014, 10:35     thermit Цитата(Fat Robot @ Dec 12 2014, 14:35) Ка... Dec 12 2014, 11:11      andyp Цитата(thermit @ Dec 12 2014, 14:11) А дл... Dec 12 2014, 11:39      Russky Цитата(thermit @ Dec 12 2014, 15:11) Ника... Dec 15 2014, 14:07       Fat Robot грустный смайлик..
Цитата(Russky @ Dec 15 20... Dec 15 2014, 14:51       thermit Цитата(Russky @ Dec 15 2014, 18:07) Тогда... Dec 15 2014, 14:59       blackfin Цитата(Russky @ Dec 15 2014, 18:07) Т.е. ... Dec 15 2014, 15:12        Russky Цитата(blackfin @ Dec 15 2014, 19:12) И н... Dec 15 2014, 16:31 stealth-coder Цитата(Fat Robot @ Dec 11 2014, 00:35) На... Dec 11 2014, 20:30 Fat Robot Тут всё на веру, конечно. Не ставя под сомнение кв... Dec 11 2014, 20:53 stealth-coder Цитата(Fat Robot @ Dec 12 2014, 00:53) Ту... Dec 11 2014, 21:09 amaora Умножать на матрицу поворота и нормировать на кажд... Dec 15 2014, 16:42 _pv Цитата(amaora @ Dec 15 2014, 22:42) Умнож... Dec 15 2014, 17:57  thermit Цитата(_pv @ Dec 15 2014, 20:57) так ошиб... Dec 15 2014, 21:45   _pv Цитата(thermit @ Dec 16 2014, 03:45) гы, ... Dec 15 2014, 22:31    thermit Цитата(_pv @ Dec 16 2014, 01:31) чукча - ... Dec 15 2014, 22:50    Fat Robot Вы сами себе противоречите: Чтобы генератор был ... Dec 15 2014, 22:53     thermit Цитата(Fat Robot @ Dec 16 2014, 01:53) Вы... Dec 15 2014, 23:46      Fat Robot Я посчитал. Устойчивость действительного генератор... Dec 16 2014, 08:31       _pv Цитата(Fat Robot @ Dec 16 2014, 14:31) Хо... Dec 16 2014, 08:56        Fat Robot . Dec 16 2014, 09:30         _pv Цитата(Fat Robot @ Dec 16 2014, 15:30) Ва... Dec 16 2014, 09:49          Fat Robot Конечно. Даже в вашем простом примере в диапазоне ... Dec 16 2014, 11:55           _pv Цитата(Fat Robot @ Dec 16 2014, 17:55) Ко... Dec 16 2014, 12:13     _pv Цитата(Fat Robot @ Dec 16 2014, 04:53) Вы... Dec 16 2014, 08:11      thermit Цитата(_pv @ Dec 16 2014, 12:11) с целочи... Dec 16 2014, 11:36       _pv Цитата(thermit @ Dec 16 2014, 17:36) а он... Dec 16 2014, 11:55        thermit Цитата(_pv @ Dec 16 2014, 15:55) а что же... Dec 16 2014, 13:05         _pv Цитата(thermit @ Dec 16 2014, 19:05) Да. ... Dec 16 2014, 13:20 amaora Если элементы матрицы поворота посчитать как насто... Dec 16 2014, 10:58 _pv Цитата(amaora @ Dec 16 2014, 16:58) Если ... Dec 16 2014, 11:05  amaora Цитата(_pv @ Dec 16 2014, 14:05) расползё... Dec 16 2014, 11:33   andyp Цитата(Russky @ Dec 16 2014, 15:22) Нет. ... Dec 16 2014, 16:12 mihalevski Цитата(Russky @ Dec 10 2014, 22:43) Всем ... Jan 6 2015, 14:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|