Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Целочисленные алгоритмы ЦОС
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Zelepuk
Существует рабочий алгоритм(несколько фильтров и БПФ). Код работает на плавучке на обычном десктопе.
Стоит задача портировать алгоритм на процессор с фиксированой точкой.
Отсчёты, над которыми производятся преобразования, поступают в формате 1.15.
Понимаю что тупое преобразование float в int ни к чему хорошему не приведёт.
Тогда стоит вопрос: какие требования к оперрациям нужно предъявить?

Коэффиценты фильтров и БПФ должны быть тоже в 1.15?
Как производить умножение, деление, суммирование и вычитание, чтобы избегать переполнений?

(лучше если примеры коротенькие на С будут)

Используется 32-битный процессор на ARM9E ядре

Заранее спасибо.

_Anatoliy
Цитата(Zelepuk @ Mar 6 2011, 09:22) *


Это из модели симулинка?Посмотрите здесь,очень подробно всё расказано.
видео
Zelepuk
Познавательное видео.

Но хотелось бы писать всё самуму руками. А тут получается вставил блок, нажал кнопочку и всё....
Причём код получается не очень читаемый...

Интересуют принципы.

Иными словами нужно перевести все float в программе в int (в крайнем случае long).
Какие могут быть общие рекомендации для таких задач? Как обезопасить код от переполнений при переходе на "фиксированую точку"?

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

Микроконтроллер 32 битный.
alexPec
Цитата(Zelepuk @ Mar 7 2011, 09:30) *
Познавательное видео.

Но хотелось бы писать всё самуму руками. А тут получается вставил блок, нажал кнопочку и всё....
Причём код получается не очень читаемый...

Интересуют принципы.

Иными словами нужно перевести все float в программе в int (в крайнем случае long).
Какие могут быть общие рекомендации для таких задач? Как обезопасить код от переполнений при переходе на "фиксированую точку"?

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

Микроконтроллер 32 битный.


Переполнение по-моему при такой задаче только аналитически оценить. Ну или попроще: сделать модель в матлабе, подать туда реальные даннные, посмотреть значения, умножить их на 4 (для запаса) и исходя из этого выбрать разрядность.
То что отсчеты в 1,15 раз больше по-моему не должно влиять на коэффициенты. Просто выход будет увеличен в 1,15 раз. У фильтра например коэффициенты на форму АЧХ/ФЧХ влияют.
А вот с дробной частью сложнее - надо Вам оценить какая точность фурье (фильтров) требуется. Например если требуется с точностью до 1 вычислять - забыть про дробную часть, просто перевести на фиксированную точку и все. А например если нужна точность 0,01 - то это одна сотая, ближайшее меньшее значение получается 1/2^7 = 1/128 = 0,0078125. Это означает, что под дробну часть нужно отвести 7 бит. Но это на выходе, а внутреняя арифметика будет зависеть от реализации, и надо исходить из выходной точности.
Да, и дробные коэффициенты также реализуются - оцениваете требуемую точность коэффициента, умножаете число на коэффициент и на выходе результат сдвагаете на кол-во знаков дробной части. Например нужно умножить число а= 239 на коэффициент 0,71 с точностью не хуже 0,01 (имеется ввиду в данном случае точность коэффициента а не результата). Получаем что при 7 битах дробной части (точность 0,007) 0,71 в таком формате будет 0,71/0,0078125 =90,7 = 91. Умножаем а*90 = 239*90=21749 результат сдвигаем на 7 бит (делим на 128) получаем 21749/128=169,91... Дробную часть отбрасываем получаем 169. Проверяем: 239*0,71 = 169,69.
Оценить влияние квантования коэффициентов фильтров можно в матлабе, специально для этого там есть fdatool. Там можно указать сколько бить под дробную часть, сколько под целую и много чего еще.
diwil
Цитата(Zelepuk @ Mar 7 2011, 09:30) *
Иными словами нужно перевести все float в программе в int (в крайнем случае long).
Какие могут быть общие рекомендации для таких задач? Как обезопасить код от переполнений при переходе на "фиксированую точку"?

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

Микроконтроллер 32 битный.


1. float->int:
q_1_15 = (int)(flt * 32767);
код не обезопасить - или насыщение делать, или увеличивать разрядность.

2. и да и нет. Зависит от реализации умножения и формата всего остального.

я где-то постил здесь реализацию БПФ. кстати, написанную специально оптимально для АРМа (на Це. ассемблерная - за пиво sm.gif) и, кстати, данные с коэффициентами в формате 1.15 sm.gif Все целочисленное. Поиск должен помочь.
Zelepuk
Цитата(alexPec @ Mar 7 2011, 13:07) *
Переполнение по-моему при такой задаче только аналитически оценить. Ну или попроще: сделать модель в матлабе, подать туда реальные даннные, посмотреть значения, умножить их на 4 (для запаса) и исходя из этого выбрать разрядность.
То что отсчеты в 1,15 раз больше по-моему не должно влиять на коэффициенты. Просто выход будет увеличен в 1,15 раз. У фильтра например коэффициенты на форму АЧХ/ФЧХ влияют.
А вот с дробной частью сложнее - надо Вам оценить какая точность фурье (фильтров) требуется. Например если требуется с точностью до 1 вычислять - забыть про дробную часть, просто перевести на фиксированную точку и все. А например если нужна точность 0,01 - то это одна сотая, ближайшее меньшее значение получается 1/2^7 = 1/128 = 0,0078125. Это означает, что под дробну часть нужно отвести 7 бит. Но это на выходе, а внутреняя арифметика будет зависеть от реализации, и надо исходить из выходной точности.
Да, и дробные коэффициенты также реализуются - оцениваете требуемую точность коэффициента, умножаете число на коэффициент и на выходе результат сдвагаете на кол-во знаков дробной части. Например нужно умножить число а= 239 на коэффициент 0,71 с точностью не хуже 0,01 (имеется ввиду в данном случае точность коэффициента а не результата). Получаем что при 7 битах дробной части (точность 0,007) 0,71 в таком формате будет 0,71/0,0078125 =90,7 = 91. Умножаем а*90 = 239*90=21749 результат сдвигаем на 7 бит (делим на 128) получаем 21749/128=169,91... Дробную часть отбрасываем получаем 169. Проверяем: 239*0,71 = 169,69.
Оценить влияние квантования коэффициентов фильтров можно в матлабе, специально для этого там есть fdatool. Там можно указать сколько бить под дробную часть, сколько под целую и много чего еще.


какие ещё 1.15 раза? 1-количество бит целой части, 15 - количество бит дробной части...
это так, для справки.
______________________________________________________________________________

когда мы перемножаем например два числа в формате 1.15, то получаем число в формате 2.30. Что с ним надо сделать чтобы в дальнейшем переполниий избежать.
Иначе гвооря интересуют "трюки целочисленных вычислений на С"

На ассемблере у меня реализация БПФ есть для моего проца.
Хлчется вкуритсь "трюки" на С чтобы всё что угодно писать... (КИХ, БИХ фильтрацию...)
alexPec
Цитата(Zelepuk @ Mar 7 2011, 16:38) *
когда мы перемножаем например два числа в формате 1.15, то получаем число в формате 2.30. Что с ним надо сделать чтобы в дальнейшем переполниий избежать.

А что с обычными числами делают, то и этими. Если вы уверены, что после умножения не будет переполнения - отбрасываете старший бит, если не уверены - наращивать разрядность; если вам не нужна точность 30 бит после умножения - отбрасываете младшие 15 (или округляете). Т.е если не будет переполнения и нужна точность 15 бит - отбрасываете старший и 15 младших бит и получаете результат в таком же формате.
Zelepuk
Цитата(diwil @ Mar 7 2011, 14:58) *
1. float->int:
q_1_15 = (int)(flt * 32767);
код не обезопасить - или насыщение делать, или увеличивать разрядность.

2. и да и нет. Зависит от реализации умножения и формата всего остального.

я где-то постил здесь реализацию БПФ. кстати, написанную специально оптимально для АРМа (на Це. ассемблерная - за пиво sm.gif) и, кстати, данные с коэффициентами в формате 1.15 sm.gif Все целочисленное. Поиск должен помочь.


Никак не могу найти вашу реализацию. Может дадите ссылку... интересует именно реализация на Си. Посмотреть принципы хочу... rolleyes.gif
PetrovichKR
Цитата
Хлчется вкуритсь "трюки" на С чтобы всё что угодно писать... (КИХ, БИХ фильтрацию...)

Реализация КИХ-фильтрации на архитектуре AVR. Числа в формате 1.1.14
Код
//Порядок НЦФ
#define N 22

//Сдвиг умножителей НЦФ
#define SHIFT 14

//Весовые коэффициенты НЦФ
#define FIR_COEFFS \
{\
    (int)(-0.02144952651096*16384),\
    (int)(-0.05675564761031*16384),\
    (int)(-0.00722412687546*16384),\
    (int)(-0.01824005662087*16384),\
    (int)( 0.00295576469554*16384),\
    (int)( 0.02091815981809*16384),\
    (int)( 0.04723483351816*16384),\
    (int)( 0.07439211184117*16384),\
    (int)( 0.10087221829014*16384),\
    (int)( 0.12272427450964*16384),\
    (int)( 0.13727372353230*16384),\
    (int)( 0.14230086051190*16384),\
    (int)( 0.13727372353230*16384),\
    (int)( 0.12272427450964*16384),\
    (int)( 0.10087221829014*16384),\
    (int)( 0.07439211184117*16384),\
    (int)( 0.04723483351816*16384),\
    (int)( 0.02091815981809*16384),\
    (int)( 0.00295576469554*16384),\
    (int)(-0.01824005662087*16384),\
    (int)(-0.00722412687546*16384),\
    (int)(-0.05675564761031*16384),\
}

typedef struct            //Сигнальная память с указателем
{
    int X[N];
    unsigned char offset;
}
memory;

//НЦФ без сдвига сигнальной памяти
int fir(int x, memory *mem)
{
    static const int h[N] PROGMEM = FIR_COEFFS;                        //Весовые коэффициенты
    int out = 0;                                                        //Выходная переменная
    int *X = mem->X;                                                    //Указатель на сигнальную память
    unsigned char offset = mem->offset;                                        //Смещение сигнальной памяти
    X[offset] = x;                                                        //Загрузка текущего отсчета в сигнальную память
    for(unsigned char i = 0, j = offset; i < N; i++, j++)                     //Цикл ДВС
    {
        out += (int) pgm_read_word(&h[i]) * ((long) X[j]) >> SHIFT;    //Операция умножения с накоплением
        if(j == N - 1) j = -1;                                            //Закольцовывание сигнальной памяти
    }
    mem->offset = offset? offset - 1: N - 1;                        //Сдвиг смещения сигнальной памяти
    return out;
}


Конкретно в цифровой фильтрации, исключение переполнений достигается путем масштабирования. Насчет БПФ не знаю.
diwil
Цитата(Zelepuk @ Mar 8 2011, 00:12) *
Никак не могу найти вашу реализацию. Может дадите ссылку... интересует именно реализация на Си. Посмотреть принципы хочу... rolleyes.gif



да, тоже не могу найти... странно... ну ладно, вот код -

Код
#ifndef __FFT_TWIDDLES_H__
#define __FFT_TWIDDLES_H__

#define FR2(x) (x*32767)

