|
Цифровой генератор синусоиды, Нужен алгоритм |
|
|
|
Jan 24 2006, 07:29
|

Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 20-10-04
Из: Новосибирская обл, п.Краснообск.
Пользователь №: 916

|
Требуется сформировать 2 синуса (естественно в цифре). Можно пойти табличным методом - но для 8 бит и 1к хватит, а для 18 бит и метра может мало оказатся. Есть другой метод http://www.gaw.ru/html.cgi/txt/doc/...v/max2000_5.htm . Но интересные эфекты: даже при инт64 вылазеют гармоники на уровне -70 дб + к этому и частота не точно заданная. Попробывал так: X(n)=k*X(n-1)-X(n-2), где k=2*cos(2*Pi*F/Fd); для 0 градусов X(-1)=0, X(-2)=-A*sin(2*Pi*F/Fd); для 90 градусов X(-1)=A, X(-2)=A*sin(pi/2+2*Pi*F/Fd) 90 гр. частота на сотые доли процентов выше и уползает вперёд по отношению к 0 гр. Сейчас хочу через приблежённое вычеслени по Тейлору попробывать. Но явно по вычислениям более накладно будет. Может ещё есть способ с минимум вычислений сгенерить синус? (Всё должно в итоге оказатся в FPGA Спартан3).
--------------------
_____________________________________ Пароли неприемлемы, легко взламываются терморектальным криптоанализатором.
|
|
|
|
|
 |
Ответов
|
Jan 24 2006, 20:34
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(aal @ Jan 24 2006, 10:29)  Требуется сформировать 2 синуса (естественно в цифре)
.................................. Может ещё есть способ с минимум вычислений сгенерить синус? (Всё должно в итоге оказатся в FPGA Спартан3). Стандартный способ вычисления значения функции заключается в полиномиальном приближении ее на отрезке и отображении любого значения функции на этот отрезок. Например, для косинуса и синуса: 1 Разбиваем один период косинуса на четыре части, учитывая, что cos(-x)=cos(x); cos(2*pi*n+x)=cos(x); cos(pi+x)= -cos(x); sin(x)= -cos(pi/2+x). Пользуясь этими соотношениями, значение аргумента приводится к отрезку [0; pi/2]. 2.Участок функции с аргументом [0; pi/2] аппроксимируем полиномом: sin(x) ~ A0+A1*x+A2*x^2+...An*x^n, где А0...Аn - коэффициенты полинома. Для наилучшего приближения (в смысле наименьших средних квадратов), если склероз не изменяет, это к-ты полинома Лежандра, и ни в коем случае не Тейлора! Для Ваших требований хватит n=5-6. О вычислении к-тов нужно посмотреть в справочнике по математике. Значение функции вычисляется рекуррентно, на Спартане должно реализоваваться в пол-пинка... Можно попробовать аппроксимировать косинус и на отрезке [-pi/2; pi/2], если это будет удобнее для реализации на ПЛИС. Тогда останутся только четные степени раздожения, но вычислений будет несколько больше. Вообще-то такую штуку можно реализовать и на недорогом DSP...
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
Jan 24 2006, 22:49
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Stanislav @ Jan 25 2006, 02:34)  Можно попробовать аппроксимировать косинус и на отрезке -pi/2; pi/2, если это будет удобнее для реализации на ПЛИС. Тогда останутся только четные степени раздожения, но вычислений будет несколько больше. Я в своих изысканиях пришёл к выводу что лучше всего получается если сводить всё к отрезку [-pi/4;+pi/4] и считать либо синус либо косинус как разложение в ряд в окрестности нуля. На таком интервале они быстрее сходятся. В данной конкретной задаче придётся считать в любом случае обе функции, и синус и косинус. Ещё одно интересное разбиение - на четыре (на самом деле получается три) разных полинома: sin(x) и cos(x) при x=[-pi/8;+pi/8] - как обычно - в окрестности нуля, а на интервале x=[+pi/8;+3pi/8] считать разложением в окрестности pi/4, коэффициенты для sin и cos получаются одинаковыми с точностью до знака.
Сообщение отредактировал SSerge - Jan 24 2006, 22:49
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Jan 25 2006, 19:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Stanislav @ Jan 25 2006, 23:33)  Все-таки, попробуйте использовать для разложения многочлены Лежандра - будете немало удивлены. Дело в том, что Тэйлор наилучшим образом приближает ф-цию только в бесконечно малой (дельта-) окрестности конкретной _точки_, а пол-м Лежандра - на _отрезке_. Даже и спорить не буду. При высоких требованиях к точности результата сравнительно редкая таблица и вычисление промежуточных значений интерполяцией - очевидно будут эффективнее чем прямое вычисление, особенно для таких "прилично себя ведущих" функций как синус и косинус. Вопрос таким образом сводится к выбору наилучшего сочетания: объём таблицы - степень интерполяционного полинома. Сейчас посмотрел в исходники IAR-овского sin() - там над вопросами эффективности не особо задумывались, считают Тейлором суммируя до 9-й степени для float и аж до 17-й для double. То ли дело фортрановские библиотеки для PDP - когда-то они были для меня источником алгоритмов (интернет тогда уже был, только до нас ещё не добрался, а гугл ещё не выдумали - за каждой фигнёй приходилось тащится в библиотеку, за N километров!, по морозу! не то что нынешняя молодёжь!  )
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Jan 25 2006, 21:09
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(SSerge @ Jan 25 2006, 22:24)  Даже и спорить не буду. При высоких требованиях к точности результата сравнительно редкая таблица и вычисление промежуточных значений интерполяцией - очевидно будут эффективнее чем прямое вычисление, особенно для таких "прилично себя ведущих" функций как синус и косинус.......
Вопрос таким образом сводится к выбору наилучшего сочетания: объём таблицы - степень интерполяционного полинома.
Сейчас посмотрел в исходники IAR-овского sin() - там над вопросами эффективности не особо задумывались, считают Тейлором суммируя до 9-й степени для float и аж до 17-й для double... Нет-нет, табличным способом задаются только коэффициенты при степенях аппроксимирующего полинома, которые находятся аналитически, а узловые значения функции задавать вовсе не нужно. Точно так же, как в тейлоре, но, в отличие от него, эти к-ты будут зависеть от степени полинома. Наверное, и в ИАРе используется не тейлоровское разложение, здесь может сбить с толку абсолютно идентичный способ вычисления значения полинома. Кстати, представление лежандром оптимально только в смысле наименьших средних квадратов на отрезке, поэтому я и предложил его для генератора - будет давать минимум гармоник. Можно задаться другим критерием, напр., минимизацией масимальной ошибки на отрезке, тогда к-ты поинома будут слегка другими. Если мне опять склероз не изменяет, приближение по Лежандру дает для синуса на отрезке [0;pi/2] по 3 верных двоичных разряда за итерацию, что хорошо сочетается с цифрами, приведенными Вами. Тейлор же такой точности (24р за 9 итераций) не даст. Если выложите исходный текст ИАРовского синуса, постараюсь выяснить это - самомУ стало интересно.
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
Сообщений в этой теме
aal Цифровой генератор синусоиды Jan 24 2006, 07:29 Andy Mozzhevilov [quote name='aal' date='Jan 24 2006, 1... Jan 24 2006, 07:42 Shamil_Yusupov Цитата(aal @ Jan 24 2006, 12:29) Можно по... Jan 24 2006, 08:48 aal http://www.gaw.ru/html.cgi/txt/doc/micros/...v/max... Jan 24 2006, 09:18 Andy Mozzhevilov Цитата(aal @ Jan 24 2006, 14:18) http://w... Jan 24 2006, 09:55 vladv Цитата(aal @ Jan 24 2006, 13:18) http://w... Jun 22 2006, 19:08 iosifk Цитата(aal @ Jan 24 2006, 10:29) Требуетс... Jan 24 2006, 10:07 KPAH Есть такая штука как резонантный фильтр, подробнос... Jan 24 2006, 18:06 alexdsp Цитата(KPAH @ Jan 24 2006, 22:06) Есть та... Sep 6 2006, 14:07     SSerge ЦитатаНет-нет, табличным способом задаются только ... Jan 26 2006, 07:17 KPAH Чем ряды считать, лучше уж по фомуле sin(a+b) - бы... Jan 24 2006, 23:52 aal Спасибо Всем откликнувшимся!
Изучаю Вашу инфу... Jan 25 2006, 04:11 KPAH SSerge, так вам надо постоянно генерировать синусо... Jan 26 2006, 19:04 eteP Посмотрите эту статью.
Можно зайти на сайт GlobalD... Feb 7 2006, 10:06 Adlex Попробуйте применить DDS (прямой цифровой синтез) ... Feb 7 2006, 14:01 sansh Цитата(Adlex @ Feb 7 2006, 16:01) Попробу... Mar 3 2006, 18:18  K A A Цитата(sansh @ Mar 3 2006, 22:18) Цитата(... Jun 15 2006, 07:02   sansh А что, линейная интерполяция... не так уж и плохо.... Jun 15 2006, 08:16 _Bill Цитата(aal @ Jan 24 2006, 10:29) Требуетс... Apr 26 2006, 11:18 GetSmart Думаю, что ещё раз в 10 улучшить интерполяцию сину... Jun 15 2006, 09:06 sansh Дык производная ж - тот самый синус: sin'(x) =... Jun 15 2006, 10:35 GetSmart Есть две табличные точки А и Б. Б-А = интеграл от ... Jun 15 2006, 11:46 GetSmart Подскажите кто-нибудь сколько я насчитал децибелл.... Jun 22 2006, 20:01 vladv Цитата(GetSmart @ Jun 23 2006, 00:01) Под... Jun 22 2006, 20:36 GetSmart Аномалия какая-то!!!
Таблица 128*13 би... Jun 22 2006, 20:33 GetSmart Вот прога на паскале. Если кто хочет меня проверит... Jun 22 2006, 20:45 vladv Цитата(GetSmart @ Jun 23 2006, 00:45) Вот... Jun 22 2006, 21:27 GetSmart Я вообще не врубаюсь. Кто-нибудь, ткните меня носо... Jun 22 2006, 21:08 petrov Еще можно sin cos от фазового аккумулятора CORDICо... Aug 24 2006, 18:29 UMP Уважаемые коллеги! Для сведения. В статье Ник... Sep 2 2006, 14:14 sansh Цитата(UMP @ Sep 2 2006, 16:14) dx/dt=w [... Sep 4 2006, 06:30  UMP Пояснение
В автономном уравнении dx/dt=w [A·(1-x^... Sep 8 2006, 18:28
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|