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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Как реализовать генератор квадратуры, Надо генерировать cos/sin одинаковой чатоты в DSP
Russky
сообщение Dec 10 2014, 15:43
Сообщение #1


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

Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371



Всем привет!
Вот есть задача - генерировать квадратурный сигнал для DDC. DDC сам реализован внутри DSP, поэтому надо алгоритм чтобы его можно было-бы реализвать потом на аасемблере.
Используется плавующая точка.
В идеальном случае ф-я должна выглядеть так:
result = GenSinCos(float freq); где result это структура содержащая Cos и Sin, т.е. сигналы сдвинуты на 90 градусов.
freq - 0...1.
Ф-я вызывается для каждого отсчета. Начальная фаза в общем не очень важна. Главное чтобы 90 градусов было. По идее это даже не ф-я а макрос.
Как-то так.
Может кто уже встречал подобное? Или может уже есть готовые решения?

Особенность в том, что наверняка есть решение которое не вызывает ф-ю sin и cos каждый раз. sm.gif

Спасибо!

PS. Табличный метод не предлагать! sm.gif


Сообщение отредактировал Russky - Dec 10 2014, 15:56
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Dec 10 2014, 17:00
Сообщение #2


отэц
*****

Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684



QUOTE (Russky @ Dec 10 2014, 18:43) *
Особенность в том, что наверняка есть решение которое не вызывает ф-ю sin и cos каждый раз. sm.gif
....
PS. Табличный метод не предлагать! sm.gif

..не понял я что-то, вы считать не хотите и в таблицу смотреть, тогда как же?
з.ы.
другое дело что синус посчитать по разному можно, но считать надо таки.


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
des00
сообщение Dec 10 2014, 17:43
Сообщение #3


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Russky @ Dec 10 2014, 22:43) *
Особенность в том, что наверняка есть решение которое не вызывает ф-ю sin и cos каждый раз. sm.gif

sin = sqrt(1 - cos^2) ?


--------------------
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Dec 10 2014, 17:54
Сообщение #4


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

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



Это прекрасно!! хороший синус. будет всегда не меньше 1. а иногда и побольше.

Цитата(des00 @ Dec 10 2014, 18:43) *
sin = sqrt(1 + cos^2) ?


Что касается начальной задачи, то решение есть!!! явочным порядком можно вызывть синус и косинус например каждый 10-й раз.. или даже 100-й. можно вообще ни разу не вызывать. всё зависит ведь от необходимой точности описания функций
Go to the top of the page
 
+Quote Post
thermit
сообщение Dec 10 2014, 18:17
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



c(n)=cos(2*pi*f0/sf*n)

s(n)=k*c(n)+c(n-1)-k*s(n-1)

k=(sin(2*pi*f0/sf)-1)/(sin(2*pi*f0/sf+pi/2))
Go to the top of the page
 
+Quote Post
blackfin
сообщение Dec 10 2014, 18:29
Сообщение #6


Гуру
******

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



Цитата(Fat Robot @ Dec 10 2014, 21:54) *
Это прекрасно!! хороший синус. будет всегда не меньше 1. а иногда и побольше.

Это точно! Вот хороший синус: sin(pi/2 - 2.06345i) = 4.0001. biggrin.gif
Go to the top of the page
 
+Quote Post
des00
сообщение Dec 10 2014, 18:53
Сообщение #7


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Fat Robot @ Dec 11 2014, 01:54) *
Это прекрасно!! хороший синус. будет всегда не меньше 1. а иногда и побольше.

большое спасибо за правку, торопился и ошибся



--------------------
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 10 2014, 19:33
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Ну, конечно, CORDIC. Какие могут быть сомнения?!
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Dec 10 2014, 20:35
Сообщение #9


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

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



На вычислительных платформах, на которых цена уножения равна цене сложения, а это любые dsp, смысла в кордике нет.

Цитата(ViKo @ Dec 10 2014, 20:33) *
Ну, конечно, CORDIC. Какие могут быть сомнения?!

Go to the top of the page
 
+Quote Post
Russky
сообщение Dec 11 2014, 11:53
Сообщение #10


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

Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371



Поясню. Есть методы генерирования синусоидально сигнала на основе биквада. Т.е. там просто рекурсивно вычисляется каждое следуюшее значение. Генератор в чистом виде.
Там меняя коэффициенты биквада, можно менять частоту. Там фаза не важна, важна только частота.
Я думаю, что должны быть методы, которые позволяют генерировать синус и косинус вместе, подобным образом. Дополнительным условием для данной ф-и есть разница фаз в 90 градусов.
Т.е либо начальные условия для генератора задавать, либо еще что-то. Но в общем это должно быть рекурсивное вычисление, где каждый следующий отсчет зависит от предыдущих. Это не синус и косинус в чистом виде. Нужен именно генератор (так как он более экономичен к вычислениям).



Go to the top of the page
 