const int16_t
fft_twiddles_1024[] = {
/*N:1024,i: 0 */ FR2(+1.0000000000000000), FR2(+0.0000000000000000),
/*N:1024,i: 0 */ FR2(+1.0000000000000000), FR2(+0.0000000000000000),
/*N:1024,i: 0 */ FR2(+1.0000000000000000), FR2(+0.0000000000000000),
/*N:1024,i: 1 */ FR2(+0.9999247018391445), FR2(+0.0122715382857199),
/*N:1024,i: 1 */ FR2(+0.9999811752826011), FR2(+0.0061358846491545),
/*N:1024,i: 1 */ FR2(+0.9998305817958234), FR2(+0.0184067299058048),
/*N:1024,i: 2 */ FR2(+0.9996988186962043), FR2(+0.0245412285229123),
/*N:1024,i: 2 */ FR2(+0.9999247018391445), FR2(+0.0122715382857199),
/*N:1024,i: 2 */ FR2(+0.9993223845883495), FR2(+0.0368072229413588),
/*N:1024,i: 3 */ FR2(+0.9993223845883495), FR2(+0.0368072229413588),
/*N:1024,i: 3 */ FR2(+0.9998305817958234), FR2(+0.0184067299058048),
/*N:1024,i: 3 */ FR2(+0.9984755805732948), FR2(+0.0551952443496899),
/*N:1024,i: 4 */ FR2(+0.9987954562051724), FR2(+0.0490676743274180),
/*N:1024,i: 4 */ FR2(+0.9996988186962043), FR2(+0.0245412285229123),
/*N:1024,i: 4 */ FR2(+0.9972904566786902), FR2(+0.0735645635996674),
/*N:1024,i: 5 */ FR2(+0.9981181129001492), FR2(+0.0613207363022086),
/*N:1024,i: 5 */ FR2(+0.9995294175010931), FR2(+0.0306748031766366),
/*N:1024,i: 5 */ FR2(+0.9957674144676598), FR2(+0.0919089564971327),
/*N:1024,i: 6 */ FR2(+0.9972904566786902), FR2(+0.0735645635996674),
/*N:1024,i: 6 */ FR2(+0.9993223845883495), FR2(+0.0368072229413588),
/*N:1024,i: 6 */ FR2(+0.9939069700023561), FR2(+0.1102222072938831),
/*N:1024,i: 7 */ FR2(+0.9963126121827780), FR2(+0.0857973123444399),
/*N:1024,i: 7 */ FR2(+0.9990777277526454), FR2(+0.0429382569349408),
/*N:1024,i: 7 */ FR2(+0.9917097536690995), FR2(+0.1284981107937932),
/*N:1024,i: 8 */ FR2(+0.9951847266721969), FR2(+0.0980171403295606),
/*N:1024,i: 8 */ FR2(+0.9987954562051724), FR2(+0.0490676743274180),
/*N:1024,i: 8 */ FR2(+0.9891765099647810), FR2(+0.1467304744553618),
/*N:1024,i: 9 */ FR2(+0.9939069700023561), FR2(+0.1102222072938831),
/*N:1024,i: 9 */ FR2(+0.9984755805732948), FR2(+0.0551952443496899),
/*N:1024,i: 9 */ FR2(+0.9863080972445987), FR2(+0.1649131204899699),
/*N:1024,i:10 */ FR2(+0.9924795345987100), FR2(+0.1224106751992162),
/*N:1024,i:10 */ FR2(+0.9981181129001492), FR2(+0.0613207363022086),
/*N:1024,i:10 */ FR2(+0.9831054874312163), FR2(+0.1830398879551410),
/*N:1024,i:11 */ FR2(+0.9909026354277800), FR2(+0.1345807085071262),
/*N:1024,i:11 */ FR2(+0.9977230666441916), FR2(+0.0674439195636641),
/*N:1024,i:11 */ FR2(+0.9795697656854405), FR2(+0.2011046348420919),
/*N:1024,i:12 */ FR2(+0.9891765099647810), FR2(+0.1467304744553618),
/*N:1024,i:12 */ FR2(+0.9972904566786902), FR2(+0.0735645635996674),
/*N:1024,i:12 */ FR2(+0.9757021300385286), FR2(+0.2191012401568698),
/*N:1024,i:13 */ FR2(+0.9873014181578584), FR2(+0.1588581433338615),
/*N:1024,i:13 */ FR2(+0.9968202992911657), FR2(+0.0796824379714301),
/*N:1024,i:13 */ FR2(+0.9715038909862518), FR2(+0.2370236059943672),
/*N:1024,i:14 */ FR2(+0.9852776423889412), FR2(+0.1709618887603012),
/*N:1024,i:14 */ FR2(+0.9963126121827780), FR2(+0.0857973123444399),
/*N:1024,i:14 */ FR2(+0.9669764710448521), FR2(+0.2548656596045146),
/*N:1024,i:15 */ FR2(+0.9831054874312163), FR2(+0.1830398879551410),
/*N:1024,i:15 */ FR2(+0.9957674144676598), FR2(+0.0919089564971327),
/*N:1024,i:15 */ FR2(+0.9621214042690416), FR2(+0.2726213554499490),
/*N:1024,i:16 */ FR2(+0.9807852804032304), FR2(+0.1950903220161283),
/*N:1024,i:16 */ FR2(+0.9951847266721969), FR2(+0.0980171403295606),
/*N:1024,i:16 */ FR2(+0.9569403357322088), FR2(+0.2902846772544623),
/*N:1024,i:17 */ FR2(+0.9783173707196277), FR2(+0.2071113761922186),
/*N:1024,i:17 */ FR2(+0.9945645707342554), FR2(+0.1041216338720546),
/*N:1024,i:17 */ FR2(+0.9514350209690083), FR2(+0.3078496400415349),
/*N:1024,i:18 */ FR2(+0.9757021300385286), FR2(+0.2191012401568698),
/*N:1024,i:18 */ FR2(+0.9939069700023561), FR2(+0.1102222072938831),
/*N:1024,i:18 */ FR2(+0.9456073253805213), FR2(+0.3253102921622629),
/*N:1024,i:19 */ FR2(+0.9729399522055602), FR2(+0.2310581082806711),
/*N:1024,i:19 */ FR2(+0.9932119492347945), FR2(+0.1163186309119048),
/*N:1024,i:19 */ FR2(+0.9394592236021899), FR2(+0.3426607173119944),
/*N:1024,i:20 */ FR2(+0.9700312531945440), FR2(+0.2429801799032639),
/*N:1024,i:20 */ FR2(+0.9924795345987100), FR2(+0.1224106751992162),
/*N:1024,i:20 */ FR2(+0.9329927988347390), FR2(+0.3598950365349881),
/*N:1024,i:21 */ FR2(+0.9669764710448521), FR2(+0.2548656596045146),
/*N:1024,i:21 */ FR2(+0.9917097536690995), FR2(+0.1284981107937932),
/*N:1024,i:21 */ FR2(+0.9262102421383114), FR2(+0.3770074102164183),
/*N:1024,i:22 */ FR2(+0.9637760657954398), FR2(+0.2667127574748984),
/*N:1024,i:22 */ FR2(+0.9909026354277800), FR2(+0.1345807085071262),
/*N:1024,i:22 */ FR2(+0.9191138516900578), FR2(+0.3939920400610481),
/*N:1024,i:23 */ FR2(+0.9604305194155658), FR2(+0.2785196893850531),
/*N:1024,i:23 */ FR2(+0.9900582102622971), FR2(+0.1406582393328492),
/*N:1024,i:23 */ FR2(+0.9117060320054299), FR2(+0.4108431710579039),
/*N:1024,i:24 */ FR2(+0.9569403357322088), FR2(+0.2902846772544623),
/*N:1024,i:24 */ FR2(+0.9891765099647810), FR2(+0.1467304744553618),
/*N:1024,i:24 */ FR2(+0.9039892931234433), FR2(+0.4275550934302821),
/*N:1024,i:25 */ FR2(+0.9533060403541939), FR2(+0.3020059493192281),
/*N:1024,i:25 */ FR2(+0.9882575677307495), FR2(+0.1527971852584434),
/*N:1024,i:25 */ FR2(+0.8959662497561852), FR2(+0.4441221445704292),
/*N:1024,i:26 */ FR2(+0.9495281805930367), FR2(+0.3136817403988915),
/*N:1024,i:26 */ FR2(+0.9873014181578584), FR2(+0.1588581433338615),
/*N:1024,i:26 */ FR2(+0.8876396204028539), FR2(+0.4605387109582400),
/*N:1024,i:27 */ FR2(+0.9456073253805213), FR2(+0.3253102921622629),
/*N:1024,i:27 */ FR2(+0.9863080972445987), FR2(+0.1649131204899699),
/*N:1024,i:27 */ FR2(+0.8790122264286335), FR2(+0.4767992300633221),
/*N:1024,i:28 */ FR2(+0.9415440651830208), FR2(+0.3368898533922201),
/*N:1024,i:28 */ FR2(+0.9852776423889412), FR2(+0.1709618887603012),
/*N:1024,i:28 */ FR2(+0.8700869911087115), FR2(+0.4928981922297840),
/*N:1024,i:29 */ FR2(+0.9373390119125750), FR2(+0.3484186802494346),
/*N:1024,i:29 */ FR2(+0.9842100923869290), FR2(+0.1770042204121488),
/*N:1024,i:29 */ FR2(+0.8608669386377673), FR2(+0.5088301425431070),
/*N:1024,i:30 */ FR2(+0.9329927988347390), FR2(+0.3598950365349881),
/*N:1024,i:30 */ FR2(+0.9831054874312163), FR2(+0.1830398879551410),
/*N:1024,i:30 */ FR2(+0.8513551931052652), FR2(+0.5245896826784690),
/*N:1024,i:31 */ FR2(+0.9285060804732156), FR2(+0.3713171939518375),
/*N:1024,i:31 */ FR2(+0.9819638691095552), FR2(+0.1890686641498062),
/*N:1024,i:31 */ FR2(+0.8415549774368984), FR2(+0.5401714727298929),
/*N:1024,i:32 */ FR2(+0.9238795325112867), FR2(+0.3826834323650898),
/*N:1024,i:32 */ FR2(+0.9807852804032304), FR2(+0.1950903220161283),
/*N:1024,i:32 */ FR2(+0.8314696123025452), FR2(+0.5555702330196022),
/*N:1024,i:33 */ FR2(+0.9191138516900578), FR2(+0.3939920400610481),
/*N:1024,i:33 */ FR2(+0.9795697656854405), FR2(+0.2011046348420919),
/*N:1024,i:33 */ FR2(+0.8211025149911047), FR2(+0.5707807458869673),
/*N:1024,i:34 */ FR2(+0.9142097557035307), FR2(+0.4052413140049899),
/*N:1024,i:34 */ FR2(+0.9783173707196277), FR2(+0.2071113761922186),
/*N:1024,i:34 */ FR2(+0.8104571982525948), FR2(+0.5857978574564389),
/*N:1024,i:35 */ FR2(+0.9091679830905224), FR2(+0.4164295600976372),
/*N:1024,i:35 */ FR2(+0.9770281426577544), FR2(+0.2131103199160914),
/*N:1024,i:35 */ FR2(+0.7995372691079050), FR2(+0.6006164793838690),
/*N:1024,i:36 */ FR2(+0.9039892931234433), FR2(+0.4275550934302821),
/*N:1024,i:36 */ FR2(+0.9757021300385286), FR2(+0.2191012401568698),
/*N:1024,i:36 */ FR2(+0.7883464276266063), FR2(+0.6152315905806268),
/*N:1024,i:37 */ FR2(+0.8986744656939538), FR2(+0.4386162385385277),
/*N:1024,i:37 */ FR2(+0.9743393827855759), FR2(+0.2250839113597928),
/*N:1024,i:37 */ FR2(+0.7768884656732324), FR2(+0.6296382389149270),
/*N:1024,i:38 */ FR2(+0.8932243011955153), FR2(+0.4496113296546065),
/*N:1024,i:38 */ FR2(+0.9729399522055602), FR2(+0.2310581082806711),
/*N:1024,i:38 */ FR2(+0.7651672656224590), FR2(+0.6438315428897914),
/*N:1024,i:39 */ FR2(+0.8876396204028539), FR2(+0.4605387109582400),
/*N:1024,i:39 */ FR2(+0.9715038909862518), FR2(+0.2370236059943672),
/*N:1024,i:39 */ FR2(+0.7531867990436125), FR2(+0.6578066932970786),
/*N:1024,i:40 */ FR2(+0.8819212643483551), FR2(+0.4713967368259976),
/*N:1024,i:40 */ FR2(+0.9700312531945440), FR2(+0.2429801799032639),
/*N:1024,i:40 */ FR2(+0.7409511253549591), FR2(+0.6715589548470183),
/*N:1024,i:41 */ FR2(+0.8760700941954066), FR2(+0.4821837720791227),
/*N:1024,i:41 */ FR2(+0.9685220942744174), FR2(+0.2489276057457202),
/*N:1024,i:41 */ FR2(+0.7284643904482252), FR2(+0.6850836677727004),
/*N:1024,i:42 */ FR2(+0.8700869911087115), FR2(+0.4928981922297840),
/*N:1024,i:42 */ FR2(+0.9669764710448521), FR2(+0.2548656596045146),
/*N:1024,i:42 */ FR2(+0.7157308252838186), FR2(+0.6983762494089729),
/*N:1024,i:43 */ FR2(+0.8639728561215868), FR2(+0.5035383837257176),
/*N:1024,i:43 */ FR2(+0.9653944416976894), FR2(+0.2607941179152755),
/*N:1024,i:43 */ FR2(+0.7027547444572253), FR2(+0.7114321957452164),
/*N:1024,i:44 */ FR2(+0.8577286100002721), FR2(+0.5141027441932217),
/*N:1024,i:44 */ FR2(+0.9637760657954398), FR2(+0.2667127574748984),
/*N:1024,i:44 */ FR2(+0.6895405447370669), FR2(+0.7242470829514669),
/*N:1024,i:45 */ FR2(+0.8513551931052652), FR2(+0.5245896826784690),
/*N:1024,i:45 */ FR2(+0.9621214042690416), FR2(+0.2726213554499490),
/*N:1024,i:45 */ FR2(+0.6760927035753160), FR2(+0.7368165688773698),
/*N:1024,i:46 */ FR2(+0.8448535652497071), FR2(+0.5349976198870972),
/*N:1024,i:46 */ FR2(+0.9604305194155658), FR2(+0.2785196893850531),
/*N:1024,i:46 */ FR2(+0.6624157775901718), FR2(+0.7491363945234593),
/*N:1024,i:47 */ FR2(+0.8382247055548381), FR2(+0.5453249884220465),
/*N:1024,i:47 */ FR2(+0.9587034748958716), FR2(+0.2844075372112719),
/*N:1024,i:47 */ FR2(+0.6485144010221126), FR2(+0.7612023854842618),
/*N:1024,i:48 */ FR2(+0.8314696123025452), FR2(+0.5555702330196022),
/*N:1024,i:48 */ FR2(+0.9569403357322088), FR2(+0.2902846772544623),
/*N:1024,i:48 */ FR2(+0.6343932841636455), FR2(+0.7730104533627370),
/*N:1024,i:49 */ FR2(+0.8245893027850253), FR2(+0.5657318107836131),
/*N:1024,i:49 */ FR2(+0.9551411683057708), FR2(+0.2961508882436238),
/*N:1024,i:49 */ FR2(+0.6200572117632892), FR2(+0.7845565971555752),
/*N:1024,i:50 */ FR2(+0.8175848131515837), FR2(+0.5758081914178453),
/*N:1024,i:50 */ FR2(+0.9533060403541939), FR2(+0.3020059493192281),
/*N:1024,i:50 */ FR2(+0.6055110414043256), FR2(+0.7958369046088835),
/*N:1024,i:51 */ FR2(+0.8104571982525948), FR2(+0.5857978574564389),
/*N:1024,i:51 */ FR2(+0.9514350209690083), FR2(+0.3078496400415349),
/*N:1024,i:51 */ FR2(+0.5907597018588743), FR2(+0.8068475535437992),
/*N:1024,i:52 */ FR2(+0.8032075314806449), FR2(+0.5956993044924334),
/*N:1024,i:52 */ FR2(+0.9495281805930367), FR2(+0.3136817403988915),
/*N:1024,i:52 */ FR2(+0.5758081914178453), FR2(+0.8175848131515837),
/*N:1024,i:53 */ FR2(+0.7958369046088836), FR2(+0.6055110414043256),
/*N:1024,i:53 */ FR2(+0.9475855910177411), FR2(+0.3195020308160157),
/*N:1024,i:53 */ FR2(+0.5606615761973360), FR2(+0.8280450452577558),
/*N:1024,i:54 */ FR2(+0.7883464276266063), FR2(+0.6152315905806268),
/*N:1024,i:54 */ FR2(+0.9456073253805213), FR2(+0.3253102921622629),
/*N:1024,i:54 */ FR2(+0.5453249884220465), FR2(+0.8382247055548380),
/*N:1024,i:55 */ FR2(+0.7807372285720945), FR2(+0.6248594881423863),
/*N:1024,i:55 */ FR2(+0.9435934581619604), FR2(+0.3311063057598764),
/*N:1024,i:55 */ FR2(+0.5298036246862948), FR2(+0.8481203448032971),
/*N:1024,i:56 */ FR2(+0.7730104533627370), FR2(+0.6343932841636455),
/*N:1024,i:56 */ FR2(+0.9415440651830208), FR2(+0.3368898533922201),
/*N:1024,i:56 */ FR2(+0.5141027441932217), FR2(+0.8577286100002721),
/*N:1024,i:57 */ FR2(+0.7651672656224590), FR2(+0.6438315428897914),
/*N:1024,i:57 */ FR2(+0.9394592236021899), FR2(+0.3426607173119944),
/*N:1024,i:57 */ FR2(+0.4982276669727819), FR2(+0.8670462455156927),
/*N:1024,i:58 */ FR2(+0.7572088465064846), FR2(+0.6531728429537768),
/*N:1024,i:58 */ FR2(+0.9373390119125750), FR2(+0.3484186802494346),
/*N:1024,i:58 */ FR2(+0.4821837720791228), FR2(+0.8760700941954066),
/*N:1024,i:59 */ FR2(+0.7491363945234594), FR2(+0.6624157775901718),
/*N:1024,i:59 */ FR2(+0.9351835099389476), FR2(+0.3541635254204903),
/*N:1024,i:59 */ FR2(+0.4659764957679661), FR2(+0.8847970984309378),
/*N:1024,i:60 */ FR2(+0.7409511253549591), FR2(+0.6715589548470183),
/*N:1024,i:60 */ FR2(+0.9329927988347390), FR2(+0.3598950365349881),
/*N:1024,i:60 */ FR2(+0.4496113296546066), FR2(+0.8932243011955153),
/*N:1024,i:61 */ FR2(+0.7326542716724128), FR2(+0.6806009977954530),
/*N:1024,i:61 */ FR2(+0.9307669610789837), FR2(+0.3656129978047739),
/*N:1024,i:61 */ FR2(+0.4330938188531520), FR2(+0.9013488470460220),
/*N:1024,i:62 */ FR2(+0.7242470829514670), FR2(+0.6895405447370668),
/*N:1024,i:62 */ FR2(+0.9285060804732156), FR2(+0.3713171939518375),
/*N:1024,i:62 */ FR2(+0.4164295600976373), FR2(+0.9091679830905223),
/*N:1024,i:63 */ FR2(+0.7157308252838186), FR2(+0.6983762494089729),
/*N:1024,i:63 */ FR2(+0.9262102421383114), FR2(+0.3770074102164183),
/*N:1024,i:63 */ FR2(+0.3996241998456468), FR2(+0.9166790599210427),
/*N:1024,i:64 */ FR2(+0.7071067811865476), FR2(+0.7071067811865475),
/*N:1024,i:64 */ FR2(+0.9238795325112867), FR2(+0.3826834323650898),
/*N:1024,i:64 */ FR2(+0.3826834323650898), FR2(+0.9238795325112867),
/*N:1024,i:65 */ FR2(+0.6983762494089729), FR2(+0.7157308252838186),
/*N:1024,i:65 */ FR2(+0.9215140393420420), FR2(+0.3883450466988263),
/*N:1024,i:65 */ FR2(+0.3656129978047740), FR2(+0.9307669610789837),
/*N:1024,i:66 */ FR2(+0.6895405447370669), FR2(+0.7242470829514669),
/*N:1024,i:66 */ FR2(+0.9191138516900578), FR2(+0.3939920400610481),
/*N:1024,i:66 */ FR2(+0.3484186802494345), FR2(+0.9373390119125750),
/*N:1024,i:67 */ FR2(+0.6806009977954531), FR2(+0.7326542716724128),
/*N:1024,i:67 */ FR2(+0.9166790599210427), FR2(+0.3996241998456468),
/*N:1024,i:67 */ FR2(+0.3311063057598764), FR2(+0.9435934581619604),
/*N:1024,i:68 */ FR2(+0.6715589548470183), FR2(+0.7409511253549591),
/*N:1024,i:68 */ FR2(+0.9142097557035307), FR2(+0.4052413140049899),
/*N:1024,i:68 */ FR2(+0.3136817403988916), FR2(+0.9495281805930367),
/*N:1024,i:69 */ FR2(+0.6624157775901718), FR2(+0.7491363945234593),
/*N:1024,i:69 */ FR2(+0.9117060320054299), FR2(+0.4108431710579039),
/*N:1024,i:69 */ FR2(+0.2961508882436240), FR2(+0.9551411683057707),
/*N:1024,i:70 */ FR2(+0.6531728429537768), FR2(+0.7572088465064845),
/*N:1024,i:70 */ FR2(+0.9091679830905224), FR2(+0.4164295600976372),
/*N:1024,i:70 */ FR2(+0.2785196893850531), FR2(+0.9604305194155658),
/*N:1024,i:71 */ FR2(+0.6438315428897915), FR2(+0.7651672656224590),
/*N:1024,i:71 */ FR2(+0.9065957045149153), FR2(+0.4220002707997997),
/*N:1024,i:71 */ FR2(+0.2607941179152756), FR2(+0.9653944416976894),
/*N:1024,i:72 */ FR2(+0.6343932841636455), FR2(+0.7730104533627370),
/*N:1024,i:72 */ FR2(+0.9039892931234433), FR2(+0.4275550934302821),
/*N:1024,i:72 */ FR2(+0.2429801799032640), FR2(+0.9700312531945440),
/*N:1024,i:73 */ FR2(+0.6248594881423865), FR2(+0.7807372285720944),
/*N:1024,i:73 */ FR2(+0.9013488470460220), FR2(+0.4330938188531520),
/*N:1024,i:73 */ FR2(+0.2250839113597928), FR2(+0.9743393827855759),
/*N:1024,i:74 */ FR2(+0.6152315905806268), FR2(+0.7883464276266062),
/*N:1024,i:74 */ FR2(+0.8986744656939538), FR2(+0.4386162385385277),
/*N:1024,i:74 */ FR2(+0.2071113761922186), FR2(+0.9783173707196277),
/*N:1024,i:75 */ FR2(+0.6055110414043256), FR2(+0.7958369046088835),
/*N:1024,i:75 */ FR2(+0.8959662497561852), FR2(+0.4441221445704292),
/*N:1024,i:75 */ FR2(+0.1890686641498063), FR2(+0.9819638691095552),
/*N:1024,i:76 */ FR2(+0.5956993044924335), FR2(+0.8032075314806448),
/*N:1024,i:76 */ FR2(+0.8932243011955153), FR2(+0.4496113296546065),
/*N:1024,i:76 */ FR2(+0.1709618887603014), FR2(+0.9852776423889412),
/*N:1024,i:77 */ FR2(+0.5857978574564389), FR2(+0.8104571982525948),
/*N:1024,i:77 */ FR2(+0.8904487232447579), FR2(+0.4550835871263438),
/*N:1024,i:77 */ FR2(+0.1527971852584434), FR2(+0.9882575677307495),
/*N:1024,i:78 */ FR2(+0.5758081914178453), FR2(+0.8175848131515837),
/*N:1024,i:78 */ FR2(+0.8876396204028539), FR2(+0.4605387109582400),
/*N:1024,i:78 */ FR2(+0.1345807085071262), FR2(+0.9909026354277800),
/*N:1024,i:79 */ FR2(+0.5657318107836132), FR2(+0.8245893027850253),
/*N:1024,i:79 */ FR2(+0.8847970984309378), FR2(+0.4659764957679662),
/*N:1024,i:79 */ FR2(+0.1163186309119049), FR2(+0.9932119492347945),
/*N:1024,i:80 */ FR2(+0.5555702330196023), FR2(+0.8314696123025452),
/*N:1024,i:80 */ FR2(+0.8819212643483551), FR2(+0.4713967368259976),
/*N:1024,i:80 */ FR2(+0.0980171403295608), FR2(+0.9951847266721968),
/*N:1024,i:81 */ FR2(+0.5453249884220465), FR2(+0.8382247055548380),
/*N:1024,i:81 */ FR2(+0.8790122264286335), FR2(+0.4767992300633221),
/*N:1024,i:81 */ FR2(+0.0796824379714301), FR2(+0.9968202992911657),
/*N:1024,i:82 */ FR2(+0.5349976198870973), FR2(+0.8448535652497070),
/*N:1024,i:82 */ FR2(+0.8760700941954066), FR2(+0.4821837720791227),
/*N:1024,i:82 */ FR2(+0.0613207363022086), FR2(+0.9981181129001492),
/*N:1024,i:83 */ FR2(+0.5245896826784688), FR2(+0.8513551931052652),
/*N:1024,i:83 */ FR2(+0.8730949784182901), FR2(+0.4875501601484360),
/*N:1024,i:83 */ FR2(+0.0429382569349410), FR2(+0.9990777277526454),
/*N:1024,i:84 */ FR2(+0.5141027441932217), FR2(+0.8577286100002721),
/*N:1024,i:84 */ FR2(+0.8700869911087115), FR2(+0.4928981922297840),
/*N:1024,i:84 */ FR2(+0.0245412285229123), FR2(+0.9996988186962043),
/*N:1024,i:85 */ FR2(+0.5035383837257176), FR2(+0.8639728561215867),
/*N:1024,i:85 */ FR2(+0.8670462455156927), FR2(+0.4982276669727819),
/*N:1024,i:85 */ FR2(+0.0061358846491545), FR2(+0.9999811752826011),
/*N:1024,i:86 */ FR2(+0.4928981922297841), FR2(+0.8700869911087114),
/*N:1024,i:86 */ FR2(+0.8639728561215868), FR2(+0.5035383837257176),
/*N:1024,i:86 */ FR2(-0.0122715382857198), FR2(+0.9999247018391445),
/*N:1024,i:87 */ FR2(+0.4821837720791228), FR2(+0.8760700941954066),
/*N:1024,i:87 */ FR2(+0.8608669386377673), FR2(+0.5088301425431070),
/*N:1024,i:87 */ FR2(-0.0306748031766365), FR2(+0.9995294175010931),
/*N:1024,i:88 */ FR2(+0.4713967368259978), FR2(+0.8819212643483549),
/*N:1024,i:88 */ FR2(+0.8577286100002721), FR2(+0.5141027441932217),
/*N:1024,i:88 */ FR2(-0.0490676743274180), FR2(+0.9987954562051724),
/*N:1024,i:89 */ FR2(+0.4605387109582400), FR2(+0.8876396204028539),
/*N:1024,i:89 */ FR2(+0.8545579883654005), FR2(+0.5193559901655896),
/*N:1024,i:89 */ FR2(-0.0674439195636640), FR2(+0.9977230666441916),
/*N:1024,i:90 */ FR2(+0.4496113296546066), FR2(+0.8932243011955153),
/*N:1024,i:90 */ FR2(+0.8513551931052652), FR2(+0.5245896826784690),
/*N:1024,i:90 */ FR2(-0.0857973123444398), FR2(+0.9963126121827780),
/*N:1024,i:91 */ FR2(+0.4386162385385277), FR2(+0.8986744656939538),
/*N:1024,i:91 */ FR2(+0.8481203448032972), FR2(+0.5298036246862946),
/*N:1024,i:91 */ FR2(-0.1041216338720546), FR2(+0.9945645707342554),
/*N:1024,i:92 */ FR2(+0.4275550934302822), FR2(+0.9039892931234433),
/*N:1024,i:92 */ FR2(+0.8448535652497071), FR2(+0.5349976198870972),
/*N:1024,i:92 */ FR2(-0.1224106751992162), FR2(+0.9924795345987100),
/*N:1024,i:93 */ FR2(+0.4164295600976373), FR2(+0.9091679830905223),
/*N:1024,i:93 */ FR2(+0.8415549774368984), FR2(+0.5401714727298929),
/*N:1024,i:93 */ FR2(-0.1406582393328491), FR2(+0.9900582102622971),
/*N:1024,i:94 */ FR2(+0.4052413140049899), FR2(+0.9142097557035307),
/*N:1024,i:94 */ FR2(+0.8382247055548381), FR2(+0.5453249884220465),
/*N:1024,i:94 */ FR2(-0.1588581433338613), FR2(+0.9873014181578584),
/*N:1024,i:95 */ FR2(+0.3939920400610481), FR2(+0.9191138516900578),
/*N:1024,i:95 */ FR2(+0.8348628749863800), FR2(+0.5504579729366048),
/*N:1024,i:95 */ FR2(-0.1770042204121488), FR2(+0.9842100923869290),
/*N:1024,i:96 */ FR2(+0.3826834323650898), FR2(+0.9238795325112867),
/*N:1024,i:96 */ FR2(+0.8314696123025452), FR2(+0.5555702330196022),
/*N:1024,i:96 */ FR2(-0.1950903220161282), FR2(+0.9807852804032304),
/*N:1024,i:97 */ FR2(+0.3713171939518376), FR2(+0.9285060804732155),
/*N:1024,i:97 */ FR2(+0.8280450452577558), FR2(+0.5606615761973360),
/*N:1024,i:97 */ FR2(-0.2131103199160913), FR2(+0.9770281426577544),
/*N:1024,i:98 */ FR2(+0.3598950365349883), FR2(+0.9329927988347389),
/*N:1024,i:98 */ FR2(+0.8245893027850253), FR2(+0.5657318107836131),
/*N:1024,i:98 */ FR2(-0.2310581082806711), FR2(+0.9729399522055602),
/*N:1024,i:99 */ FR2(+0.3484186802494345), FR2(+0.9373390119125750),
/*N:1024,i:99 */ FR2(+0.8211025149911047), FR2(+0.5707807458869673),
/*N:1024,i:99 */ FR2(-0.2489276057457201), FR2(+0.9685220942744174),
/*N:1024,i:100 */ FR2(+0.3368898533922201), FR2(+0.9415440651830208),
/*N:1024,i:100 */ FR2(+0.8175848131515837), FR2(+0.5758081914178453),
/*N:1024,i:100 */ FR2(-0.2667127574748983), FR2(+0.9637760657954398),
/*N:1024,i:101 */ FR2(+0.3253102921622630), FR2(+0.9456073253805213),
/*N:1024,i:101 */ FR2(+0.8140363297059484), FR2(+0.5808139580957645),
/*N:1024,i:101 */ FR2(-0.2844075372112717), FR2(+0.9587034748958716),
/*N:1024,i:102 */ FR2(+0.3136817403988916), FR2(+0.9495281805930367),
/*N:1024,i:102 */ FR2(+0.8104571982525948), FR2(+0.5857978574564389),
/*N:1024,i:102 */ FR2(-0.3020059493192281), FR2(+0.9533060403541939),
/*N:1024,i:103 */ FR2(+0.3020059493192282), FR2(+0.9533060403541938),
/*N:1024,i:103 */ FR2(+0.8068475535437993), FR2(+0.5907597018588742),
/*N:1024,i:103 */ FR2(-0.3195020308160156), FR2(+0.9475855910177412),
/*N:1024,i:104 */ FR2(+0.2902846772544623), FR2(+0.9569403357322089),
/*N:1024,i:104 */ FR2(+0.8032075314806449), FR2(+0.5956993044924334),
/*N:1024,i:104 */ FR2(-0.3368898533922199), FR2(+0.9415440651830208),
/*N:1024,i:105 */ FR2(+0.2785196893850531), FR2(+0.9604305194155658),
/*N:1024,i:105 */ FR2(+0.7995372691079050), FR2(+0.6006164793838690),
/*N:1024,i:105 */ FR2(-0.3541635254204904), FR2(+0.9351835099389476),
/*N:1024,i:106 */ FR2(+0.2667127574748984), FR2(+0.9637760657954398),
/*N:1024,i:106 */ FR2(+0.7958369046088836), FR2(+0.6055110414043256),
/*N:1024,i:106 */ FR2(-0.3713171939518375), FR2(+0.9285060804732156),
/*N:1024,i:107 */ FR2(+0.2548656596045146), FR2(+0.9669764710448521),
/*N:1024,i:107 */ FR2(+0.7921065773002124), FR2(+0.6103828062763095),
/*N:1024,i:107 */ FR2(-0.3883450466988262), FR2(+0.9215140393420420),
/*N:1024,i:108 */ FR2(+0.2429801799032640), FR2(+0.9700312531945440),
/*N:1024,i:108 */ FR2(+0.7883464276266063), FR2(+0.6152315905806268),
/*N:1024,i:108 */ FR2(-0.4052413140049898), FR2(+0.9142097557035307),
/*N:1024,i:109 */ FR2(+0.2310581082806713), FR2(+0.9729399522055601),
/*N:1024,i:109 */ FR2(+0.7845565971555752), FR2(+0.6200572117632891),
/*N:1024,i:109 */ FR2(-0.4220002707997997), FR2(+0.9065957045149153),
/*N:1024,i:110 */ FR2(+0.2191012401568698), FR2(+0.9757021300385286),
/*N:1024,i:110 */ FR2(+0.7807372285720945), FR2(+0.6248594881423863),
/*N:1024,i:110 */ FR2(-0.4386162385385274), FR2(+0.8986744656939539),
/*N:1024,i:111 */ FR2(+0.2071113761922186), FR2(+0.9783173707196277),
/*N:1024,i:111 */ FR2(+0.7768884656732324), FR2(+0.6296382389149270),
/*N:1024,i:111 */ FR2(-0.4550835871263437), FR2(+0.8904487232447580),
/*N:1024,i:112 */ FR2(+0.1950903220161283), FR2(+0.9807852804032304),
/*N:1024,i:112 */ FR2(+0.7730104533627370), FR2(+0.6343932841636455),
/*N:1024,i:112 */ FR2(-0.4713967368259977), FR2(+0.8819212643483551),
/*N:1024,i:113 */ FR2(+0.1830398879551411), FR2(+0.9831054874312163),
/*N:1024,i:113 */ FR2(+0.7691033376455797), FR2(+0.6391244448637757),
/*N:1024,i:113 */ FR2(-0.4875501601484357), FR2(+0.8730949784182902),
/*N:1024,i:114 */ FR2(+0.1709618887603014), FR2(+0.9852776423889412),
/*N:1024,i:114 */ FR2(+0.7651672656224590), FR2(+0.6438315428897914),
/*N:1024,i:114 */ FR2(-0.5035383837257175), FR2(+0.8639728561215868),
/*N:1024,i:115 */ FR2(+0.1588581433338614), FR2(+0.9873014181578584),
/*N:1024,i:115 */ FR2(+0.7612023854842618), FR2(+0.6485144010221124),
/*N:1024,i:115 */ FR2(-0.5193559901655896), FR2(+0.8545579883654005),
/*N:1024,i:116 */ FR2(+0.1467304744553618), FR2(+0.9891765099647810),
/*N:1024,i:116 */ FR2(+0.7572088465064846), FR2(+0.6531728429537768),
/*N:1024,i:116 */ FR2(-0.5349976198870970), FR2(+0.8448535652497072),
/*N:1024,i:117 */ FR2(+0.1345807085071262), FR2(+0.9909026354277800),
/*N:1024,i:117 */ FR2(+0.7531867990436125), FR2(+0.6578066932970786),
/*N:1024,i:117 */ FR2(-0.5504579729366047), FR2(+0.8348628749863801),
/*N:1024,i:118 */ FR2(+0.1224106751992163), FR2(+0.9924795345987100),
/*N:1024,i:118 */ FR2(+0.7491363945234594), FR2(+0.6624157775901718),
/*N:1024,i:118 */ FR2(-0.5657318107836132), FR2(+0.8245893027850252),
/*N:1024,i:119 */ FR2(+0.1102222072938832), FR2(+0.9939069700023561),
/*N:1024,i:119 */ FR2(+0.7450577854414661), FR2(+0.6669999223036375),
/*N:1024,i:119 */ FR2(-0.5808139580957644), FR2(+0.8140363297059485),
/*N:1024,i:120 */ FR2(+0.0980171403295608), FR2(+0.9951847266721968),
/*N:1024,i:120 */ FR2(+0.7409511253549591), FR2(+0.6715589548470183),
/*N:1024,i:120 */ FR2(-0.5956993044924334), FR2(+0.8032075314806449),
/*N:1024,i:121 */ FR2(+0.0857973123444399), FR2(+0.9963126121827780),
/*N:1024,i:121 */ FR2(+0.7368165688773699), FR2(+0.6760927035753159),
/*N:1024,i:121 */ FR2(-0.6103828062763096), FR2(+0.7921065773002123),
/*N:1024,i:122 */ FR2(+0.0735645635996675), FR2(+0.9972904566786902),
/*N:1024,i:122 */ FR2(+0.7326542716724128), FR2(+0.6806009977954530),
/*N:1024,i:122 */ FR2(-0.6248594881423862), FR2(+0.7807372285720946),
/*N:1024,i:123 */ FR2(+0.0613207363022086), FR2(+0.9981181129001492),
/*N:1024,i:123 */ FR2(+0.7284643904482252), FR2(+0.6850836677727004),
/*N:1024,i:123 */ FR2(-0.6391244448637757), FR2(+0.7691033376455796),
/*N:1024,i:124 */ FR2(+0.0490676743274181), FR2(+0.9987954562051724),
/*N:1024,i:124 */ FR2(+0.7242470829514670), FR2(+0.6895405447370668),
/*N:1024,i:124 */ FR2(-0.6531728429537765), FR2(+0.7572088465064847),
/*N:1024,i:125 */ FR2(+0.0368072229413590), FR2(+0.9993223845883495),
/*N:1024,i:125 */ FR2(+0.7200025079613817), FR2(+0.6939714608896540),
/*N:1024,i:125 */ FR2(-0.6669999223036374), FR2(+0.7450577854414661),
/*N:1024,i:126 */ FR2(+0.0245412285229123), FR2(+0.9996988186962043),
/*N:1024,i:126 */ FR2(+0.7157308252838186), FR2(+0.6983762494089729),
/*N:1024,i:126 */ FR2(-0.6806009977954530), FR2(+0.7326542716724128),
/*N:1024,i:127 */ FR2(+0.0122715382857199), FR2(+0.9999247018391445),
/*N:1024,i:127 */ FR2(+0.7114321957452164), FR2(+0.7027547444572253),
/*N:1024,i:127 */ FR2(-0.6939714608896538), FR2(+0.7200025079613818),
/*N:1024,i:128 */ FR2(+0.0000000000000001), FR2(+1.0000000000000000),
/*N:1024,i:128 */ FR2(+0.7071067811865476), FR2(+0.7071067811865475),
/*N:1024,i:128 */ FR2(-0.7071067811865475), FR2(+0.7071067811865476),
/*N:1024,i:129 */ FR2(-0.0122715382857198), FR2(+0.9999247018391445),
/*N:1024,i:129 */ FR2(+0.7027547444572253), FR2(+0.7114321957452164),
/*N:1024,i:129 */ FR2(-0.7200025079613817), FR2(+0.6939714608896540),
/*N:1024,i:130 */ FR2(-0.0245412285229121), FR2(+0.9996988186962043),
/*N:1024,i:130 */ FR2(+0.6983762494089729), FR2(+0.7157308252838186),
/*N:1024,i:130 */ FR2(-0.7326542716724127), FR2(+0.6806009977954532),
/*N:1024,i:131 */ FR2(-0.0368072229413589), FR2(+0.9993223845883495),
/*N:1024,i:131 */ FR2(+0.6939714608896540), FR2(+0.7200025079613817),
/*N:1024,i:131 */ FR2(-0.7450577854414660), FR2(+0.6669999223036376),
/*N:1024,i:132 */ FR2(-0.0490676743274180), FR2(+0.9987954562051724),
/*N:1024,i:132 */ FR2(+0.6895405447370669), FR2(+0.7242470829514669),
/*N:1024,i:132 */ FR2(-0.7572088465064846), FR2(+0.6531728429537766),
/*N:1024,i:133 */ FR2(-0.0613207363022085), FR2(+0.9981181129001492),
/*N:1024,i:133 */ FR2(+0.6850836677727004), FR2(+0.7284643904482252),
/*N:1024,i:133 */ FR2(-0.7691033376455795), FR2(+0.6391244448637758),
/*N:1024,i:134 */ FR2(-0.0735645635996673), FR2(+0.9972904566786902),
/*N:1024,i:134 */ FR2(+0.6806009977954531), FR2(+0.7326542716724128),
/*N:1024,i:134 */ FR2(-0.7807372285720945), FR2(+0.6248594881423863),
/*N:1024,i:135 */ FR2(-0.0857973123444398), FR2(+0.9963126121827780),
/*N:1024,i:135 */ FR2(+0.6760927035753160), FR2(+0.7368165688773698),
/*N:1024,i:135 */ FR2(-0.7921065773002122), FR2(+0.6103828062763097),
/*N:1024,i:136 */ FR2(-0.0980171403295606), FR2(+0.9951847266721969),
/*N:1024,i:136 */ FR2(+0.6715589548470183), FR2(+0.7409511253549591),
/*N:1024,i:136 */ FR2(-0.8032075314806448), FR2(+0.5956993044924335),
/*N:1024,i:137 */ FR2(-0.1102222072938831), FR2(+0.9939069700023561),
/*N:1024,i:137 */ FR2(+0.6669999223036375), FR2(+0.7450577854414660),
/*N:1024,i:137 */ FR2(-0.8140363297059484), FR2(+0.5808139580957645),
/*N:1024,i:138 */ FR2(-0.1224106751992162), FR2(+0.9924795345987100),
/*N:1024,i:138 */ FR2(+0.6624157775901718), FR2(+0.7491363945234593),
/*N:1024,i:138 */ FR2(-0.8245893027850251), FR2(+0.5657318107836135),
/*N:1024,i:139 */ FR2(-0.1345807085071261), FR2(+0.9909026354277800),
/*N:1024,i:139 */ FR2(+0.6578066932970786), FR2(+0.7531867990436124),
/*N:1024,i:139 */ FR2(-0.8348628749863800), FR2(+0.5504579729366049),
/*N:1024,i:140 */ FR2(-0.1467304744553616), FR2(+0.9891765099647810),
/*N:1024,i:140 */ FR2(+0.6531728429537768), FR2(+0.7572088465064845),
/*N:1024,i:140 */ FR2(-0.8448535652497071), FR2(+0.5349976198870972),
/*N:1024,i:141 */ FR2(-0.1588581433338613), FR2(+0.9873014181578584),
/*N:1024,i:141 */ FR2(+0.6485144010221126), FR2(+0.7612023854842618),
/*N:1024,i:141 */ FR2(-0.8545579883654004), FR2(+0.5193559901655898),
/*N:1024,i:142 */ FR2(-0.1709618887603012), FR2(+0.9852776423889412),
/*N:1024,i:142 */ FR2(+0.6438315428897915), FR2(+0.7651672656224590),
/*N:1024,i:142 */ FR2(-0.8639728561215867), FR2(+0.5035383837257177),
/*N:1024,i:143 */ FR2(-0.1830398879551409), FR2(+0.9831054874312163),
/*N:1024,i:143 */ FR2(+0.6391244448637757), FR2(+0.7691033376455796),
/*N:1024,i:143 */ FR2(-0.8730949784182901), FR2(+0.4875501601484359),
/*N:1024,i:144 */ FR2(-0.1950903220161282), FR2(+0.9807852804032304),
/*N:1024,i:144 */ FR2(+0.6343932841636455), FR2(+0.7730104533627370),
/*N:1024,i:144 */ FR2(-0.8819212643483549), FR2(+0.4713967368259979),
/*N:1024,i:145 */ FR2(-0.2071113761922185), FR2(+0.9783173707196277),
/*N:1024,i:145 */ FR2(+0.6296382389149271), FR2(+0.7768884656732324),
/*N:1024,i:145 */ FR2(-0.8904487232447579), FR2(+0.4550835871263439),
/*N:1024,i:146 */ FR2(-0.2191012401568697), FR2(+0.9757021300385286),
/*N:1024,i:146 */ FR2(+0.6248594881423865), FR2(+0.7807372285720944),
/*N:1024,i:146 */ FR2(-0.8986744656939539), FR2(+0.4386162385385276),
/*N:1024,i:147 */ FR2(-0.2310581082806711), FR2(+0.9729399522055602),
/*N:1024,i:147 */ FR2(+0.6200572117632892), FR2(+0.7845565971555752),
/*N:1024,i:147 */ FR2(-0.9065957045149153), FR2(+0.4220002707997999),
/*N:1024,i:148 */ FR2(-0.2429801799032639), FR2(+0.9700312531945440),
/*N:1024,i:148 */ FR2(+0.6152315905806268), FR2(+0.7883464276266062),
/*N:1024,i:148 */ FR2(-0.9142097557035307), FR2(+0.4052413140049899),
/*N:1024,i:149 */ FR2(-0.2548656596045145), FR2(+0.9669764710448521),
/*N:1024,i:149 */ FR2(+0.6103828062763095), FR2(+0.7921065773002124),
/*N:1024,i:149 */ FR2(-0.9215140393420418), FR2(+0.3883450466988266),
/*N:1024,i:150 */ FR2(-0.2667127574748983), FR2(+0.9637760657954398),
/*N:1024,i:150 */ FR2(+0.6055110414043256), FR2(+0.7958369046088835),
/*N:1024,i:150 */ FR2(-0.9285060804732155), FR2(+0.3713171939518377),
/*N:1024,i:151 */ FR2(-0.2785196893850530), FR2(+0.9604305194155659),
/*N:1024,i:151 */ FR2(+0.6006164793838690), FR2(+0.7995372691079050),
/*N:1024,i:151 */ FR2(-0.9351835099389476), FR2(+0.3541635254204904),
/*N:1024,i:152 */ FR2(-0.2902846772544622), FR2(+0.9569403357322089),
/*N:1024,i:152 */ FR2(+0.5956993044924335), FR2(+0.8032075314806448),
/*N:1024,i:152 */ FR2(-0.9415440651830207), FR2(+0.3368898533922203),
/*N:1024,i:153 */ FR2(-0.3020059493192281), FR2(+0.9533060403541939),
/*N:1024,i:153 */ FR2(+0.5907597018588743), FR2(+0.8068475535437992),
/*N:1024,i:153 */ FR2(-0.9475855910177411), FR2(+0.3195020308160158),
/*N:1024,i:154 */ FR2(-0.3136817403988914), FR2(+0.9495281805930367),
/*N:1024,i:154 */ FR2(+0.5857978574564389), FR2(+0.8104571982525948),
/*N:1024,i:154 */ FR2(-0.9533060403541939), FR2(+0.3020059493192280),
/*N:1024,i:155 */ FR2(-0.3253102921622629), FR2(+0.9456073253805214),
/*N:1024,i:155 */ FR2(+0.5808139580957645), FR2(+0.8140363297059483),
/*N:1024,i:155 */ FR2(-0.9587034748958715), FR2(+0.2844075372112721),
/*N:1024,i:156 */ FR2(-0.3368898533922199), FR2(+0.9415440651830208),
/*N:1024,i:156 */ FR2(+0.5758081914178453), FR2(+0.8175848131515837),
/*N:1024,i:156 */ FR2(-0.9637760657954398), FR2(+0.2667127574748985),
/*N:1024,i:157 */ FR2(-0.3484186802494344), FR2(+0.9373390119125750),
/*N:1024,i:157 */ FR2(+0.5707807458869674), FR2(+0.8211025149911047),
/*N:1024,i:157 */ FR2(-0.9685220942744174), FR2(+0.2489276057457201),
/*N:1024,i:158 */ FR2(-0.3598950365349882), FR2(+0.9329927988347389),
/*N:1024,i:158 */ FR2(+0.5657318107836132), FR2(+0.8245893027850253),
/*N:1024,i:158 */ FR2(-0.9729399522055601), FR2(+0.2310581082806713),
/*N:1024,i:159 */ FR2(-0.3713171939518375), FR2(+0.9285060804732156),
/*N:1024,i:159 */ FR2(+0.5606615761973360), FR2(+0.8280450452577558),
/*N:1024,i:159 */ FR2(-0.9770281426577544), FR2(+0.2131103199160914),
/*N:1024,i:160 */ FR2(-0.3826834323650897), FR2(+0.9238795325112867),
/*N:1024,i:160 */ FR2(+0.5555702330196023), FR2(+0.8314696123025452),
/*N:1024,i:160 */ FR2(-0.9807852804032304), FR2(+0.1950903220161286),
/*N:1024,i:161 */ FR2(-0.3939920400610480), FR2(+0.9191138516900578),
/*N:1024,i:161 */ FR2(+0.5504579729366048), FR2(+0.8348628749863800),
/*N:1024,i:161 */ FR2(-0.9842100923869290), FR2(+0.1770042204121489),
/*N:1024,i:162 */ FR2(-0.4052413140049898), FR2(+0.9142097557035307),
/*N:1024,i:162 */ FR2(+0.5453249884220465), FR2(+0.8382247055548380),
/*N:1024,i:162 */ FR2(-0.9873014181578584), FR2(+0.1588581433338615),
/*N:1024,i:163 */ FR2(-0.4164295600976370), FR2(+0.9091679830905225),
/*N:1024,i:163 */ FR2(+0.5401714727298930), FR2(+0.8415549774368983),
/*N:1024,i:163 */ FR2(-0.9900582102622970), FR2(+0.1406582393328495),
/*N:1024,i:164 */ FR2(-0.4275550934302819), FR2(+0.9039892931234435),
/*N:1024,i:164 */ FR2(+0.5349976198870973), FR2(+0.8448535652497070),
/*N:1024,i:164 */ FR2(-0.9924795345987100), FR2(+0.1224106751992164),
/*N:1024,i:165 */ FR2(-0.4386162385385274), FR2(+0.8986744656939539),
/*N:1024,i:165 */ FR2(+0.5298036246862948), FR2(+0.8481203448032971),
/*N:1024,i:165 */ FR2(-0.9945645707342554), FR2(+0.1041216338720546),
/*N:1024,i:166 */ FR2(-0.4496113296546067), FR2(+0.8932243011955152),
/*N:1024,i:166 */ FR2(+0.5245896826784688), FR2(+0.8513551931052652),
/*N:1024,i:166 */ FR2(-0.9963126121827780), FR2(+0.0857973123444402),
/*N:1024,i:167 */ FR2(-0.4605387109582401), FR2(+0.8876396204028539),
/*N:1024,i:167 */ FR2(+0.5193559901655895), FR2(+0.8545579883654005),
/*N:1024,i:167 */ FR2(-0.9977230666441916), FR2(+0.0674439195636642),
/*N:1024,i:168 */ FR2(-0.4713967368259977), FR2(+0.8819212643483551),
/*N:1024,i:168 */ FR2(+0.5141027441932217), FR2(+0.8577286100002721),
/*N:1024,i:168 */ FR2(-0.9987954562051724), FR2(+0.0490676743274180),
/*N:1024,i:169 */ FR2(-0.4821837720791227), FR2(+0.8760700941954066),
/*N:1024,i:169 */ FR2(+0.5088301425431070), FR2(+0.8608669386377673),
/*N:1024,i:169 */ FR2(-0.9995294175010931), FR2(+0.0306748031766369),
/*N:1024,i:170 */ FR2(-0.4928981922297840), FR2(+0.8700869911087115),
/*N:1024,i:170 */ FR2(+0.5035383837257176), FR2(+0.8639728561215867),
/*N:1024,i:170 */ FR2(-0.9999247018391445), FR2(+0.0122715382857200),
/*N:1024,i:171 */ FR2(-0.5035383837257175), FR2(+0.8639728561215868),
/*N:1024,i:171 */ FR2(+0.4982276669727819), FR2(+0.8670462455156927),
/*N:1024,i:171 */ FR2(-0.9999811752826011), FR2(-0.0061358846491546),
/*N:1024,i:172 */ FR2(-0.5141027441932217), FR2(+0.8577286100002721),
/*N:1024,i:172 */ FR2(+0.4928981922297841), FR2(+0.8700869911087114),
/*N:1024,i:172 */ FR2(-0.9996988186962043), FR2(-0.0245412285229121),
/*N:1024,i:173 */ FR2(-0.5245896826784687), FR2(+0.8513551931052652),
/*N:1024,i:173 */ FR2(+0.4875501601484361), FR2(+0.8730949784182901),
/*N:1024,i:173 */ FR2(-0.9990777277526454), FR2(-0.0429382569349408),
/*N:1024,i:174 */ FR2(-0.5349976198870970), FR2(+0.8448535652497072),
/*N:1024,i:174 */ FR2(+0.4821837720791228), FR2(+0.8760700941954066),
/*N:1024,i:174 */ FR2(-0.9981181129001492), FR2(-0.0613207363022082),
/*N:1024,i:175 */ FR2(-0.5453249884220462), FR2(+0.8382247055548382),
/*N:1024,i:175 */ FR2(+0.4767992300633223), FR2(+0.8790122264286334),
/*N:1024,i:175 */ FR2(-0.9968202992911658), FR2(-0.0796824379714299),
/*N:1024,i:176 */ FR2(-0.5555702330196020), FR2(+0.8314696123025455),
/*N:1024,i:176 */ FR2(+0.4713967368259978), FR2(+0.8819212643483549),
/*N:1024,i:176 */ FR2(-0.9951847266721969), FR2(-0.0980171403295606),
/*N:1024,i:177 */ FR2(-0.5657318107836132), FR2(+0.8245893027850252),
/*N:1024,i:177 */ FR2(+0.4659764957679661), FR2(+0.8847970984309378),
/*N:1024,i:177 */ FR2(-0.9932119492347946), FR2(-0.1163186309119045),
/*N:1024,i:178 */ FR2(-0.5758081914178453), FR2(+0.8175848131515837),
/*N:1024,i:178 */ FR2(+0.4605387109582400), FR2(+0.8876396204028539),
/*N:1024,i:178 */ FR2(-0.9909026354277800), FR2(-0.1345807085071261),
/*N:1024,i:179 */ FR2(-0.5857978574564389), FR2(+0.8104571982525948),
/*N:1024,i:179 */ FR2(+0.4550835871263438), FR2(+0.8904487232447579),
/*N:1024,i:179 */ FR2(-0.9882575677307495), FR2(-0.1527971852584434),
/*N:1024,i:180 */ FR2(-0.5956993044924334), FR2(+0.8032075314806449),
/*N:1024,i:180 */ FR2(+0.4496113296546066), FR2(+0.8932243011955153),
/*N:1024,i:180 */ FR2(-0.9852776423889413), FR2(-0.1709618887603010),
/*N:1024,i:181 */ FR2(-0.6055110414043254), FR2(+0.7958369046088836),
/*N:1024,i:181 */ FR2(+0.4441221445704293), FR2(+0.8959662497561851),
/*N:1024,i:181 */ FR2(-0.9819638691095552), FR2(-0.1890686641498061),
/*N:1024,i:182 */ FR2(-0.6152315905806267), FR2(+0.7883464276266063),
/*N:1024,i:182 */ FR2(+0.4386162385385277), FR2(+0.8986744656939538),
/*N:1024,i:182 */ FR2(-0.9783173707196277), FR2(-0.2071113761922186),
/*N:1024,i:183 */ FR2(-0.6248594881423862), FR2(+0.7807372285720946),
/*N:1024,i:183 */ FR2(+0.4330938188531520), FR2(+0.9013488470460220),
/*N:1024,i:183 */ FR2(-0.9743393827855759), FR2(-0.2250839113597926),
/*N:1024,i:184 */ FR2(-0.6343932841636454), FR2(+0.7730104533627371),
/*N:1024,i:184 */ FR2(+0.4275550934302822), FR2(+0.9039892931234433),
/*N:1024,i:184 */ FR2(-0.9700312531945440), FR2(-0.2429801799032638),
/*N:1024,i:185 */ FR2(-0.6438315428897913), FR2(+0.7651672656224591),
/*N:1024,i:185 */ FR2(+0.4220002707997998), FR2(+0.9065957045149153),
/*N:1024,i:185 */ FR2(-0.9653944416976894), FR2(-0.2607941179152756),
/*N:1024,i:186 */ FR2(-0.6531728429537765), FR2(+0.7572088465064847),
/*N:1024,i:186 */ FR2(+0.4164295600976373), FR2(+0.9091679830905223),
/*N:1024,i:186 */ FR2(-0.9604305194155659), FR2(-0.2785196893850529),
/*N:1024,i:187 */ FR2(-0.6624157775901719), FR2(+0.7491363945234593),
/*N:1024,i:187 */ FR2(+0.4108431710579039), FR2(+0.9117060320054299),
/*N:1024,i:187 */ FR2(-0.9551411683057708), FR2(-0.2961508882436238),
/*N:1024,i:188 */ FR2(-0.6715589548470184), FR2(+0.7409511253549590),
/*N:1024,i:188 */ FR2(+0.4052413140049899), FR2(+0.9142097557035307),
/*N:1024,i:188 */ FR2(-0.9495281805930368), FR2(-0.3136817403988912),
/*N:1024,i:189 */ FR2(-0.6806009977954530), FR2(+0.7326542716724128),
/*N:1024,i:189 */ FR2(+0.3996241998456468), FR2(+0.9166790599210427),
/*N:1024,i:189 */ FR2(-0.9435934581619604), FR2(-0.3311063057598763),
/*N:1024,i:190 */ FR2(-0.6895405447370669), FR2(+0.7242470829514669),
/*N:1024,i:190 */ FR2(+0.3939920400610481), FR2(+0.9191138516900578),
/*N:1024,i:190 */ FR2(-0.9373390119125750), FR2(-0.3484186802494346),
/*N:1024,i:191 */ FR2(-0.6983762494089728), FR2(+0.7157308252838187),
/*N:1024,i:191 */ FR2(+0.3883450466988263), FR2(+0.9215140393420419),
/*N:1024,i:191 */ FR2(-0.9307669610789838), FR2(-0.3656129978047736),
/*N:1024,i:192 */ FR2(-0.7071067811865475), FR2(+0.7071067811865476),
/*N:1024,i:192 */ FR2(+0.3826834323650898), FR2(+0.9238795325112867),
/*N:1024,i:192 */ FR2(-0.9238795325112869), FR2(-0.3826834323650897),
/*N:1024,i:193 */ FR2(-0.7157308252838186), FR2(+0.6983762494089729),
/*N:1024,i:193 */ FR2(+0.3770074102164183), FR2(+0.9262102421383113),
/*N:1024,i:193 */ FR2(-0.9166790599210427), FR2(-0.3996241998456468),
/*N:1024,i:194 */ FR2(-0.7242470829514668), FR2(+0.6895405447370671),
/*N:1024,i:194 */ FR2(+0.3713171939518376), FR2(+0.9285060804732155),
/*N:1024,i:194 */ FR2(-0.9091679830905225), FR2(-0.4164295600976369),
/*N:1024,i:195 */ FR2(-0.7326542716724127), FR2(+0.6806009977954532),
/*N:1024,i:195 */ FR2(+0.3656129978047740), FR2(+0.9307669610789837),
/*N:1024,i:195 */ FR2(-0.9013488470460220), FR2(-0.4330938188531519),
/*N:1024,i:196 */ FR2(-0.7409511253549589), FR2(+0.6715589548470186),
/*N:1024,i:196 */ FR2(+0.3598950365349883), FR2(+0.9329927988347389),
/*N:1024,i:196 */ FR2(-0.8932243011955153), FR2(-0.4496113296546067),
/*N:1024,i:197 */ FR2(-0.7491363945234592), FR2(+0.6624157775901720),
/*N:1024,i:197 */ FR2(+0.3541635254204905), FR2(+0.9351835099389475),
/*N:1024,i:197 */ FR2(-0.8847970984309379), FR2(-0.4659764957679660),
/*N:1024,i:198 */ FR2(-0.7572088465064846), FR2(+0.6531728429537766),
/*N:1024,i:198 */ FR2(+0.3484186802494345), FR2(+0.9373390119125750),
/*N:1024,i:198 */ FR2(-0.8760700941954066), FR2(-0.4821837720791227),
/*N:1024,i:199 */ FR2(-0.7651672656224590), FR2(+0.6438315428897914),
/*N:1024,i:199 */ FR2(+0.3426607173119944), FR2(+0.9394592236021899),
/*N:1024,i:199 */ FR2(-0.8670462455156929), FR2(-0.4982276669727815),
/*N:1024,i:200 */ FR2(-0.7730104533627370), FR2(+0.6343932841636455),
/*N:1024,i:200 */ FR2(+0.3368898533922201), FR2(+0.9415440651830208),
/*N:1024,i:200 */ FR2(-0.8577286100002721), FR2(-0.5141027441932216),
/*N:1024,i:201 */ FR2(-0.7807372285720945), FR2(+0.6248594881423863),
/*N:1024,i:201 */ FR2(+0.3311063057598764), FR2(+0.9435934581619604),
/*N:1024,i:201 */ FR2(-0.8481203448032972), FR2(-0.5298036246862946),
/*N:1024,i:202 */ FR2(-0.7883464276266062), FR2(+0.6152315905806269),
/*N:1024,i:202 */ FR2(+0.3253102921622630), FR2(+0.9456073253805213),
/*N:1024,i:202 */ FR2(-0.8382247055548382), FR2(-0.5453249884220461),
/*N:1024,i:203 */ FR2(-0.7958369046088835), FR2(+0.6055110414043257),
/*N:1024,i:203 */ FR2(+0.3195020308160158), FR2(+0.9475855910177411),
/*N:1024,i:203 */ FR2(-0.8280450452577558), FR2(-0.5606615761973359),
/*N:1024,i:204 */ FR2(-0.8032075314806448), FR2(+0.5956993044924335),
/*N:1024,i:204 */ FR2(+0.3136817403988916), FR2(+0.9495281805930367),
/*N:1024,i:204 */ FR2(-0.8175848131515837), FR2(-0.5758081914178453),
/*N:1024,i:205 */ FR2(-0.8104571982525947), FR2(+0.5857978574564390),
/*N:1024,i:205 */ FR2(+0.3078496400415350), FR2(+0.9514350209690083),
/*N:1024,i:205 */ FR2(-0.8068475535437995), FR2(-0.5907597018588739),
/*N:1024,i:206 */ FR2(-0.8175848131515836), FR2(+0.5758081914178455),
/*N:1024,i:206 */ FR2(+0.3020059493192282), FR2(+0.9533060403541938),
/*N:1024,i:206 */ FR2(-0.7958369046088836), FR2(-0.6055110414043254),
/*N:1024,i:207 */ FR2(-0.8245893027850251), FR2(+0.5657318107836135),
/*N:1024,i:207 */ FR2(+0.2961508882436240), FR2(+0.9551411683057707),
/*N:1024,i:207 */ FR2(-0.7845565971555752), FR2(-0.6200572117632892),
/*N:1024,i:208 */ FR2(-0.8314696123025454), FR2(+0.5555702330196022),
/*N:1024,i:208 */ FR2(+0.2902846772544623), FR2(+0.9569403357322089),
/*N:1024,i:208 */ FR2(-0.7730104533627371), FR2(-0.6343932841636453),
/*N:1024,i:209 */ FR2(-0.8382247055548381), FR2(+0.5453249884220464),
/*N:1024,i:209 */ FR2(+0.2844075372112718), FR2(+0.9587034748958716),
/*N:1024,i:209 */ FR2(-0.7612023854842619), FR2(-0.6485144010221123),
/*N:1024,i:210 */ FR2(-0.8448535652497071), FR2(+0.5349976198870972),
/*N:1024,i:210 */ FR2(+0.2785196893850531), FR2(+0.9604305194155658),
/*N:1024,i:210 */ FR2(-0.7491363945234593), FR2(-0.6624157775901718),
/*N:1024,i:211 */ FR2(-0.8513551931052652), FR2(+0.5245896826784690),
/*N:1024,i:211 */ FR2(+0.2726213554499490), FR2(+0.9621214042690416),
/*N:1024,i:211 */ FR2(-0.7368165688773700), FR2(-0.6760927035753158),
/*N:1024,i:212 */ FR2(-0.8577286100002720), FR2(+0.5141027441932218),
/*N:1024,i:212 */ FR2(+0.2667127574748984), FR2(+0.9637760657954398),
/*N:1024,i:212 */ FR2(-0.7242470829514670), FR2(-0.6895405447370668),
/*N:1024,i:213 */ FR2(-0.8639728561215867), FR2(+0.5035383837257177),
/*N:1024,i:213 */ FR2(+0.2607941179152756), FR2(+0.9653944416976894),
/*N:1024,i:213 */ FR2(-0.7114321957452167), FR2(-0.7027547444572251),
/*N:1024,i:214 */ FR2(-0.8700869911087114), FR2(+0.4928981922297842),
/*N:1024,i:214 */ FR2(+0.2548656596045146), FR2(+0.9669764710448521),
/*N:1024,i:214 */ FR2(-0.6983762494089730), FR2(-0.7157308252838185),
/*N:1024,i:215 */ FR2(-0.8760700941954065), FR2(+0.4821837720791229),
/*N:1024,i:215 */ FR2(+0.2489276057457203), FR2(+0.9685220942744173),
/*N:1024,i:215 */ FR2(-0.6850836677727004), FR2(-0.7284643904482252),
/*N:1024,i:216 */ FR2(-0.8819212643483549), FR2(+0.4713967368259979),
/*N:1024,i:216 */ FR2(+0.2429801799032640), FR2(+0.9700312531945440),
/*N:1024,i:216 */ FR2(-0.6715589548470187), FR2(-0.7409511253549589),
/*N:1024,i:217 */ FR2(-0.8876396204028538), FR2(+0.4605387109582402),
/*N:1024,i:217 */ FR2(+0.2370236059943673), FR2(+0.9715038909862518),
/*N:1024,i:217 */ FR2(-0.6578066932970788), FR2(-0.7531867990436124),
/*N:1024,i:218 */ FR2(-0.8932243011955152), FR2(+0.4496113296546069),
/*N:1024,i:218 */ FR2(+0.2310581082806713), FR2(+0.9729399522055601),
/*N:1024,i:218 */ FR2(-0.6438315428897915), FR2(-0.7651672656224590),
/*N:1024,i:219 */ FR2(-0.8986744656939539), FR2(+0.4386162385385276),
/*N:1024,i:219 */ FR2(+0.2250839113597928), FR2(+0.9743393827855759),
/*N:1024,i:219 */ FR2(-0.6296382389149269), FR2(-0.7768884656732326),
/*N:1024,i:220 */ FR2(-0.9039892931234433), FR2(+0.4275550934302820),
/*N:1024,i:220 */ FR2(+0.2191012401568698), FR2(+0.9757021300385286),
/*N:1024,i:220 */ FR2(-0.6152315905806273), FR2(-0.7883464276266059),
/*N:1024,i:221 */ FR2(-0.9091679830905224), FR2(+0.4164295600976372),
/*N:1024,i:221 */ FR2(+0.2131103199160914), FR2(+0.9770281426577544),
/*N:1024,i:221 */ FR2(-0.6006164793838693), FR2(-0.7995372691079048),
/*N:1024,i:222 */ FR2(-0.9142097557035307), FR2(+0.4052413140049899),
/*N:1024,i:222 */ FR2(+0.2071113761922186), FR2(+0.9783173707196277),
/*N:1024,i:222 */ FR2(-0.5857978574564391), FR2(-0.8104571982525947),
/*N:1024,i:223 */ FR2(-0.9191138516900578), FR2(+0.3939920400610482),
/*N:1024,i:223 */ FR2(+0.2011046348420920), FR2(+0.9795697656854405),
/*N:1024,i:223 */ FR2(-0.5707807458869674), FR2(-0.8211025149911047),
/*N:1024,i:224 */ FR2(-0.9238795325112867), FR2(+0.3826834323650899),
/*N:1024,i:224 */ FR2(+0.1950903220161283), FR2(+0.9807852804032304),
/*N:1024,i:224 */ FR2(-0.5555702330196022), FR2(-0.8314696123025452),
/*N:1024,i:225 */ FR2(-0.9285060804732155), FR2(+0.3713171939518377),
/*N:1024,i:225 */ FR2(+0.1890686641498063), FR2(+0.9819638691095552),
/*N:1024,i:225 */ FR2(-0.5401714727298927), FR2(-0.8415549774368986),
/*N:1024,i:226 */ FR2(-0.9329927988347389), FR2(+0.3598950365349883),
/*N:1024,i:226 */ FR2(+0.1830398879551411), FR2(+0.9831054874312163),
/*N:1024,i:226 */ FR2(-0.5245896826784694), FR2(-0.8513551931052649),
/*N:1024,i:227 */ FR2(-0.9373390119125749), FR2(+0.3484186802494348),
/*N:1024,i:227 */ FR2(+0.1770042204121489), FR2(+0.9842100923869290),
/*N:1024,i:227 */ FR2(-0.5088301425431073), FR2(-0.8608669386377671),
/*N:1024,i:228 */ FR2(-0.9415440651830207), FR2(+0.3368898533922203),
/*N:1024,i:228 */ FR2(+0.1709618887603014), FR2(+0.9852776423889412),
/*N:1024,i:228 */ FR2(-0.4928981922297842), FR2(-0.8700869911087114),
/*N:1024,i:229 */ FR2(-0.9456073253805212), FR2(+0.3253102921622633),
/*N:1024,i:229 */ FR2(+0.1649131204899701), FR2(+0.9863080972445987),
/*N:1024,i:229 */ FR2(-0.4767992300633221), FR2(-0.8790122264286334),
/*N:1024,i:230 */ FR2(-0.9495281805930367), FR2(+0.3136817403988914),
/*N:1024,i:230 */ FR2(+0.1588581433338614), FR2(+0.9873014181578584),
/*N:1024,i:230 */ FR2(-0.4605387109582399), FR2(-0.8876396204028541),
/*N:1024,i:231 */ FR2(-0.9533060403541939), FR2(+0.3020059493192280),
/*N:1024,i:231 */ FR2(+0.1527971852584434), FR2(+0.9882575677307495),
/*N:1024,i:231 */ FR2(-0.4441221445704298), FR2(-0.8959662497561849),
/*N:1024,i:232 */ FR2(-0.9569403357322088), FR2(+0.2902846772544624),
/*N:1024,i:232 */ FR2(+0.1467304744553618), FR2(+0.9891765099647810),
/*N:1024,i:232 */ FR2(-0.4275550934302825), FR2(-0.9039892931234431),
/*N:1024,i:233 */ FR2(-0.9604305194155658), FR2(+0.2785196893850532),
/*N:1024,i:233 */ FR2(+0.1406582393328492), FR2(+0.9900582102622971),
/*N:1024,i:233 */ FR2(-0.4108431710579042), FR2(-0.9117060320054298),
/*N:1024,i:234 */ FR2(-0.9637760657954398), FR2(+0.2667127574748985),
/*N:1024,i:234 */ FR2(+0.1345807085071262), FR2(+0.9909026354277800),
/*N:1024,i:234 */ FR2(-0.3939920400610482), FR2(-0.9191138516900577),
/*N:1024,i:235 */ FR2(-0.9669764710448521), FR2(+0.2548656596045147),
/*N:1024,i:235 */ FR2(+0.1284981107937932), FR2(+0.9917097536690995),
/*N:1024,i:235 */ FR2(-0.3770074102164182), FR2(-0.9262102421383114),
/*N:1024,i:236 */ FR2(-0.9700312531945440), FR2(+0.2429801799032641),
/*N:1024,i:236 */ FR2(+0.1224106751992163), FR2(+0.9924795345987100),
/*N:1024,i:236 */ FR2(-0.3598950365349879), FR2(-0.9329927988347390),
/*N:1024,i:237 */ FR2(-0.9729399522055601), FR2(+0.2310581082806713),
/*N:1024,i:237 */ FR2(+0.1163186309119049), FR2(+0.9932119492347945),
/*N:1024,i:237 */ FR2(-0.3426607173119949), FR2(-0.9394592236021897),
/*N:1024,i:238 */ FR2(-0.9757021300385285), FR2(+0.2191012401568701),
/*N:1024,i:238 */ FR2(+0.1102222072938832), FR2(+0.9939069700023561),
/*N:1024,i:238 */ FR2(-0.3253102921622633), FR2(-0.9456073253805212),
/*N:1024,i:239 */ FR2(-0.9783173707196275), FR2(+0.2071113761922188),
/*N:1024,i:239 */ FR2(+0.1041216338720547), FR2(+0.9945645707342554),
/*N:1024,i:239 */ FR2(-0.3078496400415351), FR2(-0.9514350209690083),
/*N:1024,i:240 */ FR2(-0.9807852804032304), FR2(+0.1950903220161286),
/*N:1024,i:240 */ FR2(+0.0980171403295608), FR2(+0.9951847266721968),
/*N:1024,i:240 */ FR2(-0.2902846772544624), FR2(-0.9569403357322088),
/*N:1024,i:241 */ FR2(-0.9831054874312163), FR2(+0.1830398879551409),
/*N:1024,i:241 */ FR2(+0.0919089564971327), FR2(+0.9957674144676598),
/*N:1024,i:241 */ FR2(-0.2726213554499489), FR2(-0.9621214042690416),
/*N:1024,i:242 */ FR2(-0.9852776423889412), FR2(+0.1709618887603012),
/*N:1024,i:242 */ FR2(+0.0857973123444399), FR2(+0.9963126121827780),
/*N:1024,i:242 */ FR2(-0.2548656596045144), FR2(-0.9669764710448522),
/*N:1024,i:243 */ FR2(-0.9873014181578584), FR2(+0.1588581433338615),
/*N:1024,i:243 */ FR2(+0.0796824379714301), FR2(+0.9968202992911657),
/*N:1024,i:243 */ FR2(-0.2370236059943677), FR2(-0.9715038909862517),
/*N:1024,i:244 */ FR2(-0.9891765099647810), FR2(+0.1467304744553618),
/*N:1024,i:244 */ FR2(+0.0735645635996675), FR2(+0.9972904566786902),
/*N:1024,i:244 */ FR2(-0.2191012401568701), FR2(-0.9757021300385285),
/*N:1024,i:245 */ FR2(-0.9909026354277800), FR2(+0.1345807085071263),
/*N:1024,i:245 */ FR2(+0.0674439195636641), FR2(+0.9977230666441916),
/*N:1024,i:245 */ FR2(-0.2011046348420921), FR2(-0.9795697656854405),
/*N:1024,i:246 */ FR2(-0.9924795345987100), FR2(+0.1224106751992164),
/*N:1024,i:246 */ FR2(+0.0613207363022086), FR2(+0.9981181129001492),
/*N:1024,i:246 */ FR2(-0.1830398879551410), FR2(-0.9831054874312163),
/*N:1024,i:247 */ FR2(-0.9939069700023561), FR2(+0.1102222072938832),
/*N:1024,i:247 */ FR2(+0.0551952443496900), FR2(+0.9984755805732948),
/*N:1024,i:247 */ FR2(-0.1649131204899698), FR2(-0.9863080972445987),
/*N:1024,i:248 */ FR2(-0.9951847266721968), FR2(+0.0980171403295608),
/*N:1024,i:248 */ FR2(+0.0490676743274181), FR2(+0.9987954562051724),
/*N:1024,i:248 */ FR2(-0.1467304744553623), FR2(-0.9891765099647809),
/*N:1024,i:249 */ FR2(-0.9963126121827780), FR2(+0.0857973123444402),
/*N:1024,i:249 */ FR2(+0.0429382569349410), FR2(+0.9990777277526454),
/*N:1024,i:249 */ FR2(-0.1284981107937936), FR2(-0.9917097536690995),
/*N:1024,i:250 */ FR2(-0.9972904566786902), FR2(+0.0735645635996677),
/*N:1024,i:250 */ FR2(+0.0368072229413590), FR2(+0.9993223845883495),
/*N:1024,i:250 */ FR2(-0.1102222072938833), FR2(-0.9939069700023561),
/*N:1024,i:251 */ FR2(-0.9981181129001492), FR2(+0.0613207363022085),
/*N:1024,i:251 */ FR2(+0.0306748031766366), FR2(+0.9995294175010931),
/*N:1024,i:251 */ FR2(-0.0919089564971328), FR2(-0.9957674144676598),
/*N:1024,i:252 */ FR2(-0.9987954562051724), FR2(+0.0490676743274180),
/*N:1024,i:252 */ FR2(+0.0245412285229123), FR2(+0.9996988186962043),
/*N:1024,i:252 */ FR2(-0.0735645635996674), FR2(-0.9972904566786902),
/*N:1024,i:253 */ FR2(-0.9993223845883495), FR2(+0.0368072229413588),
/*N:1024,i:253 */ FR2(+0.0184067299058048), FR2(+0.9998305817958234),
/*N:1024,i:253 */ FR2(-0.0551952443496897), FR2(-0.9984755805732948),
/*N:1024,i:254 */ FR2(-0.9996988186962043), FR2(+0.0245412285229123),
/*N:1024,i:254 */ FR2(+0.0122715382857199), FR2(+0.9999247018391445),
/*N:1024,i:254 */ FR2(-0.0368072229413593), FR2(-0.9993223845883494),
/*N:1024,i:255 */ FR2(-0.9999247018391445), FR2(+0.0122715382857200),
/*N:1024,i:255 */ FR2(+0.0061358846491545), FR2(+0.9999811752826011),
/*N:1024,i:255 */ FR2(-0.0184067299058052), FR2(-0.9998305817958234)
};

#endif /* __FFT_TWIDDLES_H__ */


#define MULT0(a,b)   ((long)(a)*(b))

#define COMPLEX_MUL(a,b,c,d)\
    do{ vcp_extend x,y; x = MULT0(a,c)-MULT0(b,d); y = MULT0(c,b)+MULT0(a,d); a = (x + (1<<14))>>15; b = (y+(1<<14))>>15; }while(0)


#define FROUND 0
#define SHIFT_AMOUNT    

void
fft_radix_42(struct complex_s *data, int size, int scale)
{
    struct complex_s *x = data;
    unsigned int i, ap, N;
    struct complex_s32 x0,x1,x2, t1,t2,t3,t4,t;
    vcp_inter wre,wim;
    vcp_inter *tw1;


    if(scale)
        scale = 2;

    ap = 1024/size;
    N = size;
    tw1 = fft_twiddles_1024;

    do                // over N
    {
        //N >>= 2;
        i = 0;
        do            // over i
        {
                x0.re = x->re;                // x[0]
                x0.im = x->im;
                x += N / 2 * 1;
                x2.re = x->re;                // x[N/2]
                x2.im = x->im;
                x -= N / 4 * 1;

                t1.re = x0.re + x2.re;
                t1.im = x0.im + x2.im;
                t2.re = x0.re - x2.re;
                t2.im = x0.im - x2.im;

                x0.re = x->re;                // x[N/4]
                x0.im = x->im;
                x += N / 2 * 1;
                x2.re = x->re;                // x[3N/4]
                x2.im = x->im;
                x -= 3 * N / 4 * 1;

                t3.re = x0.re + x2.re;
                t3.im = x0.im + x2.im;
                t4.re = x0.re - x2.re;
                t4.im = x0.im - x2.im;

                // update x_{0+i}
                t.re = (t1.re + t3.re + FROUND) >> scale;
                t.im = (t1.im + t3.im + FROUND) >> scale;
                x->re = t.re;
                x->im = t.im;
                x += N / 4 * 1;
                // x_{0+i} updated

                // update x_{N/4+i}
                wre = *tw1++;
                wim = *tw1++;

                t.re = (t1.re - t3.re + FROUND) >> scale;
                t.im = (t1.im - t3.im + FROUND) >> scale;
                
                COMPLEX_MUL(t.re,t.im, wre, wim);
                x->re = t.re;
                x->im = t.im;
                x += N / 4 * 1;
                //  x_{N/4+i} updated

                // update x_{N/2+i}
                wre = *tw1++;
                wim = *tw1++;

                t.re = (t2.re - t4.im + FROUND) >> scale;
                t.im = (t2.im + t4.re + FROUND) >> scale;
                
                COMPLEX_MUL(t.re,t.im, wre, wim);
                x->re = t.re;
                x->im = t.im;
                x += N / 4 * 1;
                // x_{N/2+i} updated

                // update x_{3N/4+i}
                wre = *tw1++;
                wim = *tw1++;

                t.re = (t2.re + t4.im + FROUND) >> scale;
                t.im = (t2.im - t4.re + FROUND) >> scale;
                
                COMPLEX_MUL(t.re,t.im, wre, wim);
                x->re = t.re;
                x->im = t.im;
                x += N / 4 * 1;
                // x_{3N/4+i} updated
                
                x -= N * 1 - 1;
                tw1 += (ap - 1) * 4 + (ap - 1) * 2;

                i++;
                if( (i & (N / 4 * 1 - 1)) == 0)
                {
                    x += 3 * N / 4 * 1;        // next quadruple of input data
                    tw1 -= 256 * 2 * 3;    // length of table * 2 * 3 (len * {sin, cos} * {3 twiddles per butterfly})
                }
        } while (i < size/4);

        x -= size;    // to the beginning                                                        
        ap <<= 2;    // modify stride

        N >>= 2;
    } while (N > 4);


    if ( N == 4 )    // FIXME: N == 4
    {
        for (i = 0; i < size; i+= 4)
        {
            x0.re = x[0].re;
            x0.im = x[0].im;
            x2.re = x[2].re;
            x2.im = x[2].im;

            t1.re = x0.re + x2.re;
            t1.im = x0.im + x2.im;
            t2.re = x0.re - x2.re;
            t2.im = x0.im - x2.im;

            x0.re = x[1].re;
            x0.im = x[1].im;
            x2.re = x[3].re;
            x2.im = x[3].im;

            t3.re = x0.re + x2.re;
            t3.im = x0.im + x2.im;
            t4.re = x0.re - x2.re;
            t4.im = x0.im - x2.im;

            // update x_{0+i}
            t.re = t1.re + t3.re;
            t.im = t1.im + t3.im;
            x[0].re = (t.re+FROUND)>>scale;
            x[0].im = (t.im+FROUND)>>scale;
            // x_{0+i} updated

            // update x_{N/4+i}
            t.re = t1.re - t3.re;
            t.im = t1.im - t3.im;
            x[1].re = (t.re+FROUND)>>scale;
            x[1].im = (t.im+FROUND)>>scale;
            //  x_{N/4+i} updated

            // update x_{N/2}
            t.re = t2.re - t4.im;
            t.im = t2.im + t4.re;
            x[2].re = (t.re+FROUND)>>scale;
            x[2].im = (t.im+FROUND)>>scale;
            // x_{N/2} updated

            // update x_{3N/4+i}
            t.re = t2.re + t4.im;
            t.im = t2.im - t4.re;
            x[3].re = (t.re+FROUND)>>scale;
            x[3].im = (t.im+FROUND)>>scale;
            // x_{3N/4+i} updated
            x += 4;
        }
    }
    else
    {
        if(scale)
            scale = 1;
        // trivial butts at the end
        for (i = 0; i<size; i+= 2)
        {
            x0.re = x[0].re;
            x0.im = x[0].im;
            x1.re = x[1].re;
            x1.im = x[1].im;

            t.re = x0.re + x1.re;
            t.im = x0.im + x1.im;
            x[0].re = t.re>>scale;
            x[0].im = t.im>>scale;

            t.re = x0.re - x1.re;
            t.im = x0.im - x1.im;
            x[1].re = t.re>>scale;
            x[1].im = t.im>>scale;
            x += 2;
        }
    }

    x -= size;

    data_swap(x,size);
}
Ruslan1
еще может интересно будет, насчет целочисленной реализации БПФ посмотрите вот это

