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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Цифровой генератор синусоиды, Нужен алгоритм
aal
сообщение Jan 24 2006, 07:29
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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).


--------------------
_____________________________________
Пароли неприемлемы, легко взламываются терморектальным криптоанализатором.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Jan 24 2006, 07:42
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



[quote name='aal' date='Jan 24 2006, 12:29' post='80720']
Требуется сформировать 2 синуса (естественно в цифре). Можно пойти табличным методом - но для 8 бит и 1к хватит, а для 18 бит и метра может мало оказатся. Есть другой метод http://www.gaw.ru/html.cgi/txt/doc/...v/max2000_5.htm .
[\quote]

Дайте точную ссылку на метод

Сообщение отредактировал Andy Mozzhevilov - Jan 24 2006, 07:44


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Shamil
сообщение Jan 24 2006, 08:48
Сообщение #3


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

Группа: Свой
Сообщений: 160
Регистрация: 23-12-04
Из: Уфа
Пользователь №: 1 631



Цитата(aal @ Jan 24 2006, 12:29) *
Можно пойти табличным методом - но для 8 бит и 1к хватит, а для 18 бит и метра может мало оказатся.


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

Для примера: Нам требовалось иметь синусы 425 Гц, 2100 Гц, 2600 Гц на выходе
ИКМ кодека (8000 выборок/сек по 8 бит).

Сначала думали придеться ставить ПЗУ, но поигравшись с подбором
кратных частот нашли замены: 421,053 Гц (19 выборок), 2105,26 (19 выборок),
2600 (40 выборок).

Причем Synplify очень хорошо оптимизирует таблицы, и вышеприведенные синусы
заняли в ПЛИС Actel Ex256 не больше 10 %.
Go to the top of the page
 
+Quote Post
aal
сообщение Jan 24 2006, 09:18
Сообщение #4


Местный
***

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



http://www.gaw.ru/html.cgi/txt/doc/micros/...v/max2000_5.htm

Требуется генерить синусоиды с частотами от 300 Гц до 2,5 МГц с шагом 1 Гц.
Желательно с нелиненостями -90 дБ. Проект - селективный вольтметр, с полосами 30 и 100 Гц, желательно и со спектроанализатором.
Основная идея - сигнал с ацп перемножаем с синусом и косинусом по отдельности, фильтруем и децимируем. перемножаем каждый из них на самого себя, складываем и из постоянной состовляющей извлекаем корень квадратный - значение уровня сигнала в выбранной полосе на выбранной частоте.
Т.к. в спартане умножители 18 битные, то и синус желательно сформировать 18 битный. Частота опорного генератора 10 МГц.


--------------------
_____________________________________
Пароли неприемлемы, легко взламываются терморектальным криптоанализатором.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Jan 24 2006, 09:55
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(aal @ Jan 24 2006, 14:18) *
http://www.gaw.ru/html.cgi/txt/doc/micros/...v/max2000_5.htm

Требуется генерить синусоиды с частотами от 300 Гц до 2,5 МГц с шагом 1 Гц.
Желательно с нелиненостями -90 дБ. Проект - селективный вольтметр, с полосами 30 и 100 Гц, желательно и со спектроанализатором.
Основная идея - сигнал с ацп перемножаем с синусом и косинусом по отдельности, фильтруем и децимируем. перемножаем каждый из них на самого себя, складываем и из постоянной состовляющей извлекаем корень квадратный - значение уровня сигнала в выбранной полосе на выбранной частоте.
Т.к. в спартане умножители 18 битные, то и синус желательно сформировать 18 битный. Частота опорного генератора 10 МГц.


Что-то в постановке не то: -90дБ до 2.5МГц с шагом 1 Гц с тактовой 10МГц, это не описка?
Попробуйте посмотреть такой метод:
http://archive.chipcenter.com/dsp/DSP080201F1.html
и смежные статьи на том же сервере.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jan 24 2006, 10:07
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(aal @ Jan 24 2006, 10:29) *
Требуется сформировать 2 синуса (естественно в цифре). Можно пойти табличным методом - но для 8 бит и 1к хватит, а для 18 бит и метра может мало оказатся.

Может ещё есть способ с минимум вычислений сгенерить синус?


