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

 
 
> Как реализовать генератор квадратуры, Надо генерировать cos/sin одинаковой чатоты в DSP
Russky
сообщение Dec 10 2014, 15:43
Сообщение #1


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

Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371



Всем привет!
Вот есть задача - генерировать квадратурный сигнал для DDC. DDC сам реализован внутри DSP, поэтому надо алгоритм чтобы его можно было-бы реализвать потом на аасемблере.
Используется плавующая точка.
В идеальном случае ф-я должна выглядеть так:
result = GenSinCos(float freq); где result это структура содержащая Cos и Sin, т.е. сигналы сдвинуты на 90 градусов.
freq - 0...1.
Ф-я вызывается для каждого отсчета. Начальная фаза в общем не очень важна. Главное чтобы 90 градусов было. По идее это даже не ф-я а макрос.
Как-то так.
Может кто уже встречал подобное? Или может уже есть готовые решения?

Особенность в том, что наверняка есть решение которое не вызывает ф-ю sin и cos каждый раз. sm.gif

Спасибо!

PS. Табличный метод не предлагать! sm.gif


Сообщение отредактировал Russky - Dec 10 2014, 15:56
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
amaora
сообщение Dec 15 2014, 16:42
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778



Умножать на матрицу поворота и нормировать на каждом такте. Для низких частот можно упростить считая, что sin(x) ~ x, cos(x) ~ 1. Можно не упрощать, если частота фиксированная то sin/cos считаются один раз.

Код
pm->tA.re += -pm->tA.im * pm->tD.im;
pm->tA.im += pm->tA.re * pm->tD.im;

L = (3.f - pm->tA.re * pm->tA.re - pm->tA.im * pm->tA.im) * .5f;
pm->tA.re *= L;
pm->tA.im *= L;


Сообщение отредактировал amaora - Dec 15 2014, 16:43
Go to the top of the page
 
+Quote Post
_pv
сообщение Dec 15 2014, 17:57
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(amaora @ Dec 15 2014, 22:42) *
Умножать на матрицу поворота и нормировать на каждом такте.

так ошибка будет накапливаться.
по сравнению с вариантом от blackfin, можно еще одно умножение сэкономить если Sin[n+1] выразить через Sin[n] и Sin[n-1].
Sin[n+1] = Sin[n]*K - Sin[n-1];
да и со стабильностью вроде будет получше, не?
в целых числах если считать, то вообще ничего никуда не расползается, а с ошибками округления floatов - не знаю.

http://web.archive.org/web/20120308235958/...ors.html#Second Order Oscillator
Go to the top of the page
 
+Quote Post
thermit
сообщение Dec 15 2014, 21:45
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата(_pv @ Dec 15 2014, 20:57) *
так ошибка будет накапливаться.
по сравнению с вариантом от blackfin, можно еще одно умножение сэкономить если Sin[n+1] выразить через Sin[n] и Sin[n-1].
Sin[n+1] = Sin[n]*K - Sin[n-1];
да и со стабильностью вроде будет получше, не?
в целых числах если считать, то вообще ничего никуда не расползается, а с ошибками округления floatов - не знаю.

http://web.archive.org/web/20120308235958/...ors.html#Second Order Oscillator


гы, да ладно...
http://electronix.ru/forum/index.php?s=&am...t&p=1298367

ну и конечно, все расползается.

Go to the top of the page
 
+Quote Post
_pv
сообщение Dec 15 2014, 22:31
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(thermit @ Dec 16 2014, 03:45) *

чукча - не читатель, чукча - писатель.
Цитата(thermit @ Dec 16 2014, 03:45) *
ну и конечно, все расползается.

школьно-тригонометрический - да, а вот осциллятор второго порядка вроде как абсолютно стабильный должен быть с целочисленной арифметикой.
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Dec 15 2014, 22:53
Сообщение #6


ʕʘ̅͜ʘ̅ʔ
*****

Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691



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

Цитата(_pv @ Dec 15 2014, 23:31) *
вроде как
должен быть
с целочисленной арифметикой
Go to the top of the page
 
+Quote Post
thermit
сообщение Dec 15 2014, 23:46
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата(Fat Robot @ Dec 16 2014, 01:53) *
Вы сами себе противоречите: Чтобы генератор был "абсолютно стабилен", полюсы его передаточной функции должны находиться точно на единичной окружности. А для любой частоты при арифметике с конечной разрядностью это, увы, не выполняется.


увы, тока это и выполняется вне зависимости от разрядности.
в случае биквадратного звена только результат после умножения на а1 квантуется. шум квантования есть вход для фильтра с полюсами на единичной окружности. т е неустойчивого фильтра. результат закономерен.
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Dec 16 2014, 08:31
Сообщение #8


ʕʘ̅͜ʘ̅ʔ
*****

Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691



