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

 
 
 
Reply to this topicStart new topic
verali
сообщение Apr 13 2016, 07:46
Сообщение #1


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

Группа: Свой
Сообщений: 82
Регистрация: 6-11-14
Пользователь №: 83 540



Добрый день!
Решил повторить реализацию Cordic алгоритма из kit-e.ru/assets/files/pdf/2011_12_36.pdf на ПЛИС.
Проект состоит из 5 модулей (структурная схема во вложении):
1) reset_block.v - аппаратный сброс и установка всех регистров в начальное положение.
2) step_control.v - модуль. формирующий шаг фазы для вычисления синуса и косинуса, а так же четверть в которой находится выходной сигнал
3) Cordic.v - модуль, формирующий конвейер из блоков, вычисляющих выходные значения синуса и косинуса.
4) rotator[0-15].v - модуль, поворачивающий вектор на заданный угол.
5) select_quarter.v - модуль, подводящий вычисленное значение синуса и косинуса под весь диапазон АЦП.
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 82%
Прикрепленное изображение
955 x 591 (117.68 килобайт)

В модуле step_control.v значение фазы Angle задает значение выходной частоты.
В статье сказано, что значение Angle в 3216 соответствует фазе в 90 градусов, т.е увеличивая каждый такт значение Angle на 1, на выходе мы получим частоту равную f.out=F.clk/3216/4 (на 4 делится, чтобы получить полный период, а не только до 90 градусов).
Откуда взято, что значение Angle в 3216 соответствует фазе в 90 градусов?
Go to the top of the page
 
+Quote Post
D.I.M.A
сообщение Apr 13 2016, 07:59
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 26-08-08
Из: Москва
Пользователь №: 39 824



Может быть значение pi приведено к формату fract из 12 бит? Тогда pi/2 буден равно pi/2 * (2^11 - 1) = 3216.

Сообщение отредактировал D.I.M.A - Apr 13 2016, 08:00
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 13 2016, 07:59
Сообщение #3


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

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



координаты автора есть в статье. почему бы его не спросить ?


--------------------
Go to the top of the page
 
+Quote Post
verali
сообщение Apr 13 2016, 08:51
Сообщение #4


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

Группа: Свой
Сообщений: 82
Регистрация: 6-11-14
Пользователь №: 83 540



Цитата(D.I.M.A @ Apr 13 2016, 07:59) *
Может быть значение pi приведено к формату fract из 12 бит? Тогда pi/2 буден равно pi/2 * (2^11 - 1) = 3216.

Скорее всего так и есть.


Цитата(des00 @ Apr 13 2016, 07:59) *
координаты автора есть в статье. почему бы его не спросить ?

Автору статьи отписал. В случае ответа - отпишу.
Go to the top of the page
 
+Quote Post
Corner
сообщение Apr 20 2016, 15:05
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Немного оффтопа:
Короткий табличный метод с линейной аппроксимацией между точками таблицы имеет точность на порядок выше, одну итерацию и короткий высокочастотный конвейер.
Хороший тракт обработки на этом Кордик генераторе не построить. Либо криво, либо медленно.
Еще хороший вопрос о целесообразности выбранной сетки углов не кратной степени двойки. Дальнейший алгоритм обработки превращается в кошмар.

Сообщение отредактировал Corner - Apr 20 2016, 15:15
Go to the top of the page
 
+Quote Post
~Elrond~
сообщение Apr 20 2016, 22:00
Сообщение #6


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

Группа: Свой
Сообщений: 100
Регистрация: 20-04-12
Из: Нижний Новгород
Пользователь №: 71 488



Corner
Цитата
Короткий табличный метод с линейной аппроксимацией между точками таблицы
Для синтеза синуса/косинуса - безусловно. А как насчёт перевода комплексного числа из декартовой системы координат в полярную? Для этой задачи я не нашёл ни одного метода, который по скорости и точности был бы сравним с CORDIC. Может вы подскажете?
Go to the top of the page
 
+Quote Post
Corner
сообщение Apr 21 2016, 08:13
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Цитата(~Elrond~ @ Apr 21 2016, 01:00) *
Corner
Для синтеза синуса/косинуса - безусловно. А как насчёт перевода комплексного числа из декартовой системы координат в полярную? Для этой задачи я не нашёл ни одного метода, который по скорости и точности был бы сравним с CORDIC. Может вы подскажете?


Не вижу принципиальной разницы. Нужна исходная таблица чуть больше и таблица поправок, если нужна высокая точность. Одна итерация и пять тактов конвейера.
Еще такая задача решается в лоб через деление, по типу перевода синуса/косинуса компонент в фазовый угол.

Сообщение отредактировал Corner - Apr 21 2016, 08:19
Go to the top of the page
 
+Quote Post
~Elrond~
сообщение Apr 21 2016, 18:08
Сообщение #8


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

Группа: Свой
Сообщений: 100
Регистрация: 20-04-12
Из: Нижний Новгород
Пользователь №: 71 488



Corner
Принципиальная разница в том, что в LUT для генерации синуса лежит четверть периода единичной окружности, а при обратном преобразовании для общего случая нужно хранить единичный квадрат. Если взять хотя бы 10-битную точность, получаем необходимость хранить 2^(10*2) = 2^20 точек. Не многовато ли? А CORDIC, если делать две итерации за такт, сделает преобразование такой точности за 5-6 тактов.
Go to the top of the page
 
+Quote Post
Corner
сообщение Apr 22 2016, 07:29
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Цитата(~Elrond~ @ Apr 21 2016, 21:08) *
Corner
Принципиальная разница в том, что в LUT для генерации синуса лежит четверть периода единичной окружности, а при обратном преобразовании для общего случая нужно хранить единичный квадрат. Если взять хотя бы 10-битную точность, получаем необходимость хранить 2^(10*2) = 2^20 точек. Не многовато ли? А CORDIC, если делать две итерации за такт, сделает преобразование такой точности за 5-6 тактов.

Совершенно не так. Если делать аппроксимацию прямой, нужно только 1024 точки. Если сделать таблицу поправок на эллиптичность, то нужно 2 таблицы на 256 точек.
Если верить статье в начале топика, то для точности ~0,4 градуса надо 8 итераций. Это очень медленно. Задача решенная в лоб делением и двумя таблицами, работает на 200 МГц (Спартан 6) в потоке с 18 тактным конвейером и имеет точность ~0,006 градуса. Ваш Кордик нервно курит в углу.
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 22 2016, 07:59
Сообщение #10


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

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



Цитата(Corner @ Apr 22 2016, 14:29) *
работает на 200 МГц (Спартан 6) в потоке с18 тактным конвейером и имеет точность ~0,006 градуса. Ваш Кордик нервно курит в углу.

на 0.0069/0,0035 градусов, потребуется 13/14 тактов + 1 такт по входу на определение квадранта. Итого 15 тактов латентности и тактовая, на спартане 6, будет под 250-280МГц. Не совсем понял, что именно вы имели в виду про курение.

ЗЫ. Плюсы кордика - отсутствие умножителей, памяти, простая параметризуемость. Минусы - размер при однотактном варианте и несимметричность результатов, в зависимости от квадранта.


--------------------
Go to the top of the page
 
+Quote Post
Corner
сообщение Apr 22 2016, 12:16
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Цитата(des00 @ Apr 22 2016, 10:59) *
на 0.0069/0,0035 градусов, потребуется 13/14 тактов + 1 такт по входу на определение квадранта. Итого 15 тактов латентности и тактовая, на спартане 6, будет под 250-280МГц. Не совсем понял, что именно вы имели в виду про курение.

ЗЫ. Плюсы кордика - отсутствие умножителей, памяти, простая параметризуемость. Минусы - размер при однотактном варианте и несимметричность результатов, в зависимости от квадранта.

У вас 15 итераций. А не потоковый конвейер. У меня приходит 125 МСэмплов и выдается 125 Муглов с задержкой на 18 тактов. Кордик, который такое делает, съест всю плисину. Если использовать умножители в алгоритме быстрого деления, тактов станет 10. Никакой асимметрии от квадранта и точность 0,006 градуса получена с избытком. Просто удобно на выходе имет 16 битный угол = 360/65536.
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 22 2016, 12:25
Сообщение #12


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

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



Цитата(Corner @ Apr 22 2016, 19:16) *
У вас 15 итераций. А не потоковый конвейер. У меня приходит 125 МСэмплов и выдается 125 Муглов с задержкой на 18 тактов. Кордик, который такое делает, съест всю плисину. Если использовать умножители в алгоритме быстрого деления, тактов станет 10. Никакой асимметрии от квадранта и точность 0,006 градуса получена с избытком. Просто удобно на выходе имет 16 битный угол = 360/65536.

не знаю как у вас, а у меня кордик считает на 500мегасемплах, с задержкой 15 тактов. и весит 1,2к логики

ЗЫ. Генератор кордиков выкладывал на этом форуме. Искать лень.


--------------------
Go to the top of the page
 
+Quote Post
Corner
сообщение Apr 22 2016, 12:42
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Цитата(des00 @ Apr 22 2016, 15:25) *
не знаю как у вас, а у меня кордик считает на 500мегасемплах, с задержкой 15 тактов. и весит 1,2к логики

ЗЫ. Генератор кордиков выкладывал на этом форуме. Искать лень.

1,2 к логики. Это 1/4 моей ПЛИС((((
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 12:03
Рейтинг@Mail.ru


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