|
Как реализовать генератор квадратуры, Надо генерировать cos/sin одинаковой чатоты в DSP |
|
|
|
Dec 10 2014, 15:43
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371

|
Всем привет! Вот есть задача - генерировать квадратурный сигнал для DDC. DDC сам реализован внутри DSP, поэтому надо алгоритм чтобы его можно было-бы реализвать потом на аасемблере. Используется плавующая точка. В идеальном случае ф-я должна выглядеть так: result = GenSinCos(float freq); где result это структура содержащая Cos и Sin, т.е. сигналы сдвинуты на 90 градусов. freq - 0...1. Ф-я вызывается для каждого отсчета. Начальная фаза в общем не очень важна. Главное чтобы 90 градусов было. По идее это даже не ф-я а макрос. Как-то так. Может кто уже встречал подобное? Или может уже есть готовые решения? Особенность в том, что наверняка есть решение которое не вызывает ф-ю sin и cos каждый раз.  Спасибо! PS. Табличный метод не предлагать!
Сообщение отредактировал Russky - Dec 10 2014, 15:56
|
|
|
|
|
 |
Ответов
|
Dec 15 2014, 16:42
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 15 2014, 17:57
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Dec 15 2014, 21:45
|
Знающий
   
Группа: Участник
Сообщений: 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ну и конечно, все расползается.
|
|
|
|
|
Dec 15 2014, 23:46
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата(Fat Robot @ Dec 16 2014, 01:53)  Вы сами себе противоречите: Чтобы генератор был "абсолютно стабилен", полюсы его передаточной функции должны находиться точно на единичной окружности. А для любой частоты при арифметике с конечной разрядностью это, увы, не выполняется. увы, тока это и выполняется вне зависимости от разрядности. в случае биквадратного звена только результат после умножения на а1 квантуется. шум квантования есть вход для фильтра с полюсами на единичной окружности. т е неустойчивого фильтра. результат закономерен.
|
|
|
|
|
Dec 16 2014, 08:31
|
ʕʘ̅͜ʘ̅ʔ
    
Группа: Свой
Сообщений: 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, почему же он не развалился раз он не устойчивый?
|
|
|
|
|
Dec 16 2014, 08:56
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Dec 16 2014, 11:55
|
ʕʘ̅͜ʘ̅ʔ
    
Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691

|
Конечно. Даже в вашем простом примере в диапазоне частот (К=1..511) амплитуда на выходе меняется на 4 разряда или в 16 раз. Если отсчеты и коэффициенты принять 16 разрядными, то изменение амплитуды в зависимости от частоты будет уже в пределах 8 разрядов. Попытки как-то ограничить разрядность умножителя будут приводить к описываемым эффектам. То, что при полной разрядности арифметических блоков генератор будет стабилен, мы обсудили. Зависимость амплитуды от частоты я уже даже за недостаток не считаю. Цитата(_pv @ Dec 16 2014, 10:49)  давайте поможем друг другу, Вы мне расскажете как правильно printf пользоваться, а я Вам - чем арфиметика с плавающей запятой от целочисленной отличается. а потом вернёмся к вопросам устойчивости.
|
|
|
|
|
Dec 16 2014, 12: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ом то что не так?
|
|
|
|
Сообщений в этой теме
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     _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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|