|
Цифровой генератор синусоиды, Нужен алгоритм |
|
|
|
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, 07:42
|

Знающий
   
Группа: Свой
Сообщений: 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
--------------------
Пасу котов...
|
|
|
|
|
Jan 24 2006, 08:48
|
Частый гость
 
Группа: Свой
Сообщений: 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 %.
|
|
|
|
|
Jan 24 2006, 09:18
|

Местный
  
Группа: Свой
Сообщений: 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 МГц.
--------------------
_____________________________________ Пароли неприемлемы, легко взламываются терморектальным криптоанализатором.
|
|
|
|
|
Jan 24 2006, 09:55
|

Знающий
   
Группа: Свой
Сообщений: 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и смежные статьи на том же сервере.
--------------------
Пасу котов...
|
|
|
|
|
Jan 24 2006, 10:07
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(aal @ Jan 24 2006, 10:29)  Требуется сформировать 2 синуса (естественно в цифре). Можно пойти табличным методом - но для 8 бит и 1к хватит, а для 18 бит и метра может мало оказатся.
Может ещё есть способ с минимум вычислений сгенерить синус? Когда-то от аналоговых времен помню, что пробовал генерить синусоиду при кусочно-линейной аппрокс. по методу треугольников. Возможно, если удастся подобрать что-то в этом духе, ( делал я это для реализации в альтере лет 8 назад и деталей уже не помню ) то из таблицы надо будет брать не сам сигнал, а только поправку. Следовательно объем таблицы значительно уменьшится. Удачи!
--------------------
www.iosifk.narod.ru
|
|
|
|
|
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 24 2006, 23:52
|
Группа: Новичок
Сообщений: 5
Регистрация: 24-01-06
Пользователь №: 13 559

|
Чем ряды считать, лучше уж по фомуле sin(a+b) - быстрее будет это точно ( это в принципе и есть резонантный фильтр, я просто настаиваю на том, чтобы вы ознакомились с предложенным мной документом ). Особый шик - при некоторых частотах умножений для вычисления синусов/косинусов вообще не потребуется.
Сообщение отредактировал KPAH - Jan 24 2006, 23:58
|
|
|
|
|
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 итераций) не даст. Если выложите исходный текст ИАРовского синуса, постараюсь выяснить это - самомУ стало интересно.
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
Jan 26 2006, 07:17
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата Нет-нет, табличным способом задаются только коэффициенты при степенях аппроксимирующего полинома, которые находятся аналитически, а узловые значения функции задавать вовсе не нужно. Точно так же, как в тейлоре, но, в отличие от него, эти к-ты будут зависеть от степени полинома. Наверное, и в ИАРе используется не тейлоровское разложение, здесь может сбить с толку абсолютно идентичный способ вычисления значения полинома. Кстати, представление лежандром оптимально только в смысле наименьших средних квадратов на отрезке, поэтому я и предложил его для генератора - будет давать минимум гармоник. Можно задаться другим критерием, напр., минимизацией масимальной ошибки на отрезке, тогда к-ты поинома будут слегка другими. Если мне опять склероз не изменяет, приближение по Лежандру дает для синуса на отрезке [0;pi/2] по 3 верных двоичных разряда за итерацию, что хорошо сочетается с цифрами, приведенными Вами. Тейлор же такой точности (24р за 9 итераций) не даст. Если выложите исходный текст ИАРовского синуса, постараюсь выяснить это - самомУ стало интересно. Точно, от к-тов Тейлора немного отличаются в младших разрядах, наверняка какой-нибудь полином. Уступив настоятельной просьбе  ознакомился с предложенным KPAH документом, вставляет. Исходник синуса прилагается. #define __TWOOPI 0.63661977236758134308
sinus.c.txt ( 1.53 килобайт )
Кол-во скачиваний: 433
|
|
|
|
|
Jan 26 2006, 19:04
|
Группа: Новичок
Сообщений: 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; }
|
|
|
|
|
Feb 7 2006, 10:06
|
Участник

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

