|
|
  |
Как реализовать генератор квадратуры, Надо генерировать 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 10 2014, 17:00
|

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

|
QUOTE (Russky @ Dec 10 2014, 18:43)  Особенность в том, что наверняка есть решение которое не вызывает ф-ю sin и cos каждый раз.  .... PS. Табличный метод не предлагать!  ..не понял я что-то, вы считать не хотите и в таблицу смотреть, тогда как же? з.ы. другое дело что синус посчитать по разному можно, но считать надо таки.
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
Dec 11 2014, 12:48
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(Russky @ Dec 11 2014, 14:53)  Но в общем это должно быть рекурсивное вычисление, где каждый следующий отсчет зависит от предыдущих. Это не синус и косинус в чистом виде.
Нужен именно генератор (так как он более экономичен к вычислениям). Школьная тригонометрия рулит.. 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, находим формулы рекурсии: sin n+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] == sin n * cos[2*pi*f*Δt] + cos n * sin[2*pi*f*Δt]; cos n+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] == cos n * cos[2*pi*f*Δt] - sin n * sin[2*pi*f*Δt]; Понятно, что sin[2*pi*f*Δt] и cos[2*pi*f*Δt] это константы, зависящие от f и Δt и выбираются так, чтобы 1/(f*Δt) = 2 N == n max+1. Начальные значения: sin 0 = 0; cos 0 = 1; Значения после переполнения счетчика n = (n max+1)%2 N == 0, полагаем равными: sin 2N = 0; cos 2N = 1; Это предотвратит накопление ошибок..
|
|
|
|
|
Dec 11 2014, 14:06
|
Местный
  
Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163

|
Цитата(Fat Robot @ Dec 10 2014, 20:54)  Что касается начальной задачи, то решение есть!!! явочным порядком можно вызывть синус и косинус например каждый 10-й раз.. или даже 100-й. можно вообще ни разу не вызывать. всё зависит ведь от необходимой точности описания функций Соглашусь FatRobot, выбор алгоритма должен определяться тем, сколько надо SFDR и сколько mips можно потратить. Отбрасывать что-то с порога глупо.
|
|
|
|
|
Dec 11 2014, 18:34
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371

|
Цитата(blackfin @ Dec 11 2014, 16:48)  Школьная тригонометрия рулит.. ... Это предотвратит накопление ошибок.. Спасибо. Надо попробовать. Как попробую - напишу. Пока все выглядет очень даже ничего!
|
|
|
|
|
Dec 11 2014, 20:30
|
Частый гость
 
Группа: Участник
Сообщений: 112
Регистрация: 27-12-08
Пользователь №: 42 786

|
Цитата(Fat Robot @ Dec 11 2014, 00:35)  На вычислительных платформах, на которых цена уножения равна цене сложения, а это любые dsp, смысла в кордике нет. Насчет любых DSP не согласен. Недавно решали задачу, в которой нужно вычислять много арктангенсов, DSP TigerSHARC 101, CORDIC + SIMD дал результат лучше (в смысле вычислительных затрат) чем оптимизированный полиномиальный, хотя отдельно взятый CORDIC проигрывает. ТС: хочу обратить Ваше внимание, что в DDC с целью подавления спуров при генерации квадратурной гармоники используются некоторые хитрости, например, младшие разряды заменяются на соответствующий отрезок ПСП. Если не ошибаюсь, в Матлабе есть такая модель (или у Xilinx-а в генераторе корок, запамятовал уже).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|