|
|
  |
Как реализовать генератор квадратуры, Надо генерировать cos/sin одинаковой чатоты в DSP |
|
|
|
Dec 11 2014, 20:59
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата(Russky @ Dec 11 2014, 21:34)  Спасибо. Надо попробовать. Как попробую - напишу. Пока все выглядет очень даже ничего!  кто/что мешает генерить синус-косинус двумя параллельными биквадратными звеньями? начальная фаза целиком и прлностью определяется начальными условиями звеньев. умножений в 2 раза меньше чем в школьнотригонометрическом методе.
|
|
|
|
|
Dec 11 2014, 21:09
|
Частый гость
 
Группа: Участник
Сообщений: 112
Регистрация: 27-12-08
Пользователь №: 42 786

|
Цитата(Fat Robot @ Dec 12 2014, 00:53)  Тут всё на веру, конечно. Не ставя под сомнение квалификацию. Но вот здесь http://www.opensource.apple.com/source/Lib...ce/Intel/atan.cза где-то 15 умножений и 15 сложений получается точность double для atan. Там есть страшная вещь - зависимость по данным, которая рушит конвейер, от нее не уйти и сходу просаживается производительность (в случае TigerSHARC) минимум в 2 раза, возможности SIMD при использовании плавающей точки ограничены, использование фиксированной точки для реализации приведенного алгоритма сомнительно, т.к., скорее всего, очень быстро накопится достаточно большая ошибка. Ну и в приведенной реализации нет операции деления Im / Re, что в случае DSP, как правило, делается каким-нибудь Ньютоном-Рафсоном, CORDIC же позволяет не выполнять деление.
|
|
|
|
|
Dec 12 2014, 10:35
|
ʕʘ̅͜ʘ̅ʔ
    
Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691

|
Как вы оцениваете, при таком подходе через сколько сгенерированных отсчетов существенно изменятся амплитуды квадратур (+/- 10% разность или каждая) и/или разность их фаз (pi/20)? За счет округлений. Все операции, например, соответствуют 754 float. Я полагаю, что за пару часов при 10 MSPS и при 1 MHz на выходе от квадратур в таком генераторе уже ничего не останется. Цитата(thermit @ Dec 11 2014, 21:59)  кто/что мешает генерить синус-косинус двумя параллельными биквадратными звеньями? начальная фаза целиком и прлностью определяется начальными условиями звеньев. умножений в 2 раза меньше чем в школьнотригонометрическом методе.
|
|
|
|
|
Dec 12 2014, 11:11
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата(Fat Robot @ Dec 12 2014, 14:35)  Как вы оцениваете, при таком подходе через сколько сгенерированных отсчетов существенно изменятся амплитуды квадратур (+/- 10% разность или каждая) и/или разность фаз (pi/20)? За счет округлений.
Все операции, например, соответствуют 754 float.
Я полагаю, что за пару часов при 10 MSPS и при 1 MHz на выходе от квадратур в таком генераторе уже ничего не останется. Никак не оцениваю, ибо оценка качества таких генераторов и необходимость периодического сброса сводит все их прелести почти к 0. Это тс фанатеет рекурсиями, которые на конечной разрядности дают рост ошибок. А для меня полиномы/кордики рулят.
|
|
|
|
|
Dec 12 2014, 11:39
|
Местный
  
Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163

|
Цитата(thermit @ Dec 12 2014, 14:11)  А для меня полиномы/кордики рулят. LUT с линейной интерполяцией - наше все  Ну и всякие навороты типа noise shaping или phase dithering, если охота шибко умным побыть.
|
|
|
|
|
Dec 15 2014, 14:07
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371

|
Цитата(thermit @ Dec 12 2014, 15:11)  Никак не оцениваю, ибо оценка качества таких генераторов и необходимость периодического сброса сводит все их прелести почти к 0. Это тс фанатеет рекурсиями, которые на конечной разрядности дают рост ошибок. А для меня полиномы/кордики рулят. Тогда у-ж лучще табличным методом генерить. Там вообще никаких ни шумов, ни ошибок, и выполняется за 1 такт.  PS. Кстати, а вот и ответ: генератор делается на основе формулы предложенной Blackfinом и таблицей. Т.е. если у меня в потоке обрабатывается по 128 отсчетов, то все что мне нужно это каждый раз инициализировать значение синуса и косинуса, значениями из таблицы, а потом считать рекурсию на 128 отсчетов. И так далее.
Сообщение отредактировал Russky - Dec 15 2014, 14:11
|
|
|
|
|
Dec 15 2014, 16:31
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 17-11-11
Пользователь №: 68 371

|
Цитата(blackfin @ Dec 15 2014, 19:12)  И нужно помнить, что ошибки амплитуды и фазы будут расти примерно как: sqrt(N)*0.5 [LSB] = sqrt(128)*0.5 [LSB] ~= 5.7 [LSB]. Так что на последних отсчетах три младших разряда в амплитуде и фазе могут быть неверными.  У меня плавучка. Там немного подругому. Но в любом случае 128 отсчетов это не так много даже для 24 бит фиксированной точки. Но при этом есть возможность увеличить разрешающую способность генератора в 128 раз, или 128*K, где K - может быть и больше. В итоге мы получим разрешающую способность - N*M, где N - длина таблицы, а M - количество отсчетов генератора. Круто короче. В общем надо пробовать реализвать.  В любом случае - спасибо! Я как-то сразу сам не додумался до этого. Это тот редкий случай когда обсуждение на форуме приводит к рождению нового эффективного алгоритма.
|
|
|
|
|
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ну и конечно, все расползается.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|