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

STM32 Проблема выбора МК с АЦП

2 часа назад, haker_fox сказал:

Если Вы знаете таким микроконтроллеры, то приведите, пожалуйста пример.

Общего назначения: PIC32MZ, может и другие умеют, не копался.

https://static.chipdip.ru/lib/013/DOC004013135.pdf

стр 446
REGISTER 28-1: ADCCON1: ADC CONTROL REGISTE
bit 23 FRACT: Fractional Data Output Format bit
1 = Fractional
0 = Integer

Специализированные: dsPIC33, но там вообще навернуто:

FORM<2:0>: Data Output Format bits
011 = Signed Fractional 16-bit (DOUT = 0000 0000 0000 0000 sddd dddd dd00 0000)
010 = Fractional 16-bit (DOUT = 0000 0000 0000 0000 dddd dddd dd00 0000)
001 = Signed Integer 16-bit (DOUT = 0000 0000 0000 0000 ssss sssd dddd dddd)
000 = Integer 16-bit (DOUT = 0000 0000 0000 0000 0000 00dd dddd dddd)
111 = Signed Fractional 32-bit (DOUT = sddd dddd dd00 0000 0000 0000 0000)
110 = Fractional 32-bit (DOUT = dddd dddd dd00 0000 0000 0000 0000 0000)
101 = Signed Integer 32-bit (DOUT = ssss ssss ssss ssss ssss sssd dddd dddd)
100 = Integer 32-bit (DOUT = 0000 0000 0000 0000 0000 00dd dddd dddd)

Данные выдает АЦП, и формат определяется настройками АЦП, а ДМА пересылает все что ей скормят не особо интересуясь что там, шишь бы размерность совпадала.

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


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

16 minutes ago, ppram5 said:

Данные выдает АЦП

К float отношения никто не имеет из перечисленных.

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


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

14 минут назад, jcxz сказал:

И где тут float?

Fractional - дробь
Integer - целое

Есть ведь разница получить например 2354 или 0,458.

В чем хранить 0,458? Вроде как логично, что в float?

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


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

1 час назад, ppram5 сказал:

Fractional - дробь
Integer - целое

И...? что?

1 час назад, ppram5 сказал:

В чем хранить 0,458? Вроде как логично, что в float?

Естественно - в fixed point.  кэп  :unknw:

 

PS: Советую всё-таки почитать литературу на тему: Что такое floating point, что такое fixed point. А то складывается ощущение, что вы сами не понимаете чего вам нужно....

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


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

А вот вопрос, fractional это fixed или float?

В терминологии библиотеки CMSIS-DSP: fixed это Q31. Который кстати в библиотеке определен как typedef int32_t q31_t

Можно и q31 обрабатывать, но на камне с FPU, это как то не правильно. f32 выигрывает, хоть и не так много. 

Скорость сильно зависит от того какие преобразования выполняются. 

Я все таки предполагал, что fractional - float, а не fixed. Хотя могу и ошибаться, я так глубоко не зарывался dsPIC. Ибо какой смысл крутить целочисленную арифметику на FPU, если она прекрасно работает и на основном процессоре.

У Q31 (фиксированная точка) есть ряд недостатков, нужно быть очень аккуратным при выполнении мат операций ибо легко налететь на переполнение и неверный результат. О чем ST честно предупреждает. Более низкая точность чем во float. Данные с АЦП для Q31 тоже приводить нужно в STM32. Хотя надо попробовать левое выравнивание в настройках АЦП - по идее может прокатить.

Вообще у ST есть очень толковое описание на предмет f32 и Q31, не помню, где лежит.

Еще float удобен для отладочного вывода в порт с банальным printf(%f). Q31 на приемной стороне не поймут, как не понимает его и printf (ну разве что как целое).

 

 

 

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


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

27 минут назад, ppram5 сказал:

А вот вопрос, fractional это fixed или float?

ни то ни другое.

27 минут назад, ppram5 сказал:

Можно и q31 обрабатывать, но на камне с FPU, это как то не правильно. f32 выигрывает, хоть и не так много. 

Вы как-нибудь ознакомьтесь в системой команд вашего CPU. Обнаружите в ней целое стадо команд для работы с fixed point. Думаете - зачем разработчики ARM их создали? Дураки такие, раз делали заведомо "неправильное"?

27 минут назад, ppram5 сказал:

Более низкая точность чем во float.

Да ладно?!! :shok: Это на каком основании сделан столь странный вывод?? А ничего, что у float мантисса (которая как раз и определяет точность) = 24 бита, а у fixed-point = аж целых 32? Которая к тому же легко расширяется до 64 бит (что невозможно на float).

27 минут назад, ppram5 сказал:

Еще float удобен для отладочного вывода в порт с банальным printf(%f). Q31 на приемной стороне не поймут, как не понимает его и printf (ну разве что как целое).

"Проблема" надуманная.

PS: Ваяя что-то на float, вы конечно не забыли об обработке всяких спец.значений float? типа: NaN, +inf, -inf, денормализованные числа, ...  Или как обычно забыли?  :wink:

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


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

On 11/30/2022 at 10:24 PM, jcxz said:

а у fixed-point = аж целых 32?

31

On 11/30/2022 at 10:24 PM, jcxz said:

Вы как-нибудь ознакомьтесь в системой команд вашего CPU. Обнаружите в ней целое стадо команд для работы с fixed point. Думаете - зачем разработчики ARM их создали?

Даже AVR умеет умножать фиксированную точку.

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


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

8 минут назад, dimka76 сказал:

31

Ну если так считать, то и у float тогда мантисса = 23 бита.

8 минут назад, dimka76 сказал:

Даже AVR умеет умножать фиксированную точку.

И набор а-ля DSP-инструкций тоже имеет? Правда?  :secret:

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


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

On 11/30/2022 at 10:40 PM, jcxz said:

И набор а-ля DSP-инструкций тоже имеет? Правда?  :secret:

Нет, не имеет.

Только эти

Quote

supporting both signed/unsigned multiplication and fractional format
FMUL - Fractional Multiply Unsigned
FMULS - Fractional Multiply Signed 
FMULSU - Fractional Multiply Signed with Unsigned

 

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


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

У fixed*32 24 мантисса бита и 8 бит под дробную часть и без знака, у float*32 - мантисса  23 и экспонента 8 и один под знак.

И где выше Динамика? И во сколько раз?

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

Вообще обо всем этом очень подробно тут:

https://www.st.com/content/ccc/resource/technical/document/application_note/group0/c1/ee/18/7a/f9/45/45/3b/DM00273990/files/DM00273990.pdf/jcr:content/translations/en.DM00273990.pdf

А вот тут сравнение размерности float и fixed. И о преимуществе применения FPU:

http://microsin.net/programming/arm/stm32-floating-point-unit.html

Дабы не копаться процитирую:

Аппаратные вычисления FPU ускоряют алгоритм множества Жюлиа в 12.5 раз при использовании float, и в 7.2 раза при использовании double. Не требуется никакой модификации кода, FPU активируется опциями компилятора. Также FPU позволяет расширить диапазон точности. Таким образом, STM32 FPU реализует очень быстрые вычисления для чисел float и double, что очень важно для точных систем регулирования, обработки звука, декодирования звука или цифровой фильтрации.

Интересная у нас дискуссия вышла, казалось бы из простого вопроса 🙂

Но еще раз повторюсь - float только при наличии FPU, иначе float станет злом, а fixed будет рулить. А лучше уж оставить uint если это возможно.

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


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

3 часа назад, ppram5 сказал:

У fixed*32 24 мантисса бита и 8 бит под дробную часть и без знака, у float*32 - мантисса  23 и экспонента 8 и один под знак.

Да уж батенька, математику в школе вы явно прогуляли.... :punish:

Советую почитать учебники на тему "что такое мантисса", а не писать глупости. И что такое "точность числа" и чем она определяется.

А до этого объяснять вам что-либо - всё равно что тополю во дворе.... :unknw:

3 часа назад, ppram5 сказал:

Но еще раз повторюсь - float только при наличии FPU, иначе float станет злом, а fixed будет рулить. А лучше уж оставить uint если это возможно.

Причём тут какие-то "Жюлиа", кем бы они ни были? если разговор шёл про:

14 часов назад, ppram5 сказал:

надо опробовать медианный фильтр и экспоненциальное бегущее среднее

Вот в этих самых делах целочисленная часть вашего МК даст значительную фору FPU-части.

Когда разберётесь наконец-то, что такое "мантисса", и чем "fractional" отличается от "float" и перестанете их путать. Когда перестанете искать FPU в DMA-контроллерах :biggrin:  А также когда хотя-бы шапочно ознакомитесь с системой команд вашего МК, и сколько тактов какая операция требует и какие вообще команды в ней имеются, вот тогда и поймёте - почему на целочисленных командах CPU вышеозначенные задачи будут выполняться быстрее, чем на FPU-командах. Даже если FPU уже имеется.

А до этого, ну правда - не в коня корм....  :unknw:

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


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

С АЦП идут 12 бит данных. CPU в STM32 имеет разрядность 32 бита. Мало? GCC поддерживает int64. ИМХО, прежде чем хотеть float, определи для себя, а действительно ли нужна плавающая точка. Вот если бы видел фразу типа "анализ выражений показал необходимость работы с числами размеров в 163 бита", то это был бы повод так заморачиваться. И то, я в таких случаях смотрю, сколько нужно операций с такими большими числами, а то может оказаться достаточным сложить-умножить два BigInt.

3 hours ago, jcxz said:

на целочисленных командах CPU вышеозначенные задачи будут выполняться быстрее, чем на FPU-командах

Вот-вот, особенно когда посмотришь на формулу, перепишешь её в другом виде- и вот, тебе хватает int32.

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


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

В 30.11.2022 в 17:00, ppram5 сказал:

Функция требует входных данных в f32.

Можно перевести int во float следующей функцией:

arm_q31_to_float (const q31_t *pSrc, float32_t *pDst, uint32_t blockSize)

Если не сложно, напишите что получается быстрее и на сколько: arm_q31_to_float + arm_rfft_fast_f32  или  arm_rfft_q15.

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


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

2 часа назад, arhiv6 сказал:

 

Если не сложно, напишите что получается быстрее и на сколько: arm_q31_to_float + arm_rfft_fast_f32  или  arm_rfft_q15.

Как все напишу - обязательно поделюсь результатами и проведу сравнение.

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


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

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

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

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

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

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

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

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

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

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