Я посчитал. Устойчивость действительного генератора определяется только шумами квантования отсчетов,
в отличие от комплексного, где и квантованные отсчеты, и квантованные коэффициенты играют роль.

Цитата(thermit @ Dec 16 2014, 00:46) *
увы, тока это и выполняется вне зависимости от разрядности.


Хороший пример. Много подтверждает (limit cycles при единственном значении коэффициента).

Попробуйте так:
К = 45 * pi * pi;

Цитата(_pv @ Dec 16 2014, 09:11) *
с целочисленной арифметикой можно точно в желаемую частоту и амплитуду не попасть, но осциллятор будет стабильным сколь угодно долго.


int a0, a1 = 0, a2 = 100, K=450;
for (int i = 0; i < 1000; i++){
a0 = (K*a1)/256 - a2;
a2 = a1;
a1 = a0;
printf("%d\n",a0);
}
через 765*N шагов, значения a0,a1,a2 опять станут -100, 0, 100, почему же он не развалился раз он не устойчивый?
Go to the top of the page
 
+Quote Post
_pv
сообщение Dec 16 2014, 08:56
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(Fat Robot @ Dec 16 2014, 14:31) *
Хороший пример. Много подтверждает (limit cycles при единственном значении коэффициента).
Попробуйте так:
К = 45 * pi * pi;

а как же: "А для любой частоты при арифметике с конечной разрядностью это, увы, не выполняется." ?

45*pi*pi = 444
арифметика-то целая, в частоту немного не попадёт из-за округления, но работать будет стабильно:
0
100
173
200
173
100
0
-100
-173
-200
-173
-100
0
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Dec 16 2014, 09:30
Сообщение #10


ʕʘ̅͜ʘ̅ʔ
*****

Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691



.
Go to the top of the page
 
+Quote Post
_pv
сообщение Dec 16 2014, 09:49
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(Fat Robot @ Dec 16 2014, 15:30) *
Вам бы функцией printf научиться пользоваться.
Начните с "Hello world!"
Успехов

давайте поможем друг другу, Вы мне расскажете как правильно printf пользоваться, а я Вам - чем арфиметика с плавающей запятой от целочисленной отличается.
а потом вернёмся к вопросам устойчивости.
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Dec 16 2014, 11:55
Сообщение #12


ʕʘ̅͜ʘ̅ʔ
*****

Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691



Конечно. Даже в вашем простом примере в диапазоне частот (К=1..511) амплитуда на выходе меняется на 4 разряда или в 16 раз.
Если отсчеты и коэффициенты принять 16 разрядными, то изменение амплитуды в зависимости от частоты будет уже в пределах 8 разрядов. Попытки как-то ограничить разрядность умножителя будут приводить к описываемым эффектам. То, что при полной разрядности арифметических блоков генератор будет стабилен, мы обсудили.

Зависимость амплитуды от частоты я уже даже за недостаток не считаю.

Цитата(_pv @ Dec 16 2014, 10:49) *
давайте поможем друг другу, Вы мне расскажете как правильно printf пользоваться, а я Вам - чем арфиметика с плавающей запятой от целочисленной отличается.
а потом вернёмся к вопросам устойчивости.
Go to the top of the page
 
+Quote Post
_pv
сообщение Dec 16 2014, 12:13
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(Fat Robot @ Dec 16 2014, 17:55) *
Конечно. Даже в вашем простом примере в диапазоне частот (К=1..511) амплитуда на выходе меняется на 4 разряда или в 16 раз.
Если отсчеты и коэффициенты принять 16 разрядными, то изменение амплитуды в зависимости от частоты будет уже в пределах 8 разрядов. Попытки как-то ограничить разрядность умножителя будут приводить к описываемым эффектам. То, что при полной разрядности арифметических блоков генератор будет стабилен, мы обсудили.

Амплитуда определяется начальными значениями a1 и a2, а не только K который задаёт частоту. и соответственно амплитуду можно сделать какой угодно, так что замечание вообще мимо.
что такое полная разрядность? вот выше пример при 9х9->(18 с округлением до 10) разряном умножении, он как, нестабилен?
давайте до 4х разрядов ограничим
int a0, a1 = 0, a2 = 10, K=12;
...
a0 = (K*a1)/16 - a2;
работать он от этого не перестанет.

зы с printfом то что не так?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Russky   Как реализовать генератор квадратуры   Dec 10 2014, 15:43
- - Lmx2315   QUOTE (Russky @ Dec 10 2014, 18:43) Особе...   Dec 10 2014, 17:00
- - des00   Цитата(Russky @ Dec 10 2014, 22:43) Особе...   Dec 10 2014, 17:43
|- - Fat Robot   Это прекрасно!! хороший синус. будет всегд...   Dec 10 2014, 17:54
|- - des00   Цитата(Fat Robot @ Dec 11 2014, 01:54) Эт...   Dec 10 2014, 18:53
|- - andyp   Цитата(Fat Robot @ Dec 10 2014, 20:54) Чт...   Dec 11 2014, 14:06
- - thermit   c(n)=cos(2*pi*f0/sf*n) s(n)=k*c(n)+c(n-1)-k*s(n-1...   Dec 10 2014, 18:17
- - blackfin   Цитата(Fat Robot @ Dec 10 2014, 21:54) Эт...   Dec 10 2014, 18:29
- - ViKo   Ну, конечно, CORDIC. Какие могут быть сомнения?...   Dec 10 2014, 19:33
|- - Fat Robot   На вычислительных платформах, на которых цена унож...   Dec 10 2014, 20:35
- - Russky   Поясню. Есть методы генерирования синусоидально си...   Dec 11 2014, 11:53
|- - blackfin   Цитата(Russky @ Dec 11 2014, 14:53) Но в ...   Dec 11 2014, 12:48
|- - Russky   Цитата(blackfin @ Dec 11 2014, 16:48) Шко...   Dec 11 2014, 18:34
|- - thermit   Цитата(Russky @ Dec 11 2014, 21:34) Спаси...   Dec 11 2014, 20:59
|- - blackfin   Цитата(thermit @ Dec 11 2014, 23:59) кто/...   Dec 12 2014, 02:22
||- - thermit   Цитата(blackfin @ Dec 12 2014, 05:22) А в...   Dec 12 2014, 06:32
|- - Fat Robot   Как вы оцениваете, при таком подходе через сколько...   Dec 12 2014, 10:35
|- - thermit   Цитата(Fat Robot @ Dec 12 2014, 14:35) Ка...   Dec 12 2014, 11:11
|- - andyp   Цитата(thermit @ Dec 12 2014, 14:11) А дл...   Dec 12 2014, 11:39
|- - Russky   Цитата(thermit @ Dec 12 2014, 15:11) Ника...   Dec 15 2014, 14:07
|- - Fat Robot   грустный смайлик.. Цитата(Russky @ Dec 15 20...   Dec 15 2014, 14:51
|- - thermit   Цитата(Russky @ Dec 15 2014, 18:07) Тогда...   Dec 15 2014, 14:59
|- - blackfin   Цитата(Russky @ Dec 15 2014, 18:07) Т.е. ...   Dec 15 2014, 15:12
|- - Russky   Цитата(blackfin @ Dec 15 2014, 19:12) И н...   Dec 15 2014, 16:31
- - stealth-coder   Цитата(Fat Robot @ Dec 11 2014, 00:35) На...   Dec 11 2014, 20:30
|- - Fat Robot   Тут всё на веру, конечно. Не ставя под сомнение кв...   Dec 11 2014, 20:53
- - stealth-coder   Цитата(Fat Robot @ Dec 12 2014, 00:53) Ту...   Dec 11 2014, 21:09
|- - thermit   Цитата(_pv @ Dec 16 2014, 01:31) чукча - ...   Dec 15 2014, 22:50
||- - Fat Robot   .   Dec 16 2014, 09:30
|- - _pv   Цитата(Fat Robot @ Dec 16 2014, 04:53) Вы...   Dec 16 2014, 08:11
|- - thermit   Цитата(_pv @ Dec 16 2014, 12:11) с целочи...   Dec 16 2014, 11:36
|- - _pv   Цитата(thermit @ Dec 16 2014, 17:36) а он...   Dec 16 2014, 11:55
|- - thermit   Цитата(_pv @ Dec 16 2014, 15:55) а что же...   Dec 16 2014, 13:05
|- - _pv   Цитата(thermit @ Dec 16 2014, 19:05) Да. ...   Dec 16 2014, 13:20
- - amaora   Если элементы матрицы поворота посчитать как насто...   Dec 16 2014, 10:58
|- - _pv   Цитата(amaora @ Dec 16 2014, 16:58) Если ...   Dec 16 2014, 11:05
|- - amaora   Цитата(_pv @ Dec 16 2014, 14:05) расползё...   Dec 16 2014, 11:33
- - Russky   Что-то мы скатились на обсуждение ерунды. Ситуаци...   Dec 16 2014, 11:08
|- - _pv   Цитата(Russky @ Dec 16 2014, 17:08) В общ...   Dec 16 2014, 11:25
|- - Russky   Цитата(_pv @ Dec 16 2014, 15:25) генерато...   Dec 16 2014, 12:22
|- - andyp   Цитата(Russky @ Dec 16 2014, 15:22) Нет. ...   Dec 16 2014, 16:12
- - mihalevski   Цитата(Russky @ Dec 10 2014, 22:43) Всем ...   Jan 6 2015, 14:18


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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 02:40
Рейтинг@Mail.ru


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