ppram5 0 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба 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) Данные выдает АЦП, и формат определяется настройками АЦП, а ДМА пересылает все что ей скормят не особо интересуясь что там, шишь бы размерность совпадала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба 3 минуты назад, ppram5 сказал: стр 446 REGISTER 28-1: ADCCON1: ADC CONTROL REGISTE И где тут float? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба 16 minutes ago, ppram5 said: Данные выдает АЦП К float отношения никто не имеет из перечисленных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ppram5 0 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба 14 минут назад, jcxz сказал: И где тут float? Fractional - дробь Integer - целое Есть ведь разница получить например 2354 или 0,458. В чем хранить 0,458? Вроде как логично, что в float? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба 1 час назад, ppram5 сказал: Fractional - дробь Integer - целое И...? что? 1 час назад, ppram5 сказал: В чем хранить 0,458? Вроде как логично, что в float? Естественно - в fixed point. кэп PS: Советую всё-таки почитать литературу на тему: Что такое floating point, что такое fixed point. А то складывается ощущение, что вы сами не понимаете чего вам нужно.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ppram5 0 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба А вот вопрос, 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 (ну разве что как целое). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба 27 минут назад, ppram5 сказал: А вот вопрос, fractional это fixed или float? ни то ни другое. 27 минут назад, ppram5 сказал: Можно и q31 обрабатывать, но на камне с FPU, это как то не правильно. f32 выигрывает, хоть и не так много. Вы как-нибудь ознакомьтесь в системой команд вашего CPU. Обнаружите в ней целое стадо команд для работы с fixed point. Думаете - зачем разработчики ARM их создали? Дураки такие, раз делали заведомо "неправильное"? 27 минут назад, ppram5 сказал: Более низкая точность чем во float. Да ладно?!! Это на каком основании сделан столь странный вывод?? А ничего, что у float мантисса (которая как раз и определяет точность) = 24 бита, а у fixed-point = аж целых 32? Которая к тому же легко расширяется до 64 бит (что невозможно на float). 27 минут назад, ppram5 сказал: Еще float удобен для отладочного вывода в порт с банальным printf(%f). Q31 на приемной стороне не поймут, как не понимает его и printf (ну разве что как целое). "Проблема" надуманная. PS: Ваяя что-то на float, вы конечно не забыли об обработке всяких спец.значений float? типа: NaN, +inf, -inf, денормализованные числа, ... Или как обычно забыли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба 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 умеет умножать фиксированную точку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба 8 минут назад, dimka76 сказал: 31 Ну если так считать, то и у float тогда мантисса = 23 бита. 8 минут назад, dimka76 сказал: Даже AVR умеет умножать фиксированную точку. И набор а-ля DSP-инструкций тоже имеет? Правда? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 61 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба On 11/30/2022 at 10:40 PM, jcxz said: И набор а-ля DSP-инструкций тоже имеет? Правда? Нет, не имеет. Только эти Quote supporting both signed/unsigned multiplication and fractional format FMUL - Fractional Multiply Unsigned FMULS - Fractional Multiply Signed FMULSU - Fractional Multiply Signed with Unsigned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ppram5 0 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба У 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 если это возможно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 30 ноября, 2022 Опубликовано 30 ноября, 2022 · Жалоба 3 часа назад, ppram5 сказал: У fixed*32 24 мантисса бита и 8 бит под дробную часть и без знака, у float*32 - мантисса 23 и экспонента 8 и один под знак. Да уж батенька, математику в школе вы явно прогуляли.... Советую почитать учебники на тему "что такое мантисса", а не писать глупости. И что такое "точность числа" и чем она определяется. А до этого объяснять вам что-либо - всё равно что тополю во дворе.... 3 часа назад, ppram5 сказал: Но еще раз повторюсь - float только при наличии FPU, иначе float станет злом, а fixed будет рулить. А лучше уж оставить uint если это возможно. Причём тут какие-то "Жюлиа", кем бы они ни были? если разговор шёл про: 14 часов назад, ppram5 сказал: надо опробовать медианный фильтр и экспоненциальное бегущее среднее Вот в этих самых делах целочисленная часть вашего МК даст значительную фору FPU-части. Когда разберётесь наконец-то, что такое "мантисса", и чем "fractional" отличается от "float" и перестанете их путать. Когда перестанете искать FPU в DMA-контроллерах А также когда хотя-бы шапочно ознакомитесь с системой команд вашего МК, и сколько тактов какая операция требует и какие вообще команды в ней имеются, вот тогда и поймёте - почему на целочисленных командах CPU вышеозначенные задачи будут выполняться быстрее, чем на FPU-командах. Даже если FPU уже имеется. А до этого, ну правда - не в коня корм.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 43 1 декабря, 2022 Опубликовано 1 декабря, 2022 · Жалоба С АЦП идут 12 бит данных. CPU в STM32 имеет разрядность 32 бита. Мало? GCC поддерживает int64. ИМХО, прежде чем хотеть float, определи для себя, а действительно ли нужна плавающая точка. Вот если бы видел фразу типа "анализ выражений показал необходимость работы с числами размеров в 163 бита", то это был бы повод так заморачиваться. И то, я в таких случаях смотрю, сколько нужно операций с такими большими числами, а то может оказаться достаточным сложить-умножить два BigInt. 3 hours ago, jcxz said: на целочисленных командах CPU вышеозначенные задачи будут выполняться быстрее, чем на FPU-командах Вот-вот, особенно когда посмотришь на формулу, перепишешь её в другом виде- и вот, тебе хватает int32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 18 1 декабря, 2022 Опубликовано 1 декабря, 2022 · Жалоба В 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ppram5 0 1 декабря, 2022 Опубликовано 1 декабря, 2022 · Жалоба 2 часа назад, arhiv6 сказал: Если не сложно, напишите что получается быстрее и на сколько: arm_q31_to_float + arm_rfft_fast_f32 или arm_rfft_q15. Как все напишу - обязательно поделюсь результатами и проведу сравнение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться