Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2020, 14:34

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Затык с CIC-дециматором в C
СообщениеДобавлено: 28 янв 2020, 11:51 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
Доброго времени суток.

Кто может подсказать, если знает, где ошибка. Реализую CIC-дециматор. Сам по себе дециматор работает правильно, проблема возникает с выходным масштабированием сигнала.
Show код фильтра


Секции интеграторов и дифференциаторов работают с 64-битным переменными - с запасом на длинные секции. Проблема в том, что если я выходную переменную сперва насыщаю, а потом масштабирую сдвигом вправо, то выходной сигнал выглядит правильно - так же, как и входной, но прореженный в p->rateFactor раз. Но так неправильно - это сейчас у меня влезает результат в 32 бита, а если в будущем будет не влезать, то будет совсем нехорошо. Но если я сперва сдвигаю 64-битный выход вправо, привожу его к int32 и затем насыщаю - сигнал безвозвратно искажается. Как - показать, к сожалению не могу, нет возможности скрин с осциллографа показать пока. Но суть в том, что сигнал при этом большую часть времени "роняется" в нижнюю планку диапазона чисел (INT32_MIN), и лишь в произвольные промежутки времени некоторые отсчеты сигнала напоминают входные отсчеты. По сути, форма сигнала сохраняется, но становится "рваной".
Думал, что какие-нибудь проблемы с вызываемой компилятором функцией __aeabi_lasr, но отдельно протестировал 64-битный сдвиг на целой куче знаковых и беззнаковых чисел и пришел к выводу, что сдвиг работает правильно.
Прошу помочь, если кто знает, где я ошибаюсь, т.к. бьюсь уже над задачей второй день, уже совсем голова не соображает Будет возможность - покажу сигнал позже. Для справки, компилятор - keil, МК STM32F407.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 28 янв 2020, 14:22 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 309
Откуда: Новочеркасск
Что за функция __SSAT, какая то библиотечная?


Последний раз редактировалось ELEKTROS 28 янв 2020, 14:31, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 28 янв 2020, 14:27 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
ELEKTROS писал(а):
Что за функция __SSAT, какая то библиотечная? Контроллер надо полагать STM32?


Да, я в конце ведь упомянул и компилятор, и контроллер.
__SSAT - интринсик, вызывает соответствующую инструкцию насыщения числа до заданного бита. Думаю, кто имел дело с STM32F4, тот знает, потому и не стал подробно про нее расписывать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 28 янв 2020, 14:36 
Старожил

Зарегистрирован: 24 июн 2011, 14:05
Сообщения: 309
Откуда: Новочеркасск
Смотрю на описание SSAT и там три обязательных параметра вроде, не туда смотрю может. У вас флаг насыщения где то должен устанавливаться наверное?
Так а p->rcnt никогда же нулём не станет, если p->rateFactor неизменный и больше 1.


Последний раз редактировалось ELEKTROS 28 янв 2020, 14:48, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 28 янв 2020, 14:48 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
Да, сама инструкция, согласно Generic User Guide, при наличии аргумента сдвига, сперва сдвигает вправо число, затем ограничивает его по тому разряду, который ей также в качестве второго операнда передан.
Однако, с 64-битным числом такой номер не прокатывает, и вышеописанная неправильно работающая сишная строка компилится в

Show такое


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 28 янв 2020, 14:50 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
ELEKTROS писал(а):
Смотрю на описание SSAT и там три обязательных параметра вроде, не туда смотрю может. У вас флаг насыщения где то должен устанавливаться наверное?


Разве три? У самого интринсика два аргумента всего: входное число и бит, по которому нужно насыщать.
У команды __SSAT третий аргумент - сдвиг входного операнда вправо - необязательный.
Флаг Q должен устанавливаться в PSR, сама инструкция SSAT выставляет флаг Q, если насыщение произошло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 28 янв 2020, 15:45 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 757
Откуда: GMT+6
А если сделать так?
Код:
out[j] = __SSAT(sout >> p->shiftExp, 32);


Не понял, зачем приводить сдвинутый выход к int32.
И почему у Вас разное число полезных бит? Когда работает неправильно, у Вас остается 32 - p->shiftExp бит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 28 янв 2020, 16:07 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
Kelvin писал(а):
А если сделать так?
Код:
out[j] = __SSAT(sout >> p->shiftExp, 32);


Не понял, зачем приводить сдвинутый выход к int32.
И почему у Вас разное число полезных бит? Когда работает неправильно, у Вас остается 32 - p->shiftExp бит.


Так уже делал - не помогает.
Приводил для того, чтобы приведение было явным. Хотя, конечно, можно и без него.
В том и дело, что число полезных бит разное. Под CIC-дециматор в худшем случае должен быть запас в 48 бит (для коэффициента прореживания 16 и длины секций 8). Для текущего варианта - длины секций 4 и коэффициента прореживания 16 - хватает и 32 бит, поэтому неправильный вариант и работает, т.к. число не переваливает за 2^32 степени. Но все-таки надо бы иметь универсальный вариант, а потому нужно сдвигать именно 64-битное число, с чем проблемы и возникают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 28 янв 2020, 16:27 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 757
Откуда: GMT+6
Код:
//out[j] = __SSAT(sout,32) >> p->shiftExp;      //так работает, но это неправильно //эквивалент out[j] = __SSAT(sout >> p->shiftExp, 32 - p->shiftExp);

out[j] = __SSAT(((int32_t)(sout >> p->shiftExp)),32);   //вот так не работает, но именно так и нужно //эквивалент out[j] = (int32_t)(sout >> p->shiftExp);


т.е. во втором случае Вы игнорируете старшие биты, оставшиеся после сдвига.

P.S.
Не знаю, как реализован __SSAT для 64 битных чисел, возможно в этом загвоздка.
Попробуйте реализовать без __SSAT.
Код:
int64_t temp = sout >> p->shiftExp;
if(temp > INT32_MAX) temp = INT32_MAX;
if(temp < INT32_MIN) temp = INT32_MIN;
out[j] = (int32_t) temp;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 28 янв 2020, 16:42 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
В том-то и дело, что пробовал. Он здесь ни при чем, т.к. в других местах - что самое важное, вне алгоритма - он работает.
И вот так

Код:
out[j] = (int32_t)(sout >> p->shiftExp);


Тоже уже пробовал - та же ситуация.
Попробую еще раз, конечно, но с программным контролем переполнения. Может где чего упустил на дурную голову.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 17:48 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 6095
Откуда: Москва
sdv_cyborg писал(а):
И вот так

Код:
out[j] = (int32_t)(sout >> p->shiftExp);


Тоже уже пробовал - та же ситуация.

Ты же писал, что правый сдвиг знакового отрицательного 64 битного числа работает? А из этого следует, что не работает. И проблема очевидно именно в сдвиге.

Вообще говоря результат такого сдвига для отрицательного знакового числа в стандарте С не определен, и зависит от компилятора. Ты уверен, что компилятор понимает, что ты от него хочешь? Наглое масштабирование знаковых чисел сдвигами не всегда прокатывает.

Ну а в первом случае ты загнал в 32-битную функцию 64-битное значение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 17:55 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
Вот у меня тоже были подозрения на компилятор. Но я отдельно написал тестовые процедуры сдвига и 44-битных переменных и убедился на разных значениях, что сдвиг происходит правильно.
А про первый случай я и говорю, что это неправильно. И будет работать лишь покуда результат работы секций не преаышает 32-битное число. Пока как бы работает, но меня не устраивает такой костыль.

Вернусь к этой задаче - попробую заменить сдвиг на явное умножение на предпросчитанную константу 1/(2^RateFactor)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 18:01 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 6095
Откуда: Москва
Ну вообще-то сразу надо было попробовать использовать арифметику там, где собственно и предполагается арифметика. И потом уже можно выпендриваться с логическими операциями, тем более что там до хрена разночтений. :))

Интереса ради надо посмотреть, что именно там скомпилировалось в результате. Можно, блин, удивиться.

Ну и совсем в качестве развлечения можно подергать опции оптимизатора.