|
Посмотрите эту статью. Можно зайти на сайт GlobalDSPСтастья за декабрь 2003 года -> Algorithms (Fast, Continuous, Sine Wave Generator) Судя по статье, результаты не плохие. Там же есть пример кода на DSP. Успехов.
Pages_from_GlobalDSP_December2003.pdf ( 347.02 килобайт )
Кол-во скачиваний: 825
|
|
|
|
|
Mar 3 2006, 18:18
|

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

|
Цитата(Adlex @ Feb 7 2006, 16:01)  Попробуйте применить DDS (прямой цифровой синтез) или, по крайней мере, применить те же алгоритмы Это же чистая табличная реализация, с нее-то и начинали. А в Spartan'е, между прочим, память свободная не завалялась? А то можно взять и просто сделать аккумулятор фазы бита на 32 и иметь ~0,01Гц разешение (см. теорию DDS лучше по datasheet на AD9854) . Хотя -90dB получишь где-то в районе 32к-точечной таблицы...
|
|
|
|
|
Apr 26 2006, 11:18
|
Местный
  
Группа: Участник
Сообщений: 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 поставить не проще?
|
|
|
|
|
Jun 15 2006, 07:02
|
Участник

Группа: Участник
Сообщений: 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-битные).
|
|
|
|
|
Jun 15 2006, 08:16
|

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

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

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

|
Дык производная ж - тот самый синус: sin'(x) = cos(x) = sin(x+pi/2). И про интегрирование не понял, как его делать? Каждый новый отсчет в копилку класть? Тогда быстро за пару десятков периодов набежит ошибка.
|
|
|
|
|
Jun 22 2006, 19:08
|
Частый гость
 
Группа: Участник
Сообщений: 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 без дизеринга).
|
|
|
|
|
Jun 22 2006, 20:36
|
Частый гость
 
Группа: Участник
Сообщений: 128
Регистрация: 7-06-06
Пользователь №: 17 825

|
Цитата(GetSmart @ Jun 23 2006, 00:01)  Подскажите кто-нибудь сколько я насчитал децибелл. Составил прогу на паскале с линейной интерполяцией синуса по таблице 256*16 бит. Максимальное отклонение по центру между колонками составило 3.1e-6 относительно самого синуса (+-1.0). Странно. При ширине выхода таблицы 16бит, максимальное отклонение от "истинного" синуса должно было быть порядка 1.5e-5. Или в программе что-то не то, или я не правильно понял, что такое "Максимальное отклонение по центру между колонками"  . При отклонении от "идеального" синуса на 3.1e-6, SFDR даже в самом поганом случае (вся "энергия" отклонения "ушла" в один спур), думаю, будет ниже -110dBc.
|
|
|
|
|
Jun 22 2006, 20:45
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jun 22 2006, 21:27
|
Частый гость
 
Группа: Участник
Сообщений: 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 - максимальное отклонение от "идеального" синуса.
|
|
|
|
|
Sep 4 2006, 06:30
|

Группа: Новичок
Сообщений: 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. Получил комплексные числа. Потом подумал...  Четверть периода - это pi/2? т.е. ~1.57 радиан. Таким образом, под корнем имеем отрицательные числа. Да и сигнал на синус не похож абсолютно, втыкается под прямым углом в ось абсцисс, по науке д.б. 45 градусов.
|
|
|
|
|
Sep 6 2006, 14:07
|

Частый гость
 
Группа: Свой
Сообщений: 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 А есть ли ещё что-нибудь в этом же духе, т.е. в виде справочника по разным методам, алгоритмам и прочее?
|
|
|
|
|
Sep 8 2006, 18:28
|
Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 27-07-06
Пользователь №: 19 147

|
Пояснение В автономном уравнении dx/dt=w [A·(1-x^2)^0.5]. Четверть периода - это abs(wt)< pi/2?. Для большей наглядности прикрепляю рисунок
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|