+Quote Post
blackfin
сообщение Dec 11 2014, 12:48
Сообщение #11


Гуру
******

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



Цитата(Russky @ Dec 11 2014, 14:53) *
Но в общем это должно быть рекурсивное вычисление, где каждый следующий отсчет зависит от предыдущих. Это не синус и косинус в чистом виде.

Нужен именно генератор (так как он более экономичен к вычислениям).

Школьная тригонометрия рулит.. rolleyes.gif

sin[2*pi*f*(t+Δt)] = sin[2*pi*f*t] * cos[2*pi*f*Δt] + cos[2*pi*f*t] * sin[2*pi*f*Δt];
cos[2*pi*f*(t+Δt)] = cos[2*pi*f*t] * cos[2*pi*f*Δt] - sin[2*pi*f*t] * sin[2*pi*f*Δt];

Полагая, что t+Δt == (n+1)*Δt, находим формулы рекурсии:

sinn+1 == sin[2*pi*f*(n+1)*Δt] = sin[2*pi*f*n*Δt] * cos[2*pi*f*Δt] + cos[2*pi*f*n*Δt] * sin[2*pi*f*Δt] == sinn * cos[2*pi*f*Δt] + cosn * sin[2*pi*f*Δt];
cosn+1 == cos[2*pi*f*(n+1)*Δt] = cos[2*pi*f*n*Δt] * cos[2*pi*f*Δt] - sin[2*pi*f*n*Δt] * sin[2*pi*f*Δt] == cosn * cos[2*pi*f*Δt] - sinn * sin[2*pi*f*Δt];

Понятно, что sin[2*pi*f*Δt] и cos[2*pi*f*Δt] это константы, зависящие от f и Δt и выбираются так, чтобы 1/(f*Δt) = 2N == nmax+1.

Начальные значения:

sin0 = 0;
cos0 = 1;

Значения после переполнения счетчика n = (nmax+1)%2N == 0, полагаем равными:

sin2N = 0;
cos2N = 1;

Это предотвратит накопление ошибок..
Go to the top of the page
 
+Quote Post
andyp
сообщение Dec 11 2014, 14:06
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(Fat Robot @ Dec 10 2014, 20:54) *
Что касается начальной задачи, то решение есть!!! явочным порядком можно вызывть синус и косинус например каждый 10-й раз.. или даже 100-й. можно вообще ни разу не вызывать. всё зависит ведь от необходимой точности описания функций


Соглашусь FatRobot, выбор алгоритма должен определяться тем, сколько надо SFDR и сколько mips можно потратить. Отбрасывать что-то с порога глупо.
Go to the top of the page
 
+Quote Post
Russky
сообщение Dec 11 2014, 18:34
Сообщение #13


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

Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371



Цитата(blackfin @ Dec 11 2014, 16:48) *
Школьная тригонометрия рулит.. rolleyes.gif
...
Это предотвратит накопление ошибок..

Спасибо. Надо попробовать.
Как попробую - напишу.
Пока все выглядет очень даже ничего! sm.gif
Go to the top of the page
 
+Quote Post
stealth-coder
сообщение Dec 11 2014, 20:30
Сообщение #14


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

Группа: Участник
Сообщений: 112
Регистрация: 27-12-08
Пользователь №: 42 786



Цитата(Fat Robot @ Dec 11 2014, 00:35) *
На вычислительных платформах, на которых цена уножения равна цене сложения, а это любые dsp, смысла в кордике нет.

Насчет любых DSP не согласен. Недавно решали задачу, в которой нужно вычислять много арктангенсов, DSP TigerSHARC 101, CORDIC + SIMD дал результат лучше (в смысле вычислительных затрат) чем оптимизированный полиномиальный, хотя отдельно взятый CORDIC проигрывает.

ТС: хочу обратить Ваше внимание, что в DDC с целью подавления спуров при генерации квадратурной гармоники используются некоторые хитрости, например, младшие разряды заменяются на соответствующий отрезок ПСП. Если не ошибаюсь, в Матлабе есть такая модель (или у Xilinx-а в генераторе корок, запамятовал уже).
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Dec 11 2014, 20:53
Сообщение #15


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

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



Тут всё на веру, конечно. Не ставя под сомнение квалификацию. Но вот здесь http://www.opensource.apple.com/source/Lib...ce/Intel/atan.c
за где-то 15 умножений и 15 сложений получается точность double на входе и выходе для atan.

Цитата(stealth-coder @ Dec 11 2014, 21:30) *
Насчет любых DSP не согласен. Недавно решали задачу, в которой нужно вычислять много арктангенсов, DSP TigerSHARC 101, CORDIC + SIMD дал результат лучше (в смысле вычислительных затрат) чем оптимизированный полиномиальный, хотя отдельно взятый CORDIC проигрывает.
Go to the top of the page
 
+Quote Post

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

 


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


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