ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
27 апреля
763646
йцукен (18.06.2017 17:49, просмотров: 2652)
У CM0 нет длинного умножения - куда крестьянину податься? Переношу тут некоторый код с CM3 на CM0, и такой затык: не успевает FIR фильтр, который фильтрует отсчёты 24-битного АЦП. Фильтр, ясное дело, целочисленный, и на CM3 никакой проблемы не было: имея умножение с 64-битным результатом, коэффициенты можно было масштабировать как душе угодно. Компилирую под CM0 - вызывается функция __aeabi_lmul, что естественно, но мне нелюбезно. Хочется обойтись умножением с 32-битным результатом, но тогда коэффициентам фильтра остаётся лишь 8 бит, маловато будет. Созрел дерзкий план: разобрать коэффициенты на старшую и младшую половину, завести 2 32-битных аккумулятора, потом их объединить, типа так int32_t acc_hi = 0; int32_t acc_lo = 0; for ( int j = 0; j < n; j++ ) { acc_lo += x[j]*c_lo[j]; acc_hi += x[j]*c_hi[j]; } int64_t acc = ( (int64_t)acc_hi << 8 ) + acc_lo; Спинным мозгом чую, что должно работать, но не могу сообразить, как избежать переполнения в младшем аккумуляторе. Может, кто-то знает готовое решение? Вроде тема должна быть изъезжена вдоль и поперёк.