Когда-то от аналоговых времен помню, что пробовал генерить синусоиду при кусочно-линейной аппрокс. по методу треугольников.
Возможно, если удастся подобрать что-то в этом духе, ( делал я это для реализации в альтере лет 8 назад и деталей уже не помню ) то из таблицы надо будет брать не сам сигнал, а только поправку. Следовательно объем таблицы значительно уменьшится.
Удачи!


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
KPAH
сообщение Jan 24 2006, 18:06
Сообщение #7





Группа: Новичок
Сообщений: 5
Регистрация: 24-01-06
Пользователь №: 13 559



Есть такая штука как резонантный фильтр, подробности по ссылке
http://www.research.scea.com/research/pdfs...rmath_GDC02.pdf
Go to the top of the page
 
+Quote Post
Stanislav
сообщение Jan 24 2006, 20:34
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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...


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jan 24 2006, 22:49
Сообщение #9


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

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
KPAH
сообщение Jan 24 2006, 23:52
Сообщение #10





Группа: Новичок
Сообщений: 5
Регистрация: 24-01-06
Пользователь №: 13 559



Чем ряды считать, лучше уж по фомуле sin(a+b) - быстрее будет это точно ( это в принципе и есть резонантный фильтр, я просто настаиваю на том, чтобы вы ознакомились с предложенным мной документом ). Особый шик - при некоторых частотах умножений для вычисления синусов/косинусов вообще не потребуется.

Сообщение отредактировал KPAH - Jan 24 2006, 23:58
Go to the top of the page
 
+Quote Post
aal
сообщение Jan 25 2006, 04:11
Сообщение #11


Местный
***

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



Спасибо Всем откликнувшимся!
Изучаю Вашу инфу. Проведу эксперименты - обязательно отчетаюсь.


--------------------
_____________________________________
Пароли неприемлемы, легко взламываются терморектальным криптоанализатором.
Go to the top of the page
 
+Quote Post
Stanislav
сообщение Jan 25 2006, 17:33
Сообщение #12


Гуру
******

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



Цитата(SSerge @ Jan 25 2006, 01:49) *
Я в своих изысканиях пришёл к выводу что лучше всего получается если сводить всё к отрезку [-pi/4;+pi/4] и считать либо синус либо косинус как разложение в ряд в окрестности нуля. На таком интервале они быстрее сходятся.
В данной конкретной задаче придётся считать в любом случае обе функции, и синус и косинус.
Ещё одно интересное разбиение - на четыре (на самом деле получается три) разных полинома:
sin(x) и cos(x) при x=[-pi/8;+pi/8] - как обычно - в окрестности нуля, а на интервале
x=[+pi/8;+3pi/8] считать разложением в окрестности pi/4, коэффициенты для sin и cos получаются одинаковыми с точностью до знака.


Все-таки, попробуйте использовать для разложения многочлены Лежандра - будете немало удивлены. Дело в том, что Тэйлор наилучшим образом приближает ф-цию только в бесконечно малой (дельта-) окрестности конкретной _точки_, а пол-м Лежандра - на _отрезке_.


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jan 25 2006, 19:24
Сообщение #13


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Stanislav @ Jan 25 2006, 23:33) *
Все-таки, попробуйте использовать для разложения многочлены Лежандра - будете немало удивлены. Дело в том, что Тэйлор наилучшим образом приближает ф-цию только в бесконечно малой (дельта-) окрестности конкретной _точки_, а пол-м Лежандра - на _отрезке_.


Даже и спорить не буду.
При высоких требованиях к точности результата сравнительно редкая таблица и вычисление промежуточных значений интерполяцией - очевидно будут эффективнее чем прямое вычисление, особенно для таких "прилично себя ведущих" функций как синус и косинус.

Вопрос таким образом сводится к выбору наилучшего сочетания: объём таблицы - степень интерполяционного полинома.

Сейчас посмотрел в исходники IAR-овского sin() - там над вопросами эффективности не особо задумывались, считают Тейлором суммируя до 9-й степени для float и аж до 17-й для double.
То ли дело фортрановские библиотеки для PDP - когда-то они были для меня источником алгоритмов (интернет тогда уже был, только до нас ещё не добрался, а гугл ещё не выдумали - за каждой фигнёй приходилось тащится в библиотеку, за N километров!, по морозу! не то что нынешняя молодёжь! smile.gif )


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Stanislav
сообщение Jan 25 2006, 21:09
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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 итераций) не даст. Если выложите исходный текст ИАРовского синуса, постараюсь выяснить это - самомУ стало интересно.


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jan 26 2006, 07:17
Сообщение #15


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата
Нет-нет, табличным способом задаются только коэффициенты при степенях аппроксимирующего полинома, которые находятся аналитически, а узловые значения функции задавать вовсе не нужно. Точно так же, как в тейлоре, но, в отличие от него, эти к-ты будут зависеть от степени полинома. Наверное, и в ИАРе используется не тейлоровское разложение, здесь может сбить с толку абсолютно идентичный способ вычисления значения полинома. Кстати, представление лежандром оптимально только в смысле наименьших средних квадратов на отрезке, поэтому я и предложил его для генератора - будет давать минимум гармоник. Можно задаться другим критерием, напр., минимизацией масимальной ошибки на отрезке, тогда к-ты поинома будут слегка другими. Если мне опять склероз не изменяет, приближение по Лежандру дает для синуса на отрезке [0;pi/2] по 3 верных двоичных разряда за итерацию, что хорошо сочетается с цифрами, приведенными Вами. Тейлор же такой точности (24р за 9 итераций) не даст. Если выложите исходный текст ИАРовского синуса, постараюсь выяснить это - самомУ стало интересно.

Точно, от к-тов Тейлора немного отличаются в младших разрядах, наверняка какой-нибудь полином.
Уступив настоятельной просьбе smile.gif ознакомился с предложенным KPAH документом, вставляет.
Исходник синуса прилагается.
#define __TWOOPI 0.63661977236758134308
Прикрепленный файл  sinus.c.txt ( 1.53 килобайт ) Кол-во скачиваний: 433
Go to the top of the page
 
+Quote Post
KPAH
сообщение Jan 26 2006, 19:04
Сообщение #16





Группа: Новичок
Сообщений: 5
Регистрация: 24-01-06
Пользователь №: 13 559



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

Для первого случая ничего лучше sin(a + b) не придумаешь.

Для второго случая: я писал библиотеку для TI DSP 64XX. Использовал свой формат с плавающей точкой мантисса - 23 бита, только нормированные числа так что значащих бит вообще 22. Синус считал тейлором на отрезке 0 - Пи/4 (для синуса на этом отрезке полином был такой x + A*x^3 + B*x^5 + C*x^7) в итоге для всего допустимого диапазона значений аргумента (что-то типа до 2^24) получается погрешность 4 ULP от floata, то есть 2 ULP от моего представления. A, B и C похожи на тейлоровские но слегка модифицированные чтобы минимизировать относительную погрешность. По любому больше чем 18 бит точности (не забываем ещё и про argument reduction, который у меня есть и соответственно он тоже привносит ненулевую погрешность). Без argument reduction на 0 - Пи/4 ошибка 1 ULP флоата (в принципе это неустранимая ошибка так как мантисса на 1 бит меньше).

вот на всякий случай кодд:

CAFloat sin1 = -0.16666666666666666666666666666667f;
CAFloat sin2 = 0.0083333333333333333333333333333333f;
CAFloat sin3 = -0.0001984126984126984126984126984127f*0.9925f;

inline CAFloat CF_sin_reduced(const CAFloat &x)
{
if(_ext(x.x, 0, 24) < -11)
return x;

CAFloat arg = x * x;
return x + x*(sin1 + arg*(sin2 + arg*sin3))*arg;
}
Go to the top of the page
 
+Quote Post
eteP
сообщение Feb 7 2006, 10:06
Сообщение #17


Участник
*

Группа: Свой
Сообщений: 50
Регистрация: 24-06-04
Пользователь №: 166



Посмотрите эту статью.
Можно зайти на сайт GlobalDSP
Стастья за декабрь 2003 года -> Algorithms (Fast, Continuous, Sine Wave Generator)
Судя по статье, результаты не плохие. Там же есть пример кода на DSP.

Успехов.Прикрепленный файл  Pages_from_GlobalDSP_December2003.pdf ( 347.02 килобайт ) Кол-во скачиваний: 825
Go to the top of the page
 
+Quote Post
Adlex
сообщение Feb 7 2006, 14:01
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 500
Регистрация: 8-08-05
Пользователь №: 7 451



Попробуйте применить DDS (прямой цифровой синтез) или, по крайней мере, применить те же алгоритмы
Go to the top of the page
 
+Quote Post
sansh
сообщение Mar 3 2006, 18:18
Сообщение #19





Группа: Новичок
Сообщений: 7
Регистрация: 2-03-06
Из: Минск
Пользователь №: 14 892



Цитата(Adlex @ Feb 7 2006, 16:01) *
Попробуйте применить DDS (прямой цифровой синтез) или, по крайней мере, применить те же алгоритмы

Это же чистая табличная реализация, с нее-то и начинали. А в Spartan'е, между прочим, память свободная не завалялась? А то можно взять и просто сделать аккумулятор фазы бита на 32 и иметь ~0,01Гц разешение (см. теорию DDS лучше по datasheet на AD9854) . Хотя -90dB получишь где-то в районе 32к-точечной таблицы...
Go to the top of the page
 
+Quote Post
_Bill
сообщение Apr 26 2006, 11:18
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(aal @ Jan 24 2006, 10:29) *
Требуется сформировать 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).

А микросхему DDS поставить не проще?
Go to the top of the page
 
+Quote Post
K A A
сообщение Jun 15 2006, 07:02
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 15-06-06
Пользователь №: 18 069



Цитата(sansh @ Mar 3 2006, 22:18) *
Цитата(Adlex @ Feb 7 2006, 16:01) *

Попробуйте применить DDS (прямой цифровой синтез) или, по крайней мере, применить те же алгоритмы

Это же чистая табличная реализация, с нее-то и начинали. А в Spartan'е, между прочим, память свободная не завалялась? А то можно взять и просто сделать аккумулятор фазы бита на 32 и иметь ~0,01Гц разешение (см. теорию DDS лучше по datasheet на AD9854) . Хотя -90dB получишь где-то в районе 32к-точечной таблицы...


Я реализовал DDS на сигнальном процессоре. Для сокращения объема выборок (оставил 1024 отсчета) использовал линейную интерполяцию между соседними отсчетами (старшие 10 бит фазового аккумулятора адресуют выборку из таблицы, а младшие (32-10) бит используются для интерполяции). На интерполяцию ушло 2 умножения и 3 сложения. Проверял в MathCad, отличие от чистой синусоиды не более 5*10^-4 % (я, правда, не учитывал, что выборки 16-битные).
Go to the top of the page
 
+Quote Post
sansh
сообщение Jun 15 2006, 08:16
Сообщение #22





Группа: Новичок
Сообщений: 7
Регистрация: 2-03-06
Из: Минск
Пользователь №: 14 892



А что, линейная интерполяция... не так уж и плохо... А хранить можно только pi/2, усложнив адресацию и добавив (+/-).
Кстати, где-то видел науку о кусочно-линейной интерполяции синуса, причем с нелинейным разбиением по времени (в зависимости от скорости нарастания). Приводило это все к радикальному уменьшению размера памяти выборок.
5e-4% - это не так и много, около -66dB, а как получено это значение (среднее квадратичное отклонение или...)? Посчитать бы еще Кг.

Сообщение отредактировал sansh - Jun 15 2006, 08:23
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 15 2006, 09:06
Сообщение #23


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Думаю, что ещё раз в 10 улучшить интерполяцию синуса можно если линейно интерполировать производную, а потом брать от неё интеграл. Например если нарисовать производную в виде треугольного сигнала, то первообразная будет очень похожа на синус.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
sansh
сообщение Jun 15 2006, 10:35
Сообщение #24





Группа: Новичок
Сообщений: 7
Регистрация: 2-03-06
Из: Минск
Пользователь №: 14 892



Дык производная ж - тот самый синус: sin'(x) = cos(x) = sin(x+pi/2).
И про интегрирование не понял, как его делать? Каждый новый отсчет в копилку класть? Тогда быстро за пару десятков периодов набежит ошибка.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 15 2006, 11:46
Сообщение #25


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Есть две табличные точки А и Б. Б-А = интеграл от производной. При линейной интерполяции подразумевается производная = const = (Б-А)/шаг таблицы. Однако если производную наклонить так, чтобы "определённый интеграл" не изменился, то получится гораздо большая точность. При этом производная будет прямой наклонённой линией. Никаких накоплений для этого делать не надо. Немного больше арифметических действий и фсё.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
vladv
сообщение Jun 22 2006, 19:08
Сообщение #26


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

Группа: Участник
Сообщений: 128
Регистрация: 7-06-06
Пользователь №: 17 825



Цитата(aal @ Jan 24 2006, 13:18) *
http://www.gaw.ru/html.cgi/txt/doc/micros/...v/max2000_5.htm

Требуется генерить синусоиды с частотами от 300 Гц до 2,5 МГц с шагом 1 Гц.
Желательно с нелиненостями -90 дБ. Проект - селективный вольтметр, с полосами 30 и 100 Гц, желательно и со спектроанализатором.
Основная идея - сигнал с ацп перемножаем с синусом и косинусом по отдельности, фильтруем и децимируем. перемножаем каждый из них на самого себя, складываем и из постоянной состовляющей извлекаем корень квадратный - значение уровня сигнала в выбранной полосе на выбранной частоте.
Т.к. в спартане умножители 18 битные, то и синус желательно сформировать 18 битный. Частота опорного генератора 10 МГц.


Готовый DDC, например AD6620, не хотите попробовать?

А так, для этой задачи не столько нелинейность синуса важна, сколько SFDR (хотя они взаимосвязаны). При этом спектральные "палки" можно с помощью дизеринга "размазать". У нас, например, -110dBc SFDR получалось на таблице 256x25 бит с линейной интерполяцией и дизерингом фазы (около -90dBc без дизеринга).
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 22 2006, 20:01
Сообщение #27


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Подскажите кто-нибудь сколько я насчитал децибелл.
Составил прогу на паскале с линейной интерполяцией синуса по таблице 256*16 бит. Максимальное отклонение по центру между колонками составило 3.1e-6 относительно самого синуса (+-1.0).


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 22 2006, 20:33
Сообщение #28


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Аномалия какая-то!!!
Таблица 128*13 бит с линейной интерполяцией даёт ещё большее качество - 0.9e-6 !!!


Кто-нибудь может мне это объяснить?

Сообщение отредактировал GetSmart - Jun 22 2006, 20:40


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
vladv
сообщение Jun 22 2006, 20:36
Сообщение #29


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

Группа: Участник
Сообщений: 128
Регистрация: 7-06-06
Пользователь №: 17 825



Цитата(GetSmart @ Jun 23 2006, 00:01) *
Подскажите кто-нибудь сколько я насчитал децибелл.
Составил прогу на паскале с линейной интерполяцией синуса по таблице 256*16 бит. Максимальное отклонение по центру между колонками составило 3.1e-6 относительно самого синуса (+-1.0).


Странно. При ширине выхода таблицы 16бит, максимальное отклонение от "истинного" синуса должно было быть порядка 1.5e-5. Или в программе что-то не то, или я не правильно понял, что такое "Максимальное отклонение по центру между колонками" sad.gif.

При отклонении от "идеального" синуса на 3.1e-6, SFDR даже в самом поганом случае (вся "энергия" отклонения "ушла" в один спур), думаю, будет ниже -110dBc.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 22 2006, 20:45
Сообщение #30


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Вот прога на паскале. Если кто хочет меня проверить.

Цитата
При отклонении от "идеального" синуса на 3.1e-6, SFDR даже в самом поганом случае (вся "энергия" отклонения "ушла" в один спур), думаю, будет ниже -110dBc.

Правда? А для 0.9e-6 сколько децибелл будет?

Сообщение отредактировал GetSmart - Jun 22 2006, 20:50
Прикрепленные файлы
Прикрепленный файл  sinus.rar ( 4.54 килобайт ) Кол-во скачиваний: 86
 


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 22 2006, 21:08
Сообщение #31


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Я вообще не врубаюсь. Кто-нибудь, ткните меня носом, где я ошибся.
_____________

Да. Поспешил, людей...
Там в проге в конце надо было поставить
WriteLn(er).

Теперь правильный результат:
для 256*16 бит ошибка составит 8.2e-5

Сообщение отредактировал GetSmart - Jun 22 2006, 21:19


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
vladv
сообщение Jun 22 2006, 21:27
Сообщение #32


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

Группа: Участник
Сообщений: 128
Регистрация: 7-06-06
Пользователь №: 17 825



Цитата(GetSmart @ Jun 23 2006, 00:45) *
Вот прога на паскале. Если кто хочет меня проверить.

Цитата
При отклонении от "идеального" синуса на 3.1e-6, SFDR даже в самом поганом случае (вся "энергия" отклонения "ушла" в один спур), думаю, будет ниже -110dBc.

Правда? А для 0.9e-6 сколько децибелл будет?


Если я правильно понял, то ты смотришь отклонение от "идеального" синуса толко по середине между табличными значениями и тебе просто "повезло" (что само по себе забавно). Попробуй вычислить отклонение для, скажем, 8 точек на шаг таблицы (всего 1К точек), включая значения в "узлах" таблицы.

Для 0.9e-6, думаю, SFDR будет ниже -120. Для оценки: SFDR <= 20*lg(d/A), где A - амплитуда тона,
а d - максимальное отклонение от "идеального" синуса.
Go to the top of the page
 
+Quote Post
petrov
сообщение Aug 24 2006, 18:29
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Еще можно sin cos от фазового аккумулятора CORDICом посчитать, если тактовая позволяет то вообще последовательным, на FPGA вс ё это очень хорошо ложится.
Go to the top of the page
 
+Quote Post
UMP
сообщение Sep 2 2006, 14:14
Сообщение #34


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

Группа: Свой
Сообщений: 78
Регистрация: 27-07-06
Пользователь №: 19 147



Уважаемые коллеги! Для сведения. В статье Никулин Э. С., Пахоменков Ю.М. Метод построения низкочастотных генераторов сигналов сложной формы // Судостроительная промышленность. Автоматика и телемеханика. – 1992. – Вып. 14. – С. 37-48 описан метод воспроизведения временных зависимостей, путём решения автономного дифференциального уравнения, которое, в частности, для функции x(t)=Asin(wt) на четверти периода имеет вид dx/dt=w [A·(1-x^2)^0.5]. В этом уравнении множитель в скобках [] соответствует функции y(t)=Acos(wt). Метод неплохо работает для низкочастотных сигналов и удобен там, где для других задач, например для вычисления расхода рабочей среды, уже имеются средства извлечения корня.
Go to the top of the page
 
+Quote Post
sansh
сообщение Sep 4 2006, 06:30
Сообщение #35





Группа: Новичок
Сообщений: 7
Регистрация: 2-03-06
Из: Минск
Пользователь №: 14 892



Цитата(UMP @ Sep 2 2006, 16:14) *
dx/dt=w [A·(1-x^2)^0.5]. В этом уравнении множитель в скобках [] соответствует функции y(t)=Acos(wt).

К сожалению до первоисточника не добрался. Попробовал в лоб посчитать в MatLab. Получил комплексные числа. Потом подумал... smile.gif Четверть периода - это pi/2? т.е. ~1.57 радиан. Таким образом, под корнем имеем отрицательные числа. Да и сигнал на синус не похож абсолютно, втыкается под прямым углом в ось абсцисс, по науке д.б. 45 градусов.
Go to the top of the page
 
+Quote Post
alexdsp
сообщение Sep 6 2006, 14:07
Сообщение #36


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

Группа: Свой
Сообщений: 82
Регистрация: 22-10-04
Из: Moscow
Пользователь №: 954



Цитата(KPAH @ Jan 24 2006, 22:06) *
Есть такая штука как резонантный фильтр, подробности по ссылке
http://www.research.scea.com/research/pdfs...rmath_GDC02.pdf


KPAH
Большое спасибо за ссылку. Очень документ порадовал (хотя такой метод генерации синуса я знал и раньше).
0FF/2 А есть ли ещё что-нибудь в этом же духе, т.е. в виде справочника по разным методам, алгоритмам и прочее?
Go to the top of the page
 
+Quote Post
UMP
сообщение Sep 8 2006, 18:28
Сообщение #37


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

Группа: Свой
Сообщений: 78
Регистрация: 27-07-06
Пользователь №: 19 147



Прикрепленное изображение
Пояснение
В автономном уравнении dx/dt=w [A·(1-x^2)^0.5]. Четверть периода - это abs(wt)< pi/2?.
Для большей наглядности прикрепляю рисунок
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:45
Рейтинг@Mail.ru


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