Вроде нареканий не было и чистый си, хоть куда лепится sm.gif И очень экономно подходит к используемой памяти, как RAM так и ROM.
Используются 16-битные знаковые числа. Очень удобно напрямую данные с АЦП подсовывать, ну или после нормирования, чтобы максимально использовать все биты.
Zelepuk
Цитата(Ruslan1 @ Mar 18 2011, 19:48) *
еще может интересно будет, насчет целочисленной реализации БПФ посмотрите вот это

Вроде нареканий не было и чистый си, хоть куда лепится sm.gif И очень экономно подходит к используемой памяти, как RAM так и ROM.
Используются 16-битные знаковые числа. Очень удобно напрямую данные с АЦП подсовывать, ну или после нормирования, чтобы максимально использовать все биты.


А вот за это бальшуууууущее спасибо!
MSP430F
Цитата(Ruslan1 @ Mar 18 2011, 20:48) *
еще может интересно будет, насчет целочисленной реализации БПФ посмотрите вот это

Вроде нареканий не было и чистый си, хоть куда лепится sm.gif И очень экономно подходит к используемой памяти, как RAM так и ROM.
Используются 16-битные знаковые числа. Очень удобно напрямую данные с АЦП подсовывать, ну или после нормирования, чтобы максимально использовать все биты.


Скажите, а можно этот код переделать на 4096 точек (там сейчас 1024) ? Ответьте, пожалуйста. Очень надо.
Corner
На ПЛИС БПФ 8192 точки 18 бит знаковое сносно дает около 100 дБ. Для обработки сигналов с большим динамическим диапазоном уже придется использовать большую разрядность.
Zelepuk
Цитата(MSP430F @ Aug 22 2013, 18:14) *
Скажите, а можно этот код переделать на 4096 точек (там сейчас 1024) ? Ответьте, пожалуйста. Очень надо.

конечно можно! За отдельную плату готов предоставить готовую реализацию на 4096 точек cool.gif

P.S. Протестировано на MSP430F47197 в проекте счётчика электроэнергии.
MSP430F
Цитата(Zelepuk @ Aug 23 2013, 11:55) *
конечно можно! За отдельную плату готов предоставить готовую реализацию на 4096 точек cool.gif

P.S. Протестировано на MSP430F47197 в проекте счётчика электроэнергии.


Вопрос такой. Какова точность целочисленного 32-разрядного БПФ (вся арифметика не должна выходить за пределы 32 разрядов) ?
Если у меня данные честные 16-битные и я хочу получить на выходе спектр с диапазоном тоже в 90 дБ, то целочисленных вычислений в 32 разрядов для этого не достаточно, не так ли ?
Zelepuk
Цитата(MSP430F @ Aug 23 2013, 12:52) *
Вопрос такой. Какова точность целочисленного 32-разрядного БПФ (вся арифметика не должна выходить за пределы 32 разрядов) ?
Если у меня данные честные 16-битные и я хочу получить на выходе спектр с диапазоном тоже в 90 дБ, то целочисленных вычислений в 32 разрядов для этого не достаточно, не так ли ?

почему недостатачно? как вы считаете? у меня всё было достатачно точно, единственное что: нужно данные масштабировать в нужных местах.
MSP430F
Цитата(Zelepuk @ Aug 23 2013, 13:02) *
почему недостатачно? как вы считаете? у меня всё было достатачно точно, единственное что: нужно данные масштабировать в нужных местах.


Вот над этим я сейчас и бьюсь. Вот здесь человек пишет:
" Перед автором стояла задача написать преобразование Фурье на 2048 точек при разрядности исходных данных 16 бит. Из-за отсутствия арифметического сопроцессора пришлось делать целочисленное преобразование, что создало некоторые трудности. При разрядности исходных данных 16 бит разрядность коэффициентов должна быть не менее 16, чтобы не происходило потери точности. Их произведение содержит 32 разряда. 2048 точек дают еще 11 дополнительных разрядов, а это значит, что в 32-разрядное процессорное слово промежуточные данные не помещаются. Вычисление каждой “бабочки” ведется с точностью 64 разряда, а результат округляется до 32 разрядов. "

И как же можно тогда все посчитать в 32 разрядах без потери точности ?
Zelepuk
Вообще проще взять и проверить. Код есть. За полчаса можно всё прикинуть. Сгенерить массив 16 битных данных и подставить.
Maverick
Цитата(MSP430F @ Aug 23 2013, 12:16) *


посмотрите это
и это
а также это
и это тоже
и вот это
Corner
Цитата(MSP430F @ Aug 23 2013, 13:16) *
Вот над этим я сейчас и бьюсь. Вот здесь человек пишет:
" Перед автором стояла задача написать преобразование Фурье на 2048 точек при разрядности исходных данных 16 бит. Из-за отсутствия арифметического сопроцессора пришлось делать целочисленное преобразование, что создало некоторые трудности. При разрядности исходных данных 16 бит разрядность коэффициентов должна быть не менее 16, чтобы не происходило потери точности. Их произведение содержит 32 разряда. 2048 точек дают еще 11 дополнительных разрядов, а это значит, что в 32-разрядное процессорное слово промежуточные данные не помещаются. Вычисление каждой “бабочки” ведется с точностью 64 разряда, а результат округляется до 32 разрядов. "

И как же можно тогда все посчитать в 32 разрядах без потери точности ?


С учетом Cortex-M3 можно использовать 32 битное умножение со знаком и 64 бит накопление - SMLAL инструкция. Для signed long long компилер сам подставит.
Вот если нет 64 бит аккумулятора, то можно использовать отдельно знаковое умножение с арифметическим сдвигом на 32 (взятие старшей части от умножения), тогда коэффициенты придется обрезать по модулю (считать за 1), чтобы они не превышали ((64 - Х)/2) бит, где Х - log N по основанию 2, а N - число точек (максимум 16384 точки). Это лишь вопрос к правильной табличке синусов. Уровень шума не вырастет больше чем на 1 дБ. При этом использовать максимальное отрицательное число для выбранного размера нельзя. Например, для 24 бит синус должен лежать в диапазоне от -8388607 до +8388607.
Обрезать результат сильнее нельзя, так как если, к примеру, использовать 16 бит знаковые данные и 16 бит знаковый синус, то динамический диапазон уже ни при каком числе точек не превысит 87 дБ (3 дБ "съедает" формат синусов), даже если результат накапливать в 64 битном аккумуляторе без потерь.
MSP430F
Цитата(Corner @ Aug 23 2013, 22:04) *
С учетом Cortex-M3 можно использовать 32 битное умножение со знаком и 64 бит накопление - SMLAL инструкция. Для signed long long компилер сам подставит.
Вот если нет 64 бит аккумулятора, то можно использовать отдельно знаковое умножение с арифметическим сдвигом на 32 (взятие старшей части от умножения), тогда коэффициенты придется обрезать по модулю (считать за 1), чтобы они не превышали ((64 - Х)/2) бит, где Х - log N по основанию 2, а N - число точек (максимум 16384 точки). Это лишь вопрос к правильной табличке синусов. Уровень шума не вырастет больше чем на 1 дБ. При этом использовать максимальное отрицательное число для выбранного размера нельзя. Например, для 24 бит синус должен лежать в диапазоне от -8388607 до +8388607.
Обрезать результат сильнее нельзя, так как если, к примеру, использовать 16 бит знаковые данные и 16 бит знаковый синус, то динамический диапазон уже ни при каком числе точек не превысит 87 дБ (3 дБ "съедает" формат синусов), даже если результат накапливать в 64 битном аккумуляторе без потерь.


Вот здесь приведена функция расчета БПФ на ассемблере для ARM 9E (AT91SAM9260). Как Вы считаете, можно этот код напрямую использовать для Cortex M3 или нужно переделывать ? Не пинайте сильно, в ассемблере я не силен.
Corner
Цитата(MSP430F @ Aug 26 2013, 16:44) *
Как Вы считаете, можно этот код напрямую использовать для Cortex M3 или нужно переделывать ? Не пинайте сильно, в ассемблере я не силен.


А самому тяжело подсунуть этот код компилятору, сделать вызов ассемблерной функции из main.c без оптимизации и посмотреть, что на это скажет компилятор?
alex_os
Цитата(MSP430F @ Aug 23 2013, 13:16) *
Вот над этим я сейчас и бьюсь. Вот здесь человек пишет:
" Перед автором стояла задача написать преобразование Фурье на 2048 точек при разрядности исходных данных 16 бит. Из-за отсутствия арифметического сопроцессора пришлось делать целочисленное преобразование, что создало некоторые трудности. При разрядности исходных данных 16 бит разрядность коэффициентов должна быть не менее 16, чтобы не происходило потери точности. Их произведение содержит 32 разряда. 2048 точек дают еще 11 дополнительных разрядов, а это значит, что в 32-разрядное процессорное слово промежуточные данные не помещаются. Вычисление каждой “бабочки” ведется с точностью 64 разряда, а результат округляется до 32 разрядов. "

И как же можно тогда все посчитать в 32 разрядах без потери точности ?

Ужас какой cranky.gif ! При 16 бит входных данных сплошной long long.
Вы определитесь для себя что такое "без потери точности". Можно сделать ФФТ с 16ти битными данными и 16ти битными
поворачивающими множителями, можно сделать с 32 битными данными и 16 ти битными поворачивающими множителями,
кажется АRMы умеют делать умножения 16 * 32 бит c сохранением старших 32 бит.
Corner
Цитата(alex_os @ Sep 18 2013, 23:26) *
можно сделать с 32 битными данными и 16 ти битными поворачивающими множителями,
кажется АRMы умеют делать умножения 16 * 32 бит c сохранением старших 32 бит.


16 битные поворачивающие множители не позволяют обрабатывать более чем 16 бит данные. Шум представления знаете-ли.
DASM
Цитата(alex_os @ Sep 18 2013, 23:26) *
Ужас какой cranky.gif ! При 16 бит входных данных сплошной long long.
Вы определитесь для себя что такое "без потери точности". Можно сделать ФФТ с 16ти битными данными и 16ти битными
поворачивающими множителями, можно сделать с 32 битными данными и 16 ти битными поворачивающими множителями,
кажется АRMы умеют делать умножения 16 * 32 бит c сохранением старших 32 бит.

UMULL 32x32 = 64 полных во всех с индексом М армах
Corner
Цитата(DASM @ Sep 19 2013, 19:21) *
UMULL 32x32 = 64 полных во всех с индексом М армах

В M0/M1 такой инструкции нет
DASM
Странно, дока говорит иное.Вы уверены, что это не проблемы компилятора/ассемблера / ключей?
Corner
Цитата(DASM @ Sep 19 2013, 19:34) *
Странно, дока говорит иное.Вы уверены, что это не проблемы компилятора/ассемблера / ключей?


Только умножение 32*32=32 - MULS
DASM
Посмотрю завтра, с телефона неудобно. И что, в эксепшейн валится от такого опкода?
AndrewN
QUOTE (Corner @ Sep 19 2013, 18:36) *
Только умножение 32*32=32 - MULS
Для пробразования размером 4К Х 16 этого хватит с избытком. N = 212 даёт рост 12 бит максимум.
Corner
Цитата(AndrewN @ Sep 19 2013, 21:41) *
Для пробразования размером 4К Х 16 этого хватит с избытком. N = 212 даёт рост 12 бит максимум.


16+16+12=44, как тут в 32 укладываться?
AndrewN
QUOTE (Corner @ Sep 24 2013, 19:30) *
16+16+12=44, как тут в 32 укладываться?
А так и не делается, даже в флоатинг пойнт (24 Х 24 -> 48 но младшие биты округляются до 24. Даже Пентиум - и тот ошибается, потому что внутренне он свои 64 Х 64 -> 128, но потом таки округляет обратно до 64).

Так и тут, 16 Х 16 -> 32, и округляются до 16. Умножения роста не дают, сложение может дать рост в 1 бит на одну фазу БПФ. В итоге 16 + 12 -> 28, укладывается в 32.

Но на самом деле и так поступают довольно редко. Обычно фаза БПФ завершается сдвигом вправо на 1, т.е. масштабированием - с округлением, конечно. Соответственно, результат остаётся тем же Q16.15 что и исходные данные.

Наихудший (в смысле потери точности) метод, это когда вместо масштабирования после бабочек, исходные данные "т..о" сдвигают вправо на число фаз БПФ перед преобразованием (N=256 - на 8, 4096 - на 12...), зато скорость вычислений существенно растёт, так что и так делают.

Конечно, любое умножение делается с округлением, и сложение, если результат масштабируется, тоже. Жизнь несовершенна, но если знать в чём, то жить можно :)

Если есть много времени, то можно данные обрабатывать, например, как Q64.32 =~ плавать в "безошибочном" уютном озере :)
Corner
Цитата(AndrewN @ Sep 25 2013, 00:57) *
А так и не делается, даже в флоатинг пойнт (24 Х 24 -> 48 но младшие биты округляются до 24. Даже Пентиум - и тот ошибается, потому что внутренне он свои 64 Х 64 -> 128, но потом таки округляет обратно до 64).

Так и тут, 16 Х 16 -> 32, и округляются до 16. Умножения роста не дают, сложение может дать рост в 1 бит на одну фазу БПФ. В итоге 16 + 12 -> 28, укладывается в 32.

Но на самом деле и так поступают довольно редко. Обычно фаза БПФ завершается сдвигом вправо на 1, т.е. масштабированием - с округлением, конечно. Соответственно, результат остаётся тем же Q16.15 что и исходные данные.

Наихудший (в смысле потери точности) метод, это когда вместо масштабирования после бабочек, исходные данные "т..о" сдвигают вправо на число фаз БПФ перед преобразованием (N=256 - на 8, 4096 - на 12...), зато скорость вычислений существенно растёт, так что и так делают.

Конечно, любое умножение делается с округлением, и сложение, если результат масштабируется, тоже. Жизнь несовершенна, но если знать в чём, то жить можно sm.gif

Если есть много времени, то можно данные обрабатывать, например, как Q64.32 =~ плавать в "безошибочном" уютном озере sm.gif


Забавно, но я округляю только после того как вырезал нужную полосу. Все биты сохраняю. Только целочисленная математика.
Округление это нелинейная обработка сигнала.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.