Перейти к содержанию
    

Целочисленные алгоритмы ЦОС

Существует рабочий алгоритм(несколько фильтров и БПФ). Код работает на плавучке на обычном десктопе.

Стоит задача портировать алгоритм на процессор с фиксированой точкой.

Отсчёты, над которыми производятся преобразования, поступают в формате 1.15.

Понимаю что тупое преобразование float в int ни к чему хорошему не приведёт.

Тогда стоит вопрос: какие требования к оперрациям нужно предъявить?

 

Коэффиценты фильтров и БПФ должны быть тоже в 1.15?

Как производить умножение, деление, суммирование и вычитание, чтобы избегать переполнений?

 

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

 

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

 

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

 

 

Изменено пользователем Zelepuk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

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

видео

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Познавательное видео.

 

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

Причём код получается не очень читаемый...

 

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

 

Иными словами нужно перевести все float в программе в int (в крайнем случае long).

Какие могут быть общие рекомендации для таких задач? Как обезопасить код от переполнений при переходе на "фиксированую точку"?

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Познавательное видео.

 

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

Причём код получается не очень читаемый...

 

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

 

Иными словами нужно перевести все 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. Там можно указать сколько бить под дробную часть, сколько под целую и много чего еще.

Изменено пользователем alexPec

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Иными словами нужно перевести все float в программе в int (в крайнем случае long).

Какие могут быть общие рекомендации для таких задач? Как обезопасить код от переполнений при переходе на "фиксированую точку"?

 

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

 

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

 

1. float->int:

q_1_15 = (int)(flt * 32767);

код не обезопасить - или насыщение делать, или увеличивать разрядность.

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переполнение по-моему при такой задаче только аналитически оценить. Ну или попроще: сделать модель в матлабе, подать туда реальные даннные, посмотреть значения, умножить их на 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. Что с ним надо сделать чтобы в дальнейшем переполниий избежать.

Иначе гвооря интересуют "трюки целочисленных вычислений на С"

 

На ассемблере у меня реализация БПФ есть для моего проца.

Хлчется вкуритсь "трюки" на С чтобы всё что угодно писать... (КИХ, БИХ фильтрацию...)

Изменено пользователем Zelepuk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А что с обычными числами делают, то и этими. Если вы уверены, что после умножения не будет переполнения - отбрасываете старший бит, если не уверены - наращивать разрядность; если вам не нужна точность 30 бит после умножения - отбрасываете младшие 15 (или округляете). Т.е если не будет переполнения и нужна точность 15 бит - отбрасываете старший и 15 младших бит и получаете результат в таком же формате.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. float->int:

q_1_15 = (int)(flt * 32767);

код не обезопасить - или насыщение делать, или увеличивать разрядность.

 

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

 

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

 

Никак не могу найти вашу реализацию. Может дадите ссылку... интересует именно реализация на Си. Посмотреть принципы хочу... :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хлчется вкуритсь "трюки" на С чтобы всё что угодно писать... (КИХ, БИХ фильтрацию...)

Реализация КИХ-фильтрации на архитектуре 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;
}

 

Конкретно в цифровой фильтрации, исключение переполнений достигается путем масштабирования. Насчет БПФ не знаю.

Изменено пользователем PetrovichKR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Никак не могу найти вашу реализацию. Может дадите ссылку... интересует именно реализация на Си. Посмотреть принципы хочу... :rolleyes:

 

 

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

 

#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);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

еще может интересно будет, насчет целочисленной реализации БПФ посмотрите вот это

 

Вроде нареканий не было и чистый си, хоть куда лепится :) И очень экономно подходит к используемой памяти, как RAM так и ROM.

Используются 16-битные знаковые числа. Очень удобно напрямую данные с АЦП подсовывать, ну или после нормирования, чтобы максимально использовать все биты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

еще может интересно будет, насчет целочисленной реализации БПФ посмотрите вот это

 

Вроде нареканий не было и чистый си, хоть куда лепится :) И очень экономно подходит к используемой памяти, как RAM так и ROM.

Используются 16-битные знаковые числа. Очень удобно напрямую данные с АЦП подсовывать, ну или после нормирования, чтобы максимально использовать все биты.

 

А вот за это бальшуууууущее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

еще может интересно будет, насчет целочисленной реализации БПФ посмотрите вот это

 

Вроде нареканий не было и чистый си, хоть куда лепится :) И очень экономно подходит к используемой памяти, как RAM так и ROM.

Используются 16-битные знаковые числа. Очень удобно напрямую данные с АЦП подсовывать, ну или после нормирования, чтобы максимально использовать все биты.

 

Скажите, а можно этот код переделать на 4096 точек (там сейчас 1024) ? Ответьте, пожалуйста. Очень надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На ПЛИС БПФ 8192 точки 18 бит знаковое сносно дает около 100 дБ. Для обработки сигналов с большим динамическим диапазоном уже придется использовать большую разрядность.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скажите, а можно этот код переделать на 4096 точек (там сейчас 1024) ? Ответьте, пожалуйста. Очень надо.

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

 

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

Изменено пользователем Zelepuk

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...