Sverchok 1 13 октября, 2022 Опубликовано 13 октября, 2022 · Жалоба Добрый день, решил использовать в проекте ARM DSP, для работы с комплексными числами. Столкнулся с проблемой, что функция arm_cmplx_mult_real_q31 выдает совсем не верный результат. По документации все просто, а в результате умножения 2-х положительных чисел функция дает 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 13 октября, 2022 Опубликовано 13 октября, 2022 · Жалоба Там исходник простейший... как в нем ваше действие? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 13 октября, 2022 Опубликовано 13 октября, 2022 · Жалоба 13 минут назад, Sverchok сказал: По документации все просто, а в результате умножения 2-х положительных чисел функция дает 0. Приобретите отладочный эмулятор. Тогда все подобные "проблемы" сможете решать самостоятельно за 10 минут. ЗЫ: Впрочем для такого и симулятора достаточно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sverchok 1 13 октября, 2022 Опубликовано 13 октября, 2022 (изменено) · Жалоба 22 минуты назад, GenaSPB сказал: Там исходник простейший. Да я поэтому и не пойму в чем дело. Я вызывают функцию arm_cmplx_mult_real_q31(A, B, C, n), где A - int32_t комплексный вектор длины n*2, в котором идет сначала Re, затем Im. B - int32_t вектор длины n, только Re. C - int32_t выходной вектор длины n*2. Я под отладкой зашел в функцию и убедился, что значения множителей все правильные. Вот кусок кода, который отвечает за умножение *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); *pCmplxDst++ = (__SSAT((q31_t) (((q63_t) *pSrcCmplx++ * in) >> 32), 31) << 1); Меня смущает вот эта часть ((q63_t) *pSrcCmplx++ * in) >> 32), разве при сдвиге в право результат не будет потерян? Изменено 13 октября, 2022 пользователем Sverchok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 13 октября, 2022 Опубликовано 13 октября, 2022 · Жалоба Будут потеряны младшие 32 бита, старшие 32 - останутся. Обратите внимание на q63_t. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sverchok 1 13 октября, 2022 Опубликовано 13 октября, 2022 · Жалоба 1 минуту назад, jcxz сказал: Будут потеряны младшие 32 бита, старшие 32 - останутся. Если умножаю два числа (1024+i0) * 1024 (мой первый отсчет), результат 1024*1024=1048576, то в результате сдвига будет 0, так как находится в первых 32 битах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 13 октября, 2022 Опубликовано 13 октября, 2022 · Жалоба Вроде должно быть очевидно, что входные данные должны быть в Q-формате. Должно быть очевидно вам, раз уж взялись за цифровую обработку. Да и в документации к функциям это наверняка есть. Даже наименования типов говорящие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sverchok 1 13 октября, 2022 Опубликовано 13 октября, 2022 · Жалоба 10 минут назад, jcxz сказал: Вроде должно быть очевидно, что входные данные должны быть в Q-формате. Я тут вас не очень понял. Посмотрел типы данных q31_t это int32_t, q63_t это int64_t. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 13 октября, 2022 Опубликовано 13 октября, 2022 · Жалоба On 10/13/2022 at 3:06 PM, Sverchok said: Я тут вас не очень понял. Посмотрел типы данных q31_t это int32_t, q63_t это int64_t. Нет. Это не просто целые числа, а числа в формате с фиксированной точкой. Эта самая виртуальна десятичная точка стоит между 32-ым и 31-ым битами. Причем 32-ой бит это бит знака. И ваши 1024, это не 1024, а 1024/(2^32). Это такое представление чисел. Изучайте формат с фиксированной точкой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sverchok 1 13 октября, 2022 Опубликовано 13 октября, 2022 · Жалоба Спасибо всем, разобрался. Первый раз с таким столкнулся, думал это обычные целые числа! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 13 октября, 2022 Опубликовано 13 октября, 2022 · Жалоба 6 часов назад, Sverchok сказал: Я тут вас не очень понял. Посмотрел типы данных q31_t это int32_t, q63_t это int64_t. Неужто и в гугле тоже забанили?? 🤔 https://wiki5.ru/wiki/Q_(number_format) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться