Перейти к содержанию
    

Частота синуса полученного с помощью CORDIC

Проблема в получении частоты синуса, сгенерированного cordic-алгоритмом.

Обрисую картину:

 

 

 

Данный модуль вычисляет синус и косинус фазы - поданной на вход Angle. Модуль тактируется с частотой clk = 100МГц.

Мне поставлена задача генерировать синус с частотой 10кГц кордик-методом. Само ядро кордика я без труда написал. загвоздка в другом:

 

Angle меняет значение от 0 (соответствует фазе 0 градусов) до 3216 (соответствует фазе 90 градусов).

Так вот, если каждый такт clk увеличивать Angle на '1', то на выходе мы получим частоту в 7773,631 Гц (Период 100МГц = 10нс, 10нс*3216*4 = 128 640нc - период синуса на выходе). Назовем эту частоту типовой....

Если мы хотим получить частоту в два раза больше, то нужно каждый такт clk увеличивать Angle на '2'.

Если мы хотим получить частоту в 1,2 раза больше типовой, то нужно увеличивать Angle каждый такт на '1', но через каждый 5-й такт clk увеличивать Angle не на '1' а на '2'.

Таким образом вопрос в студию: как мне получить на выходе частоу в 10кГц, что в 1,2864 раза больше типовой. Т.е. мне необходимо найти алгоритм увеличения счетчика Angle, что получить частоту в 10кГц. Напомним - схема тактируется с частотой в 100МГц.

Пишу на verilog.

post-39559-1292838828_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может надо сделать ANGLE 32-х разрядным. На вход CORDIC подавать старшие 12 разрядов. А прибавлять какое-то маленькое значение.

 

Если нужно получить 10 кГц, то значение 2^32 надо пройти за 10000 тактов. Это означает, что нужно прибавлять 2^32/10000 = 429496,7296

 

Прибавлять надо конечно целое число 429496; А это означает что будет небольшая погрешность. Получится 10000,01698735 Гц.

 

А если использовать 48 бит: то 2^48/10000 = 28147497671,07 Погрешность: 2^48/28147497671 = 10000,00000002

 

Расчёты приведены для случая что CORDIC выдаст число от 0 до 2*PI;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если мы хотим получить частоту в 1,2 раза больше типовой, то нужно увеличивать Angle каждый такт на '1', но через каждый 5-й такт clk увеличивать Angle не на '1' а на '2'.

Таким образом вопрос в студию: как мне получить на выходе частоу в 10кГц, что в 1,2864 раза больше типовой.

Если нужно получить именно 10кГц, но с некоторой погрешностью в значениях синуса/косинуса, то продолжая Ваш алгоритм расчета для 1,2 раза:

2/10=1/5 - каждый пятый ->angle+1

8/100=1/12,5 - попеременно каждый 12 и каждый 13 ->angle +1

Ну и т.д. при этом у Вас будет 4 счетчика: от 0 до 4, от 0 до 99, 0 - 999, 0-9999 и т.д. ну и куча логики в обвязке для разрешающих сигналов на суммирование...

Изменено пользователем bogaev_roman

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема в получении частоты синуса, сгенерированного cordic-алгоритмом.

че-то вы тут намудрили. то, что вы делаете, называется NCO, состоит из 2 частей - аккумулятора фазы и преобразователя фаза/амплитуда. кордик - один из вариантов реализации последнего (другие варианты - таблицы + возможно, компрессия).

самое простое - сделать аккумулятор достаточно широкий (точность задания частоты определяется именно им), потом

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

( http://rua.ua.es/dspace/bitstream/10045/11...mse-sanchez.pdf , http://www.ac.usc.es/arith19/sites/default...on7-paper1.pdf), если вам нужно ровно 10 кГц, но это изврат, имхо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрел первую статью. Формул испугался.

По-моему, поставленная задача решается с помощью линейной интерполяции. Т.е. нужно значение, соответствующее шагу 1.5 - берем среднее значение между 1-м и 2-м элементами таблицы. Благодаря тому, что при малых значениях sin(x) = x, такая интерполяция допустима.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Angle меняет значение от 0 (соответствует фазе 0 градусов) до 3216 (соответствует фазе 90 градусов).

А зачем он это делает? То есть почему нельзя поставить соответствие 2500 для 90 градусов - и сразу получить щассье?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему, поставленная задача решается с помощью линейной интерполяции.

я об этом писал, когда помянул табличные методы. интерполяция - один из методов компрессии таблиц. причем, зачем линейная - можно и Фарроу замутить. а вот интерполировать кордик - за гранью добра и зла :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

че-то вы тут намудрили. то, что вы делаете, называется NCO, состоит из 2 частей - аккумулятора фазы и преобразователя фаза/амплитуда. кордик - один из вариантов реализации последнего (другие варианты - таблицы + возможно, компрессия).

самое простое - сделать аккумулятор достаточно широкий (точность задания частоты определяется именно им), потом

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

( http://rua.ua.es/dspace/bitstream/10045/11...mse-sanchez.pdf , http://www.ac.usc.es/arith19/sites/default...on7-paper1.pdf), если вам нужно ровно 10 кГц, но это изврат, имхо.

 

Точно, надо попробовать именно аккумулятор фазы с усеченным выходом..... спасибо за наводку :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Многое, из того что мне предлагали - это некоторые универсальные методы... Я же ограничен в количесве задействованных логических ячеек и мне нужно получить именно частоту 10кГц. Поэтому я сделал намного все проще:

Раз, нужная частота больше типовой в 1,2864 раза, нужно сделать так

 

reg [15:0] M = 16'd2864;

reg [15:0] Acc = 16'd0;

 

always @ (posedge clk)

begin

if (Acc >= 16'd10000)

begin

ena_incr <= 1'b1;

Acc <= Acc - 7136;

end

else

begin

ena_incr <= 1'b0;

Acc <= Acc + M;

end

end

 

always @ (posedge clk)

begin

if (ena_incr) begin

Angle <= Angle + 12'd2;

count_ang <= count_ang+2; end

else begin

Angle <= Angle + 12'd1;

count_ang <= count_ang+1; end

end

end

 

Здесь Acc - аккумулятор фазы,

M - шаг

Если ena_incr = '1', то нужная фаза Angle увеличивается на 2

если ena_incr = '0', то увеличивается на 1. Таким образом получаем некий алгоритм увлеичения фазы для того чтоб получить на выходе частоту 10кГц.

 

Нужно конечон сказать что скорее всего NCO :) так что vadimuzzz был прав...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем он это делает? То есть почему нельзя поставить соответствие 2500 для 90 градусов - и сразу получить щассье?

Присоединяюсь к вопросу - из чего выбрано изменение угла в диапазоне 0...3216?

Выберите более "круглый" диапазон, и ничего делать не придется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяюсь к вопросу - из чего выбрано изменение угла в диапазоне 0...3216?

Выберите более "круглый" диапазон, и ничего делать не придется.

 

Он не выбирается - он такой есть! на вход кордик-конвеера подаешь в моем случае фазу, разрядностью 12 бит а на выходе кордик-конвеера - результат вычислений - значение Синуса и Косинуса. Так вот при 12'd3216 - это максимальное значение на выходе - фаза 90 градусов..... Можно это все и обосновать математически, но щас пора с работы домой уходить :) - завтра попробую более подробно написать )))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...