Я к сожалению не могу сказать ничего детальнее, с кейловским компилятором последний раз имел дело года три-четыре назад. Ничего уже не помню.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 18:10 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
Компилятор родил вызов функции __llasr, вне зависимости от оптимизации.
Да и чего такого в сдвиге - если деление производится только на степени двойки, то оно без труда заменяется сдвигами, нормальная практика в 16-битной и 32-битной арифметике с фиксированной точкой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 18:20 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 6095
Откуда: Москва
Это нормальная практика с беззнаковыми целыми числами. А если знаковые - сначала надо изучать компилятор, потому что в C этой возможности нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 18:46 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
Так... Кажется, я понял. Не генерится sign extent, скорее всего, который при последовательных сишных командах умножения и сдвига на ARM'ах аппаратно встроен в инструкции MUL и MLA. Нало подумать над этим, когда вернусь к этой задаче - проведу опыты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 18:57 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 6095
Откуда: Москва
А на арифметике-то алгоритм работает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 18:58 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 377
sdv_cyborg, у тебя не правильный подход к написанию и отладке таких вещей. Писать и отлаживать надо не на МК, а на обычном компе. Различные интринсики можно заменить, просто реализовав их как функцию с нужной функциональностью. И данные легко генерить и проверять легко, что получается на выходе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 19:06 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 6095
Откуда: Москва
Тут ты не совсем прав. Даже при высокоуровневом моделировании и симуляции очень часто используется HIL, а иногда без него вообще нельзя. Это при том, что в этот момент и до кода-то часто не доходит, а отрабатываются сами алгоритмы.

А совет умножить количество компиляторов - ну так себе, честно говоря. Если тулчейн нормально сделан и настроен, то лучше этого избегать. Впрочем, иногда и так можно. Другое дело что организовать нормальный HIL иногда довольно сложно. Но лучше все-таки это сделать.

Вот в чем киборг был точно неправ - начал сразу писать оптимизированный код. Обычно сначала отлаживают функциональность, а потом уже, при необходимости, прибегают к оптимизации. А то можно кучу времени убить впустую.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 19:09 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
akatenev писал(а):
А на арифметике-то алгоритм работает?

Конечно работает, на Cortex-M4 без проблем. Уже далеко не один проект сделан на таких операциях. И ведь первый вариант тоже работает - который неправильный. Собственно говоря, просто старшие 32 бита отбрасываются, но как я уже сказал, для 16-битных чисел и длины секций не более 4-х это нормально. Но естественно само по себе это неправильно, оставлять такой баг. Тем не менее, спасибо за правильно указанное направление, буду копать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 19:11 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
akatenev писал(а):
Вот в чем киборг был точно неправ - начал сразу писать оптимизированный код. Обычно сначала отлаживают функциональность, а потом уже, при необходимости, прибегают к оптимизации. А то можно кучу времени убить впустую.


Неоптимизированный код у меня уже был давно, заброшен на какое-то время, пока задача опять не всплыла. Стал оптимизировать - наткнулся на проблему.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 19:19 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 6095
Откуда: Москва
sdv_cyborg писал(а):
akatenev писал(а):
А на арифметике-то алгоритм работает?

Уже далеко не один проект сделан на таких операциях. .

Да вот не факт, что на таких. У тебя даже в этом кусочке два разных сдвига. Один работает, другой нет. Отличаются только разрядностью.

Так что вполне возможно, что раньше просто не было правого сдвига отрицательных 64-битных целых. Нечастая вообще-то операция.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 19:24 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 6095
Откуда: Москва
sdv_cyborg писал(а):
Неоптимизированный код у меня уже был давно, заброшен на какое-то время, пока задача опять не всплыла. Стал оптимизировать - наткнулся на проблему.


Ну тогда эта тем не "затык с дециматором", а "затык с оптимизацией масштабирования длинного знакового целого". :))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 19:35 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 505
akatenev писал(а):
sdv_cyborg писал(а):
Неоптимизированный код у меня уже был давно, заброшен на какое-то время, пока задача опять не всплыла. Стал оптимизировать - наткнулся на проблему.


Ну тогда эта тем не "затык с дециматором", а "затык с оптимизацией масштабирования длинного знакового целого". :))

Ну собственно говоря, я с этим и согласился. Буду исследовать на предмет того, что происходит со знаком. Судя по всему, но происходит sign extent.

А раньше уже такие операции были. Но в купе с умножением двух 32-битных чисел с фиксированной точкой, с последующим свигом.
Вот такое выходит, например
Show


При умножении двух чисел формата Q8.24. Сдвиг выполняется, как видно.
Видимо, встроенная функция __llasr, действительно со знаковыми 64-битными числами не может иметь дела, и как следствие, сдвиг получается не арифметический. И в отсутствии операции SMULL компилятор не понял контекста и плюнул на sign extension. Собственно, теперь и буду копать в эту сторону, спасибо за верно указанное направление.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Затык с CIC-дециматором в C
СообщениеДобавлено: 24 фев 2020, 19:52 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 6095
Откуда: Москва
Попробуй еще вот что - поиграться с опциями FPU компилятора. Как ни странно, но это может влиять на __llasr.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB