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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Целочисленные алгоритмы ЦОС, надо сформулировать правила
MSP430F
сообщение Aug 23 2013, 08:52
Сообщение #16


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

Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911



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

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


Вопрос такой. Какова точность целочисленного 32-разрядного БПФ (вся арифметика не должна выходить за пределы 32 разрядов) ?
Если у меня данные честные 16-битные и я хочу получить на выходе спектр с диапазоном тоже в 90 дБ, то целочисленных вычислений в 32 разрядов для этого не достаточно, не так ли ?
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Aug 23 2013, 09:02
Сообщение #17


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



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

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

Сообщение отредактировал Zelepuk - Aug 23 2013, 09:03
Go to the top of the page
 
+Quote Post
MSP430F
сообщение Aug 23 2013, 09:16
Сообщение #18


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

Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911



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


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

И как же можно тогда все посчитать в 32 разрядах без потери точности ?
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Aug 23 2013, 09:17
Сообщение #19


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Вообще проще взять и проверить. Код есть. За полчаса можно всё прикинуть. Сгенерить массив 16 битных данных и подставить.


Сообщение отредактировал Zelepuk - Aug 23 2013, 09:23
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 23 2013, 09:35
Сообщение #20


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(MSP430F @ Aug 23 2013, 12:16) *


посмотрите это
и это
а также это
и это тоже
и вот это


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Corner
сообщение Aug 23 2013, 18:04
Сообщение #21


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Цитата(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 битном аккумуляторе без потерь.
Go to the top of the page
 
+Quote Post
MSP430F
сообщение Aug 26 2013, 12:44
Сообщение #22


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

Группа: Участник
Сообщений: 85
Регистрация: 20-05-13
Пользователь №: 76 911



Цитата(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 или нужно переделывать ? Не пинайте сильно, в ассемблере я не силен.
Go to the top of the page
 
+Quote Post
Corner
сообщение Aug 29 2013, 15:02
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



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


А самому тяжело подсунуть этот код компилятору, сделать вызов ассемблерной функции из main.c без оптимизации и посмотреть, что на это скажет компилятор?
Go to the top of the page
 
+Quote Post
alex_os
сообщение Sep 18 2013, 19:26
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030



Цитата(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 бит.


--------------------
ну не художники мы...
Go to the top of the page
 
+Quote Post
Corner
сообщение Sep 19 2013, 15:02
Сообщение #25


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



Цитата(alex_os @ Sep 18 2013, 23:26) *
можно сделать с 32 битными данными и 16 ти битными поворачивающими множителями,
кажется АRMы умеют делать умножения 16 * 32 бит c сохранением старших 32 бит.


16 битные поворачивающие множители не позволяют обрабатывать более чем 16 бит данные. Шум представления знаете-ли.
Go to the top of the page
 
+Quote Post
DASM
сообщение Sep 19 2013, 15:21
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



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

UMULL 32x32 = 64 полных во всех с индексом М армах
Go to the top of the page
 
+Quote Post
Corner
сообщение Sep 19 2013, 15:28
Сообщение #27


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



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

В M0/M1 такой инструкции нет
Go to the top of the page
 
+Quote Post
DASM
сообщение Sep 19 2013, 15:34
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Странно, дока говорит иное.Вы уверены, что это не проблемы компилятора/ассемблера / ключей?
Go to the top of the page
 
+Quote Post
Corner
сообщение Sep 19 2013, 15:36
Сообщение #29


Профессионал
*****

Группа: Участник
Сообщений: 1 072
Регистрация: 11-12-12
Пользователь №: 74 815



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


Только умножение 32*32=32 - MULS


Сообщение отредактировал Corner - Sep 19 2013, 15:39
Go to the top of the page
 
+Quote Post
DASM
сообщение Sep 19 2013, 15:44
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



Посмотрю завтра, с телефона неудобно. И что, в эксепшейн валится от такого опкода?
Go to the top of the page
 
+Quote Post

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

 


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


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